移位向量迭代法(shifted vector iteration)求特征值和特征向量(python,数值积分)

第二十六篇 移位向量迭代求特征值和特征向量

向量迭代法的收敛速度取决于特征值的性质。对于特征值的数值结果较近的情况,收敛速度可能较慢。对于迭代替换求‘最大’特征值算例,使用上一篇的程序,初始猜测{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

终端输出结果
移位向量迭代法(shifted vector iteration)求特征值和特征向量(python,数值积分)_第1张图片

你可能感兴趣的:(有限元,数值分析,python,线性代数)