ADDED mttroot/mtt/bin/trans/p/mtt_solve.p Index: mttroot/mtt/bin/trans/p/mtt_solve.p ================================================================== --- /dev/null +++ mttroot/mtt/bin/trans/p/mtt_solve.p @@ -0,0 +1,47 @@ +PROCEDURE mtt_solve(VAR x : StateVector; + VAR A : StateMatrix; + VAR B : StateVector; + n : integer; + Small : real); + +{ + +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % Version control history +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % $Id$ +% % $Log$ +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + } + +VAR + i : integer; + wmax,wmin : real; + w : StateVector ; + v : StateMatrix; + +(*$I svdcmp.p *) +(*$I svbksb.p *) + +BEGIN{mtt_solve} +(* decompose matrix A using SVD *) + svdcmp(A,n,n,w,v); + +(* find maximum singular value *) + wmax := 0.0; + FOR i := 1 to n DO BEGIN + IF (w[i] > wmax) THEN wmax := w[i] + END; + +(* define "small" *) + wmin := wmax*Small; + +(* zero the "small" singular values *) + FOR i := 1 to n DO BEGIN + IF (w[i] < wmin) THEN w[i] := 0.0 + END; + +(* backsubstitute for B *) + svbksb(A,w,v,n,n,B,x); + +END{mtt_solve};