子程序csico(a,lda,n,kpvt,rcond,z)整数lda,n,kpvt(1)复数a(lda,1),z(1)实际rcondc(c)c-csico用消元法对复对称矩阵进行因子分解c对称旋转并估计矩阵的条件。c(c)c如果不需要rcond,csifa会稍微快一些。c要解a*x=b,在csico后面加上csisl。c要计算逆(a)*c,在csico后面加上csisl。c要计算逆(a),遵循csico和csidi。c要计算行列式(a),请遵循csico和csidi。c(c)c输入c(c)c a复合体(lda,n)c要分解的对称矩阵。c只使用对角线和上三角。c(c)c lda整数c数组a的前导维数。c(c)c n整数c矩阵a的阶。c(c)返回时为cc(c)c a a块对角矩阵及其乘数c被用来获得它。c因子分解可以写成a=u*d*trans(u)c,其中u是置换和单位的乘积c上三角矩阵,trans(u)是u的c转置,d是块对角线c带有1 x 1和2 x 2块。c(c)c kpvt整数(n)c枢轴指数的整数向量。c(c)c rcond实数c a的倒数条件的估计。c对于系统a*x=b,相对扰动ε大小的a和b中的c可能导致cε/rcond大小x的相对扰动。如果rcond太小,逻辑表达式c 1.0+rcond.等效值1.0c为真,那么a可能是工作的单数c精度。特别是,如果c精确奇异性检测或估计c下溢。c(c)cz复数(n)c一个内容通常不重要的工作向量。c如果a接近奇异矩阵,那么z是c一个近似零向量,在这个意义上c范数(a*z)=rcond*范数(a)*范数。c(c)c林帕克。此版本日期为78年8月14日。克莱夫·莫勒,新墨西哥大学,阿贡国家实验室。c(c)c子程序和函数c(c)c内衬csifac blas caxpy、cdotu、csscal、scasumc fortran abs,aimag,amax1,cmplx,iabs,real公司c(c)c内部变量c(c)复数ak,akm1,bk,bkm1,cdotu,denom,ek,t真正的anorm、s、scasum、ynorm整数i,信息,j,jm1,k,kp,kps,ksc(c)复合zdum,zdum2,csign1真正的出租车1cabs1(zdum)=abs(实数(zdun))+abs(省(zdus))csign1(zdum,zdum2)=驾驶室1(zdam)*(zdum2/cabs1(zdum2))c(c)c找到a的范数,只使用上半部分c(c)做30 j=1,nz(j)=cmplx(scasum(j,a(1,j),1),0.0e0)jm1=j-1如果(jm1.lt.1)转到20做10 i=1,jm1z(i)=cmplx(实数(z(i))+驾驶室1(a(i,j)),0.0e0)10继续20继续30继续anorm=0.0e0做40 j=1,nanorm=amax1(anorm,实数(z(j)))40继续c(c)c系数c(c)调用csifa(a,lda,n,kpvt,info)c(c)c rcond=1/(范数(a)*(范数估计(逆(a)))。c估计值=范数(z)/范数(y),其中a*z=y和a*y=e。c选择e的分量以引起最大局部c w元素的增长,其中u*d*w=e。c经常调整向量的大小以避免溢出。c(c)c解u*d*w=ec(c)ek=(1.0e0,0.0e0)做50 j=1,nz(j)=(0.0e0,0.0e0)50继续k=n60如果(k等于0)转到120ks=1如果(kpvt(k).lt.0)ks=2kp=iabs(kpvt(k))kps=k+1-ks如果(kp.eq.kps)转到70t=z(kps)z(kps)=z(kp)z(kp)=t70继续if(cabs1(z(k)).ne.0.0e0)ek=csign1(ek,z(k))z(k)=z(k)+ek调用caxpy(k-ks,z(k),a(1,k),1,z(1),1)如果(ks.等式1)转至80if(驾驶室1(z(k-1)).ne.0.0e0)ek=csign1(ek,z(k-1))z(k-1)=z(k-1)+ek调用caxpy(k-ks,z(k-1),a(1,k-1);1,z(1),1)80继续如果(ks.等式2)转至100如果(cabs1(z(k)).le。出租车1(a(k,k))转到90s=驾驶室1(a(k,k))/cabs1(z(k))调用csscal(n,s,z,1)ek=cmplx(s,0.0e0)*ek90继续如果(驾驶室1(a(k,k)).ne.0.0e0)z(k)=z(kif(驾驶室1(a(k,k)).等式0.0e0)z(k)=(1.0e0,0.0e0转到110100继续ak=a(k,k)/a(k-1,k)akm1=a(k-1,k-1)/a(k-1、k)bk=z(k)/a(k-1,k)bkm1=z(k-1)/a(k-1,k)denom=ak*akm1-1.0e0z(k)=(akm1*bk-bkm1)/分母z(k-1)=(ak*bkm1-bk)/分母110继续k=k-ks转到60120继续s=1.0e0/scasum(n,z,1)调用csscal(n,s,z,1)c(c)c求解trans(u)*y=wc(c)k=1130如果(k.gt.n)转到160ks=1如果(kpvt(k).lt.0)ks=2如果(k等式1)转到150z(k)=z(k)+cdotu(k-1,a(1,k),1,z(1),1)如果(ks.等式2)*z(k+1)=z(k/1)+cdotu(k-1,a(1,k+1),1,z(1),1)kp=iabs(kpvt(k))如果(kp.eq.k)转到140t=z(k)z(k)=z(kp)z(kp)=t140继续150继续k=k+ks转到130160继续s=1.0e0/scasum(n,z,1)调用csscal(n,s,z,1)c(c)雷诺=1.0e0c(c)c解u*d*v=yc(c)k=n170如果(k等于0)转到230ks=1如果(kpvt(k).lt.0)ks=2如果(k等于ks)转到190kp=iabs(kpvt(k))kps=k+1-ks如果(kp.eq.kps)转到180t=z(kps)z(kps)=z(kp)z(kp)=t180继续调用caxpy(k-ks,z(k),a(1,k),1,z(1),1)如果(ks.等式2)调用caxpy(k-ks,z(k-1),a(1,k-1)),1,z(1),1)190续如果(ks.等式2)转至210如果(cabs1(z(k)).le。出租车1(a(k,k))前往200s=cabs1(a(k,k))/cabs1(z(k))调用csscal(n,s,z,1)ynorm=s*ynorm200继续如果(cabs1(a(k,k)).ne.0.0e0)z(k)=z(k)/a(k,k)if(驾驶室1(a(k,k)).等式0.0e0)z(k)=(1.0e0,0.0e0转到220210继续ak=a(k,k)/a(k-1,k)akm1=a(k-1,k-1)/a(k-1、k)bk=z(k)/a(k-1,k)bkm1=z(k-1)/a(k-1,k)denom=ak*akm1-1.0e0z(k)=(akm1*bk-bkm1)/分母z(k-1)=(ak*bkm1-bk)/分母220继续k=k-ks转到170230继续s=1.0e0/scasum(n,z,1)调用csscal(n,s,z,1)ynorm=s*ynormc(c)c解反式(u)*z=vc(c)k=1240如果(k.gt.n)转到270ks=1如果(kpvt(k).lt.0)ks=2如果(k等式1)转至260z(k)=z(k)+cdotu(k-1,a(1,k),1,z(1),1)如果(ks.等式2)*z(k+1)=z(k/1)+cdotu(k-1,a(1,k+1),1,z(1),1)kp=iabs(kpvt(k))如果(kp.eq.k)转至250t=z(k)z(k)=z(kp)z(kp)=t250继续260继续k=k+ks转到240270继续c使znorm=1.0s=1.0e0/scasum(n,z,1)调用csscal(n,s,z,1)ynorm=s*ynormc(c)如果(anorm.ne.0.0e0)rcond=ynorm/anorm如果(anorm.eq.0.0e0)rcond=0.0e0返回结束