在 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_iTk?si?=λi?si?)。 -
映射回原始空間:
將 TkT_kTk? 的特征向量 sis_isi? 映射回原始空間,得到原始矩陣 AAA 的近似特征向量:
qi=Vksi q_i = V_k s_i qi?=Vk?si?
這里的 qiq_iqi? 就是原始矩陣 AAA 的近似特征向量。
數學原理說明
這一步的數學基礎在于 Lanczos 算法建立的近似關系:
A≈VkTkVkT A \approx V_k T_k V_k^T A≈Vk?Tk?VkT?
當我們對 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≈Vk?SΛSTVkT?=(Vk?S)Λ(Vk?S)T
這說明 VkSV_k SVk?S 的列向量(即 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_iVk?si?