向量迭代法的收敛速度取决于特征值的性质。对于特征值的数值结果较近的情况,收敛速度可能较慢。对于迭代替换求‘最大’特征值算例,使用上一篇的程序,初始猜测{x} = [1 1 1]T,经过26次迭代,误差为1 × 10−5,才收敛到4.7071。“换挡”设置可以改善收敛速度和基于修正问题的解。
例如,用同样的初始猜测值再次求解方上篇中的方程,使用3.5的移位值,在7次迭代就可以收敛到4.7071。
移位迭代的一个有效的特性是,对于特征值都为正数的方程,它可以很容易地计算[A]的最小特征值。首先利用向量迭代法计算[A]的最大特征值,即p,然后将其作为方程修正问题中的“移位”数值。然后可以使用向量迭代法找到修正矩阵[[A]−p[I]]的“最大”特征值。最后将p加到这个值上,得到最接近于0的特征值[A]。
程序如下:
分为一个主程序和一个检查收敛的子程序checkit。
#特征值和特征向量的移位向量迭代
import numpy as np
import B
n=3;tol=1.0e-5;limit=100;shift=33.71
a=np.array([[10,5,6],[5,20,4],[6,4,30]],dtype=np.float)
x1=np.zeros((n,1))
x=np.ones((3,1),dtype=np.float)
print('系数矩阵')
print(a[:])
print('移位量',shift)
print('初始猜测值',x[:,0])
for i in range(1,n+1):
a[i-1,i-1]=a[i-1,i-1]-shift
print('前几次迭代值')
iters=0
while(True):
iters=iters+1
x1[:]=np.dot(a,x)
big=0.0
for i in range(1,n+1):
if abs(x1[i-1,0])>abs(big):
big=x1[i-1,0]
x1[:,0]=x1[:,0]/big
if B.checkit(x1,x,tol)==True or iters==limit:
break
x[:,0]=x1[:,0]
if iters<5:
for i in range(1,n+1):
print("{:13.4e}".format(x[i-1,0]),end=" ")
print(end="\n")
l2=np.linalg.norm(x1)
x1[:,0]=x1[:,0]/l2
print('迭代到收敛的次数',iters)
print('最大特征值',"{:13.4e}".format(big))
print('对应的特征向量')
for i in range(1,n+1):
print("{:13.4e}".format(x1[i-1,0]),end=" ")
checkit
def checkit(loads,oldlds,tol):
#检查多个未知数的收敛
neq=loads.shape[0]
big=0.0
converged=True
for i in range(1,neq+1):
if abs(loads[i-1,0])>big:
big=abs(loads[i-1,0])
for i in range(1,neq+1):
if abs(loads[i-1,0]-oldlds[i-1,0])/big>tol:
converged=False
checkit=converged
return checkit