home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
TURBOPAS
/
MAPSTATF.LBR
/
EIGEN.LZB
/
EIGEN.ÌIB
Wrap
Text File
|
2000-06-30
|
2KB
|
60 lines
Procedure eigen(Var a, v:NBYN; Var e:RVEC; t: Real;
Var dv, nf, ot:Integer);
(* eigenvalues and vectors by iteration and exhaustion - a is input
matrix of dimension dv, nf the number of vectors to extract, e is
returned eigenvalues and v is eigenvectors - if ip=1 below then matrix
is squared to refine iteration, eigenvalues only are then returned *)
Var
x,y:RVEC;
j,k,l,it,ip:Integer;
s1,s2:Real;
Procedure MatSQ(Var b, a:NBYN; n:SUBS);
var
i,j,k: SUBS;
sigma: Real;
begin
for i:=1 to n do
for j:=1 to n do begin
b[i,j]:=0.0; for k:=1 to n do b[i,j]:=b[i,j]+a[i,k]*a[j,k]; end;
a:=b;
end; { of MatSQ }
Begin
ip:=1; { set to zero if eigenvectors are reqd or to avoid powering }
l:=1;
If(ip=1) Then MatSQ(v,a,dv);
While (dv>=l) and (nf>=l) Do
Begin
it:=0; s1:=1.0;
For j:=1 To dv Do y[j]:=1.0;
While (s1>t) Do Begin it:=it+1;
For j:=1 To dv Do Begin
x[j]:=0.0; For k:=1 To dv Do x[j]:=x[j]+(a[j,k]*y[k]); End;
e[l]:=x[1]; s1:=0.0;
For j:=1 To dv Do Begin
v[j,l]:=x[j]/x[1]; s1:=s1+(Abs(y[j]-v[j,l])); y[j]:=v[j,l]; End;
If (it=25) and (s1>=s2) Then Begin Writeln;
Writeln('*** Roots Not Converging in Eigen - Error Abort ***');
Bdos(0); End;
s2:=s1;
End;
s1:=0.0;
For j:=1 To dv Do s1:=s1+Sqr(v[j,l]);
s1:=Sqrt(s1);
For j:=1 To dv Do v[j,l]:=v[j,l]/s1;
For j:=1 To dv Do
For k:=1 To dv Do a[j,k]:=a[j,k]-(v[j,l]*v[k,l]*e[l]);
If(l>1) And (e[l-1]-e[l]<=t) And (l<nf) Then
Begin Writeln; nf:=l;
Writeln('** Number of Eigenvalues Extracted Limited to ',nf:2,' **');
Writeln('** Variance Explained by Factor too small For Accuracy **');
wait(ot);
End;
If(ip=1) Then e[l]:=Sqrt(e[l]);
Writeln('Eigenvalue ',l,' =',e[l],' obtained in ',it,' iterations');
l:=l+1;
End;
End; (* of eigen *)
For j:=1 To dv Do Begin
x[j]:=0.0; For k:=1 To dv Do x[j]:=x[j]+(a[j,k]*y[k]);