复元素矩阵对角化后重构失败的问题排查与解决建议
复矩阵对角化后重构失败的修复方案
问题背景
构造含复元素的随机矩阵Htest,使用scipy.linalg.eig对角化后尝试重构原始矩阵,结果未得到预期的零矩阵,但单独验证左、右特征向量与对应特征值的关系是成立的。代码如下:
import numpy as np import scipy as sp import random L0=4 Htest= np.array([[random.random()+1j*random.random() for e in range(L0)] for e in range(L0)]) # calculate spin energy levels E, Vl, Vr=sp.linalg.eig(Htest,left=True)# E=np.array(E) Vl=np.array(Vl) Vr=np.array(Vr) idx = E.argsort()[::1]#sort with smallest eigenvalues Es = E[idx] Vrs = Vr[:,idx] Vls = Vl[:,idx] # This should be a null matrix, but it is not! print(np.round( (Htest)- Vls.T.conj() @ np.diag(Es) @Vrs ,3)) #This works for i in range(L0): print(np.round( np.dot(Htest , Vrs[:,i] )- Es[i] * Vrs[:,i] ,3)) print(np.round( np.dot(Htest.conj().T, Vls[:,i] )- Es[i].conj() * Vls[:,i],3))
问题原因
scipy.linalg.eig返回的左、右特征向量未自动满足双正交归一条件(即Vl.conj().T @ Vr ≠ 单位矩阵)。对于非厄米矩阵,左特征向量和右特征向量是不同的集合,仅满足Vl[i].conj().T @ Vr[j] = 0(当i≠j),但同一索引的特征向量内积不为1,导致直接用Vls.T.conj() @ diag(Es) @ Vrs无法重构原始矩阵。
修复方案
需要通过左、右特征向量的重叠矩阵进行修正,确保重构时满足双正交性。具体步骤:
- 计算左、右特征向量的重叠矩阵
S = Vls.conj().T @ Vrs - 求
S的逆矩阵S_inv - 使用修正后的公式重构矩阵:
Vrs @ np.diag(Es) @ S_inv @ Vls.conj().T
修改后的完整代码:
import numpy as np import scipy as sp import random L0=4 Htest= np.array([[random.random()+1j*random.random() for e in range(L0)] for e in range(L0)]) # 对角化并排序特征值与特征向量 E, Vl, Vr=sp.linalg.eig(Htest,left=True) idx = E.argsort() Es = E[idx] Vrs = Vr[:,idx] Vls = Vl[:,idx] # 计算重叠矩阵及其逆 S = Vls.conj().T @ Vrs S_inv = np.linalg.inv(S) # 正确重构原始矩阵 reconstructed_H = Vrs @ np.diag(Es) @ S_inv @ Vls.conj().T # 验证重构结果(接近零矩阵) print(np.round(Htest - reconstructed_H, 3)) # 原特征向量关系验证 for i in range(L0): print(np.round(np.dot(Htest, Vrs[:,i]) - Es[i] * Vrs[:,i], 3)) print(np.round(np.dot(Htest.conj().T, Vls[:,i]) - Es[i].conj() * Vls[:,i], 3))
原理补充
- 对于厄米矩阵,左、右特征向量完全相同,且满足正交归一性,此时重叠矩阵
S是单位矩阵,重构可简化为Vr @ diag(E) @ Vr.conj().T。 - 对于一般非厄米矩阵,必须通过重叠矩阵的逆修正特征向量的缩放关系,才能满足
H = Vr @ diag(E) @ Vl^+(其中Vl^+是Vl的Moore-Penrose伪逆,这里等价于S_inv @ Vls.conj().T)。
内容的提问来源于stack exchange,提问作者Shasa
相关产品推荐
相关产品推荐

