lanczos算法的核心——Ritz向量的计算(主要思想为反向映射)
在 Lanczos 算法中,“将得到的特征向量映射回原始空间(即乘以V)得到的近似特征向量” 这一步,通常是指在三对角矩阵(T)的特征向量求解完成后,将其转换回原始矩阵(A)的特征向量。具体实现步骤如下:
实现步骤
-
Lanczos 过程:
通过 Lanczos 迭代,你会得到一个三对角矩阵 TkT_kTk(大小为 k×kk \times kk×k)和一个正交矩阵VkV_kVk(大小为 n×kn \times kn×k),其中 VkV_kVk 的列是 Lanczos 过程生成的正交基向量。 -
求解三对角矩阵的特征向量:
对 TkT_kTk 进行特征分解,得到其特征值 λi\lambda_iλi 和对应的特征向量 sis_isi(即 Tksi=λisiT_k s_i = \lambda_i s_iTksi=λisi)。 -
映射回原始空间:
将 TkT_kTk 的特征向量 sis_isi 映射回原始空间,得到原始矩阵 AAA 的近似特征向量:
qi=Vksi q_i = V_k s_i qi=Vksi
这里的 qiq_iqi 就是原始矩阵 AAA 的近似特征向量。
数学原理说明
这一步的数学基础在于 Lanczos 算法建立的近似关系:
A≈VkTkVkT A \approx V_k T_k V_k^T A≈VkTkVkT
当我们对 TkT_kTk 进行特征分解 Tk=SΛSTT_k = S \Lambda S^TTk=SΛST 时,代入上式得到:
A≈VkSΛSTVkT=(VkS)Λ(VkS)T A \approx V_k S \Lambda S^T V_k^T = (V_k S) \Lambda (V_k S)^T A≈VkSΛSTVkT=(VkS)Λ(VkS)T
这说明 VkSV_k SVkS 的列向量(即 Ritz 向量)近似是 AAA 的正交特征向量,对应的特征值就是 Λ\LambdaΛ 中的特征值。
在代码中的实现
在您的代码中,这一步体现在:
ritz_vectors = (W.T @ Q[:, :num_ritz_vectors]).T
其中:
W.T
对应 VkTV_k^TVkT(但需要注意存储方式)Q
对应 SSS(T 的特征向量矩阵)Q[:, :num_ritz_vectors]
选取前 k 个特征向量- 矩阵乘法实现映射:VksiV_k s_iVksi