|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 5376 (0x1500) Types: TextFile Names: »exttridql«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦58ca399f1⟧ »extbib« └─⟦this⟧
tridql=algol list.yes index.no external procedure tridql3(n,a,x); value n; integer n; array a,x; comment The procedure diagonalizes a symmetric matrix of order n. The lower triangular part of this is stored in the array x(1:n,1:n). The eigenvalues in ascending order are formed in a(1:n), and the orthonormal transformation matrix u ( a = u c utr ) is overwritting c in the array x. First part of the procedure is a Householder tridiagonali- zation (Num. Math. 11,181-195(1968)); begin integer i,j,k,l,m; boolean sorter; real f,g,h,p,q,c,s,t,tol; integer array pm(1:n); array b(1:n); for i:=1 step 1 until n do begin pm(i):= i; b(i):= x(i,i); for j:=i+1 step 1 until n do x(i,j):= x(j,i) end; k:= 1; m:= n-1; sorter:= false; for i:=2 step 1 until m do begin g:= 0; l:= i; for j:=i step 1 until n do if g<abs x(k,pm(j)) then begin g:= abs x(k,pm(j)); l:= j end; k:= pm(l); for j:=l-1 step -1 until i do pm(j+1):= pm(j); pm(i):= k; sorter:= sorter or k<>i end; if sorter then begin for i:=1 step 1 until n do begin k:= pm(i); x(i,i):= b(k); for j:=i+1 step 1 until n do begin l:= pm(j); x(j,i):= if k<l then x(k,l) else x(l,k) end end end; tol:= 0.0 shift 35 add (-2012 extract 12); for i:=n step -1 until 2 do begin l:= i-1; f:= x(i,l); g:= f*f; s:= 0; for j:=i-2 step -1 until 1 do s:= x(i,j)*x(i,j)+s; if s>tol then begin s:= s+g; g:= sqrt(s); g:= b(l):= if f>0 then -g else g; a(i):= h:= -g*f+s; x(i,l):= f-g; f:= 0; for j:=1 step 1 until l do begin s:= 0; for k:=1 step 1 until j do s:= x(j,k)*x(i,k)+s; for k:=j+1 step 1 until l do s:= x(k,j)*x(i,k)+s; a(j):= s:= s/h; f:= x(i,j)*s+f; end j; s:= f/(h+h); for j:=1 step 1 until l do begin f:= x(i,j); a(j):= g:= a(j)-s*f; for k:=1 step 1 until j do x(j,k):= -a(k)*f-x(i,k)*g+x(j,k) end j; end s>tol else begin b(l):= f; a(i):= 0 end end i; a(1):= b(n):= 0; comment accumulation of transformation matrices; for i:=1 step 1 until n do begin l:= i-1; h:= a(i); if h<>0 then begin for j:=1 step 1 until l do begin s:= 0; for k:=1 step 1 until l do s:= x(i,k)*x(j,k)+s; s:= s/h; for k:=1 step 1 until l do x(j,k):= -x(i,k)*s+x(j,k) end j end; a(i):= x(i,i); x(i,i):= 1; for j:=1 step 1 until l do x(i,j):= x(j,i):= 0 end i; comment Now we find the eigenvalues and eigenvectors of the tri- diagonal matrix given with its diagonal elements in the array a(1:n) and its subdiagonal elements in the first n-1 stores of the array b(1:n), using QL transformations. The eigenvalues are overwritten in the array a in ascen- ding order. The eigenvectors are formed in x(1:n,1:n), overwritting the accumulated transformations supplied by the tridiagonalization (Num. Math. 15, 450 (1970)); tol:= 0.0 shift 35 add (-34 extract 12); for l:=1 step 1 until n do begin j:= 0; comment look for small sub-diagonal elements; nextit: m:= l-1; for m:=m+1 while m<n and abs b(m)>(abs a(m)+abs a(m+1))*tol do; if m=l then goto root; if j=30 then goto fail; j:= j+1; q:= a(l); comment form shift; g:= (a(l+1)-q)/(2*b(l)); f:= sqrt(g*g+1); q:= a(m)-q+b(l)/(if g<0 then g-f else g+f); comment QL transformation; s:= 1; f:= c:= t:= 0; for i:= m-1 step -1 until l do begin g:= b(i); if c=0 then begin p:= g*s; h:= -t*p+g end else begin h:= g*c; p:= -t*h+g end; if abs p<=abs q then begin c:= p/q; p:= sqrt(c*c+1); b(i+1):= p*q; s:= c/p; t:= c/(1+p); c:= 0; g:= a(i+1)-f; q:= a(i)-g; p:= h+h; f:= ((-t*p+q)*s+p)*s; a(i+1):= g+f; q:= ((-q*t-p)*s+q)*s+h; for k:=1 step 1 until n do begin g:= x(i,k); p:= x(i+1,k); x(i ,k):= -(g*t+p)*s+g; x(i+1,k):= -(p*t-g)*s+p end end else begin c:= q/p; q:= sqrt(c*c+1); b(i+1):= p*q; t:= c/(1+q); c:= c/q; g:= a(i+1)-f; q:= a(i)-g; p:= h+h; f:= ((-t*p-q)*c+p)*c; a(i+1):= a(i)+f; f:= f+q; q:= ((-t*q+p)*c+q)*c-h; for k:=1 step 1 until n do begin g:= x(i,k); p:= x(i+1,k); x(i ,k):= (p*t+g)*c-p; x(i+1,k):= -(g*t-p)*c+g end k end end i; b(l):= q; a(l):= a(l)-f; b(m):= 0; goto nextit; root: end l; comment order eigenvalues and eigenvectors; for i:=1 step 1 until n do begin k:= i; p:= a(i); for j:=i+1 step 1 until n do if a(j)<p then begin k:= j; p:= a(j) end; if k<>i then begin a(k):= a(i); a(i):= p; for j:=1 step 1 until n do begin p:= x(i,j); x(i,j):= x(k,j); x(k,j):= p end j end end; if sorter then begin for i:=1 step 1 until n do begin for j:=2 step 1 until n do b(pm(j)):= x(i,j); for j:=2 step 1 until n do x(i,j):= b(j) end end; fail: end; end ▶EOF◀