子程序invit(nm,n,a,wr,wi,select,mm,m,z,ierr,rm1,rv1,rv2)c(c)整数i,j,k,l,m,n,s,ii,ip,mm,mp,nm,ns,n1,uk,ip1,its,km1,ierr双精度a(nm,n),wr(n),wi(n”),z(nm,mm),rm1(n,n),x rv1(n),rv2(n)双精度t,w,x,y,eps3,norm,normv,epslon,growto,ilambd,x pythag、rlambd、ukroot逻辑选择(n)c(c)c此子程序是algol程序invit的翻译彼得斯和威尔金森。c汽车手册。比较。,第i卷——线性代数,418-439(1971)。c(c)c这个子程序找到一个真实上界的特征向量c与指定特征值对应的hessenberg矩阵,c使用逆迭代。c(c)输入上的cc(c)c nm必须设置为二维的行维度调用程序中声明的c数组参数c维语句。c(c)cn是矩阵的阶数。c(c)ca包含hessenberg矩阵。c(c)c-wr和wi分别包含实部和虚部,矩阵特征值的c。特征值必须是c以与子程序hqr相同的方式存储,识别矩阵可能的分裂。c(c)c选择指定要找到的特征向量。这个对应于j-th特征值的c特征向量为通过将select(j)设置为true来指定c。。c(c)c mm应设置为存储要找到的特征向量所需的c列。注意,需要两列来存储c特征向量对应于复特征值。c(c)输出上的cc(c)ca和wi不变。c(c)由于近特征值受到扰动,cwr可能已经改变c在搜索独立特征向量时略感兴趣。c(c)c选择可能已更改。如果元素对应c到一对共轭复特征值分别为c最初设置为.true。,程序重置第二个将这两个元素转换为.false。。c(c)c m是实际用于存储的列数c特征向量。c(c)cz包含特征向量的实部和虚部。c如果下一个选定的特征值为实,则下一列z的c包含其特征向量。如果特征值为c复数,z的下两列包含实数和c其特征向量的虚部。特征向量是c归一化,使最大量级的分量为1。c未通过验收测试的任何矢量都设置为零。c(c)c ierr设置为c零表示正常返回,c-(2*n+1),如果需要大于mm的z列c存储对应于c指定的特征值。c-k,如果迭代对应于第k个c值失败,c-(n+k),如果两种错误情况都发生。c(c)c rm1、rv1和rv2是临时存储阵列。注意rm1c是尺寸n乘以n和的平方,由两列增加z的c是对应的algol b数组的转置。c(c)c algol程序guessvec出现在invit中。c(c)c调用cdiv进行复杂除法。c为dsqrt(a*a+b*b)调用pythag。c(c)c问题和意见应提交给伯顿·s·加博,c阿贡国家实验室数学与计算机科学部c(c)c本版本日期为1983年8月。c(c)c(c)------------------------------------------------------------------c(c)ierr=0英国=0s=1c。。。。。。。。。。ip=0,实特征值c1,共轭复数对的第一个c-1,共轭复数对的第二个。。。。。。。。。。ip=0n1=n-1c(c)do 980 k=1,n如果(wi(k).等于0.0d0.或。ip.lt.0)转到100ip=1if(选择(k)和。选择(k+1))选择(k+1=.false。100如果(不选择(k))转到960如果(wi(k).ne.0.0d0)s=s+1如果(s.gt.mm)转到1000如果(英国通用电气公司)转到200c。。。。。。。。。。检查可能的分裂。。。。。。。。。。do 120 uk=k,n如果(英国等式n)转到140如果(a(uk+1,uk).eq.0d0)转到140120继续c。。。。。。。。。。由uk导出uk的无穷范数的计算c(hessenberg)矩阵。。。。。。。。。。140标准=0.0d0mp=1c(c)do 180 i=1,英国x=0.0d0c(c)do 160 j=mp,英国160 x=x+dabs(a(i,j))c(c)if(x.gt.norm)范数=xmp=i180继续c。。。。。。。。。。eps3取代了分解中的零枢轴c和闭合根由eps3修改。。。。。。。。。。如果(范数等于0.0d0)范数=1.0d0eps3=epslon(标准)c。。。。。。。。。。growto是生长的标准。。。。。。。。。。ukroot=英国ukroot=dsqrt(ukroot)growto=0.1d0/ukroot200 rlambd=wr(k)ilambd=wi(k)如果(k等式1)转至280km1=k-1转到240c。。。。。。。。。。扰动特征值(如果接近)c到任何之前的特征值。。。。。。。。。。220 rlambd=rlambd+eps3c。。。。。。。。。。对于i=k-1步骤-1,直到1 do--。。。。。。。。。。240 do 260 ii=1,km1i=k-iiif(选择(i)和。dabs(wr(i)-rlambd)、lt.eps3和。x dabs(wi(i)-ilambd).lt.eps3)转到220260继续c(c)wr(k)=rlambdc。。。。。。。。。。扰动共轭特征值以匹配。。。。。。。。。。ip1=k+ipwr(ip1)=rlambdc。。。。。。。。。。形式上hessenberg a-rlambd*i(转置)c和初始实向量。。。。。。。。。。280英里=1c(c)do 320 i=1,英国c(c)do 300 j=mp,英国300 rm1(j,i)=a(i,j)c(c)rm1(i,i)=rm1(i,i)-rlambdmp=irv1(i)=eps3320继续c(c)its=0如果(ilambd.ne.0.0d0)转至520c。。。。。。。。。。实际特征值。c带有立交的三角形分解,c用eps3替换零枢轴。。。。。。。。。。如果(英国等式1)转到420c(c)do 400 i=2,英国mp=i-1如果(dabs(rm1(mp,i)).le。dabs(rm1(mp,mp))转到360c(c)do 340 j=mp,英国y=rm1(j,i)rm1(j,i)=rm1(j,mp)rm1(j,mp)=y340续c(c)360如果(rm1(mp,mp).等式0.0d0)rm1(mp,mp)=eps3x=rm1(mp,i)/rm1(mp,mp)如果(x等于0.0d0),则转到400c(c)do 380 j=i,英国380 rm1(j,i)=rm1(i,j)-x*rm1(j,mp)c(c)400(续)c(c)420如果(rm1(uk,uk).等式0.0d0)rm1(英国,ukc。。。。。。。。。。实向量的后代换c对于i=uk步骤-1,直到1 do--。。。。。。。。。。440 do 500 ii=1,英国i=英国+1-iiy=rv1(i)如果(i.eq.uk)转到480ip1=i+1c(c)do 460 j=ip1,英国460 y=y-rm1(j,i)*rv1(j)c(c)480 rv1(i)=y/rm1(i,i)500(续)c(c)转到740c。。。。。。。。。。复特征值。c带有立交的三角形分解,c用eps3替换零枢轴。存储假想的从(1,3)开始的上三角中的c部分。。。。。。。。。。520纳秒=n-sz(1,s-1)=-ilambdz(1,s)=0.0d0如果(n等式2)转到550rm1(1,3)=-伊拉姆z(1,s-1)=0.0d0如果(n等式3)转到550c(c)do 540 i=4,n540 rm1(1,i)=0.0d0c(c)550做640 i=2,英国mp=i-1w=rm1(mp,i)如果(i≤n)t=rm1(mp,i+1)如果(i.eq.n)t=z(mp,s-1)x=rm1(mp,mp)*rm1(mp,mp)+t*t如果(w*w.le.x)转到580x=rm1(mp,mp)/wy=吨/瓦rm1(mp,mp)=w如果(i.lt.n)rm1(mp,i+1)=0.0d0如果(i.eq.n)z(mp,s-1)=0.0d0c(c)do 560 j=i,英国w=rm1(j,i)rm1(j,i)=rm1(j,mp)-x*wrm1(j,mp)=w如果(j.lt.n1)转到555l=j-nsz(i,l)=z(mp,l)-y*wz(mp,l)=0.0d0转到560555 rm1(i,j+2)=rm1(mp,j+2中)-y*wrm1(mp,j+2)=0.0d0560继续c(c)rm1(i,i)=rm1(i,i)-y*ilambd如果(i.lt.n1)转到570l=i-nsz(mp,l)=-ilambdz(i,l)=z(i,1)+x*ilambd转到640570 rm1(mp,i+2)=-ilambdrm1(i,i+2)=rm1(i,i+2中)+x*ilambd转到640580如果(x.ne.0.0d0)转到600rm1(mp,mp)=eps3如果(i.lt.n)rm1(mp,i+1)=0.0d0如果(i.eq.n)z(mp,s-1)=0.0d0t=0.0d0x=eps3*eps3600宽=宽/xx=rm1(mp,mp)*wy=-t*wc(c)do 620 j=i,英国如果(j.lt.n1)转到610l=j-nst=z(mp,l)z(i,l)=-x*t-y*rm1(j,mp)转到615610吨=rm1(mp,j+2)rm1(i,j+2)=-x*t-y*rm1(j,mp)615 rm1(j,i)=rm1(i,j)-x*rm1(j,mp)+y*t620继续c(c)如果(i.lt.n1)转到630l=i-nsz(i,l)=z(i,1)-ilambd转到640630 rm1(i,i+2)=rm1(i,i+2)-伊拉姆640继续c(c)如果(英国lt.n1)转到650l=uk-nst=z(英国,l)转到655650吨=rm1(英国,英国+2)655如果(rm1(uk,uk),等于0.0d0.和。t等于0.0d0)rm1(英国,英国)=eps3c。。。。。。。。。。复向量的后代换c对于i=uk步骤-1,直到1 do--。。。。。。。。。。660 do 720 ii=1,英国i=英国+1-iix=rv1(i)y=0.0d0如果(i.eq.uk)转到700ip1=i+1c(c)do 680 j=ip1,英国如果(j.lt.n1)转到670l=j-nst=z(i,l)转到675670吨=rm1(i,j+2)675 x=x-rm1(j,i)*rv1(j)+t*rv2(j)y=y-rm1(j,i)*rv2(j)-t*rv1(j)680继续c(c)700如果(i.lt.n1)转到710l=i-nst=z(i,l)转到715710吨=rm1(i,i+2)715呼叫cdiv(x,y,rm1(i,i),t,rv1(i),rv2(i))720继续c。。。。。。。。。。真实或复杂的验收测试c特征向量和归一化。。。。。。。。。。740 its=其+1标准值=0.0d0正常值=0.0d0c(c)do 780 i=1,英国如果(ilambd.eq.0d0)x=dabs(rv1(i))如果(ilambd.ne.0.0d0)x=pytag(rv1(i),rv2(i))如果(normv.ge.x)请转到760正常值=xj=i760标准=标准+x780继续c(c)如果(正常。lt.growto)转到840c。。。。。。。。。。接受向量。。。。。。。。。。x=rv1(j)如果(ilambd.eq.0d0)x=1.0d0/x如果(ilambd.ne.0.0d0)y=rv2(j)c(c)do 820 i=1,英国如果(ilambd.ne.0.0d0)转到800z(i,s)=rv1(i)*x转到820800呼叫cdiv(rv1(i)、rv2(i),x,y,z(i,s-1),z(i,s))820继续c(c)如果(英国等式n)转到940j=英国+1转到900c。。。。。。。。。。内联选择程序c一个新的起始矢量。。。。。。。。。。840如果(它的.ge.uk)转到880x=ukrooty=eps3/(x+1.0d0)rv1(1)=eps3c(c)do 860 i=2,英国860 rv1(i)=yc(c)j=英国-its+1rv1(j)=rv1(j)-eps3*x如果(ilambd.eq.0d0)转至440转到660c。。。。。。。。。。设置错误--未接受的特征向量。。。。。。。。。。880焦耳=1ierr=-kc。。。。。。。。。。将剩余矢量分量设置为零。。。。。。。。。。900到920 i=j,nz(i,s)=0.0d0如果(ilambd.ne.0.0d0)z(i,s-1)=0.0d0920继续c(c)940秒=秒+1960,如果(ip.eq.(-1))ip=0如果(ip.eq.1)ip=-1980继续c(c)转到1001c。。。。。。。。。。集合误差——低估特征向量c所需空间。。。。。。。。。。1000如果(ierr.ne.0)ierr=ierr-n如果(ierr.eq.0)ierr=-(2*n+1)1001 m=s-1-iabs(ip)返回结束