|
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: 3840 (0xf00) Types: TextFile Names: »extbanddiag«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦58ca399f1⟧ »extbib« └─⟦this⟧
\f external procedure banddiag(Nt,n,m1,m2,ev,H,U); value Nt,n,m1,m2; integer Nt,n,m1,m2; array ev,H,U; begin integer i,j,k,jk,m,r,N1,N2,maxr,maxk,ugk; real g,p,c,s,c2,s2,cs,u0,u1,lambda,norm; array b(1:Nt,0:n), ta,tb(1:Nt); N1:= Nt-1; N2:=Nt-2; comment Tridiagonalization by method of R.H.Schwartz, Numer. Math. 12, 231 (1968). n is the number of bidiagonals; for i:=1 step 1 until Nt do begin k:= if n<Nt-i then n else Nt-i; for j:=0 step 1 until k do b(i,j):= H(i+j,j) end; for j:=1 step 1 until N2 do begin maxr:= if Nt-j<n then Nt-j else n; for r:=maxr step -1 until 2 do begin for i:=j+r step n until Nt do begin if i=j+r then begin if b(j,r)=0 then goto endr; p:=-b(j,r-1)/b(j,r); ugk:= j; end else begin if g=0 then goto endr; p:=-b(i-n-1,n)/g; ugk:= i-n; end; s2:= 1/(1+p*p); s:= sqrt(s2); c:= p*s; c2:= c*c; cs:= c*s; u0:= b(i-1,0)*c2-b(i-1,1)*2*cs+b(i,0)*s2; u1:= b(i-1,0)*s2+b(i-1,1)*2*cs+b(i,0)*c2; b(i-1,1):= (b(i-1,0)-b(i,0))*cs+b(i-1,1)*(c2-s2); b(i-1,0):= u0; b(i,0):= u1; for k:=ugk step 1 until i-2 do begin u0 := b(k,i-k-1)*c-b(k,i-k)*s; b(k,i-k):= b(k,i-k-1)*s+b(k,i-k)*c; b(k,i-k-1):= u0; end k; if i<>j+r then b(i-n-1,n):= b(i-n-1,n)*c-g*s; maxk:= if Nt-i<n-1 then Nt-i else n-1; for k:=1 step 1 until maxk do begin u0 := b(i-1,k+1)*c-b(i,k)*s; b(i,k):= b(i-1,k+1)*s+b(i,k)*c; b(i-1,k+1):= u0; end k; if i+n<=Nt then begin g:= -b(i,n)*s; b(i,n):= b(i,n)*c; end; end i; endr: end r; end j; b(Nt,1):= 0; for i:=Nt step -1 until 1 do begin p:= abs b(i,0) + abs b(i,1); ta(i):= b(i,0); if i>1 then tb(i):= b(i-1,1)**2; if p>g then g:= p end; c:= -g; for i:=m1 step 1 until m2 do ev(i):= g; for m:=m1 step 1 until m2 do begin g:= ev(m); for lambda:= (g+c)/2 while g<>lambda do begin s:= 0; u1:= 0; u0:= 1; for i:=1 step 1 until Nt do begin p:= (ta(i)-lambda)*u0 - tb(i)*u1; u1:= u0; u0:= p; if u1>=0 == u0<0 then s:= s+1; if s=m2 then i:=Nt end i; if s>=m then begin g:= lambda; for i:=m+1 step 1 until s do begin if lambda<ev(i) then ev(i):= lambda end end else c:= lambda end lambda; ev(m):= lambda; begin array a(1:(n+1)*n//2), V(-n:Nt+n); b(1,0):= H(1,0)-lambda; p:= abs b(1,0); s:= 1; for i:=2 step 1 until Nt do begin b(i,0):= H(i,0)-lambda; u0:= abs b(i,0); if p>u0 then begin p:= u0; s:= i end end; for i:=1 step 1 until Nt do for j:=1 step 1 until n do b(i,j):= H(i,j); for i:=Nt+n step -1 until -n do V(i):= 0; for j:=n step -1 until 1 do begin if s-j >0 then V(s-j):= -b(s,j); if s+j<=Nt then V(s+j-1):= -b(s+j,j) end; for i:=s+1 step 1 until Nt do for j:=0 step 1 until n do b(i-1,j):= b(i,j); for i:= if s+n>Nt then N1-s else n-1 step -1 until 0 do begin for j:=i+2 step 1 until n do b(s+i,j-1):= b(s+i,j); b(s+i,n):= 0 end; for i:=1 step 1 until N1 do begin jk:= if i>n then n else i-1; for k:=1 step 1 until jk do a(k):= b(i,k)/b(i-k,0); for j:= if i+n>=Nt then N1-i else n step -1 until 0 do b(i+j,j):= b(i+j,j)-sum(a(k)*b(i+j,j+k),k,1,n-j); V(i):= (V(i)-sum(b(i,i-k)*V(k),k,i-jk,i-1))/b(i,0); for k:=1 step 1 until jk do b(i,k):= a(k) end i; norm:= 1; for i:=N1 step -1 until 1 do begin p:= V(i):= V(i)-sum(b(i+k,k)*V(i+k), k,1,if i+n>=Nt then N1-i else n); norm:= norm+p*p end; norm:= U(m,s):= 1/sqrt(norm); for i:= N1 step -1 until s do U(m,i+1):= V(i)*norm; for i:=s-1 step -1 until 1 do U(m,i):= V(i)*norm end b,V end m end; end ▶EOF◀