Arnoldi 分解算法

计算科学 共轭梯度 格瑞斯
2021-12-05 00:55:38

我尝试通过 Arnoldi-Decomposition 进入 GMRES。据我了解,我在 python 中实现了 Arnoldi-Decomposition。

import numpy as np
n = 5
A = np.random.rand(n,n)
v = np.random.rand(n)
M = np.zeros_like(A)
M[:,0] = v
for i in range(1,5):
   M[:,i] = np.matmul(A,M[:,i-1])

d = np.linalg.matrix_rank(M)

V = np.zeros((n,d))
H = np.zeros((d,d))

V[:,0] = v / np.linalg.norm(v)


for j in range(d-1):
    vj = V[:,j]

    Avj = np.matmul(A, vj)

    H[:j+1,j] =  np.matmul(Avj, V[:,:j+1])

    w = Avj - np.matmul(V[:,:j+1] ,H[:j+1,j])    
    H[j+1,j] = np.linalg.norm(w)
    V[:,j+1]  = w/  H[j+1,j]

我预计结果会像AVk=HkVk,即得到一个阿诺尔迪分解。但是当我对结果进行反查时,它似乎偏离了一次迭代:

>>np.matmul(A,V)
array([[ 1.74946273,  0.34244799, -0.03368428, -0.52017016, -0.36756412],
       [ 1.01841093,  0.09805327, -0.02055688, -0.82253407, -0.37112225],
       [ 0.81156945,  0.3374741 , -0.11957267,  0.17757239,  0.23021054],
       [ 0.99533205, -0.32793397, -0.12764172,  0.09559959,  0.14891387],
       [ 1.35827635, -0.02004282,  0.24724491, -0.07114606,  0.32279871]])
>>np.matmul(V,H)
array([[ 1.74946273,  0.34244799, -0.03368428, -0.52017016,  0.        ],
       [ 1.01841093,  0.09805327, -0.02055688, -0.82253407,  0.        ],
       [ 0.81156945,  0.3374741 , -0.11957267,  0.17757239,  0.        ],
       [ 0.99533205, -0.32793397, -0.12764172,  0.09559959,  0.        ],
       [ 1.35827635, -0.02004282,  0.24724491, -0.07114606,  0.        ]])

所以似乎是这样AVk=Vk+1Hk+1. 在我的讲义中,我发现这种关系没有证据。那么,有人可以给我证明吗?

0个回答
没有发现任何回复~