假设我们有一个向量q,我们需要关于向量q,构建一个投影平面P,使得给定任何向量v,可以通过公式 p = P v p=Pv p=Pv,快速得到向量v在投影平面P上的投影向量p.
随便放位置
arnoldi Iteration的作用是想在原来的krylov 子空间中增加一个向量
A
q
k
Aq_k
Aqk,具体思路如下图所示:



后续提供详细的,现在直接粘贴吧。
import numpy as np
def arnoldi_iteration(A, b, k):
"""
Perform Arnoldi iteration to generate an orthonormal basis for the Krylov subspace.
Parameters:
A : numpy.ndarray
The input matrix (n x n).
b : numpy.ndarray
The initial vector (n, ).
k : int
The number of iterations, which defines the size of the Krylov subspace.
Returns:
Q : numpy.ndarray
The orthonormal basis for the Krylov subspace (n x (k+1)).
H : numpy.ndarray
The Hessenberg matrix (k+1 x k).
"""
n = A.shape[0]
Q = np.zeros((n, k + 1)) # Orthonormal basis
H = np.zeros((k + 1, k)) # Hessenberg matrix
# Normalize the initial vector
Q[:, 0] = b / np.linalg.norm(b)
for j in range(k):
v = A @ Q[:, j] # Matrix-vector multiplication
for i in range(j + 1):
H[i, j] = np.dot(Q[:, i].conj(), v) # Project v onto the current basis vectors
v = v - H[i, j] * Q[:, i] # Make v orthogonal to Q[:, i]
H[j + 1, j] = np.linalg.norm(v) # Normalize v to get the next basis vector
if H[j + 1, j] != 0 and j + 1 < k:
Q[:, j + 1] = v / H[j + 1, j]
return Q, H
# Example usage
if __name__ == "__main__":
# Define a random matrix A and a random vector b
A = np.random.rand(5, 5)
b = np.random.rand(5)
k = 4
Q, H = arnoldi_iteration(A, b, k)
print("Orthonormal basis Q:\n", Q)
print("Hessenberg matrix H:\n", H)