提问人:Shasa 提问时间:7/6/2023 更新时间:7/8/2023 访问量:50
对角化后具有复杂单元的矩阵重构
Reconstructing a matrix with complex elements after diagonalization
问:
我有一个包含复杂元素的随机矩阵,我使用 .有了分解的矩阵,我尝试重建原始矩阵。这是我的剧本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))
你有什么建议来解决这个问题吗?
答:
0赞
hpaulj
7/7/2023
#1
使用 创建 (4,4) 复数组。np.random.rand
In [85]: Htest = np.random.rand(L0,L0)+np.random.rand(L0,L0)*1j
而分解:
In [86]: E, Vl, Vr=linalg.eig(Htest,left=True)
In [87]: E.shape, Vl.shape, Vr.shape
Out[87]: ((4,), (4, 4), (4, 4))
输出已经是数组。并且无需排序即可进行测试。
In [88]: np.allclose(Htest@Vr, E*Vr)
Out[88]: True
In [89]: np.allclose(Htest.conj().T@Vl, E.conj() * Vl)
Out[89]: True
使用“svd”:
In [127]: U, s, Vh = linalg.svd(Htest)
In [130]: np.allclose(Htest, [email protected](s)@Vh)
Out[130]: True
我不记得有足够的 linalg 来纠正这个问题(还)
In [137]: np.allclose(Htest, Vl.T.conj() @ np.diag(E) @Vr)
Out[137]: False
以及使用以下方法的替代方法:diag
In [152]: np.allclose(E[:,None]*Vl, np.diag(E)@Vl)
Out[152]: True
我不知道这是否有用。
关于从特征值和特征向量重新创建矩阵的一般 Web 搜索会出现许多 StackExchange 问题,有些是 SO,有些是数学。这似乎有限制(对称?您可能需要提供数学参考。
编辑
In [173]: np.allclose(Htest, [email protected](E)@np.linalg.inv(Vr))
Out[173]: True
In [176]: np.allclose(Htest, Vr@(E[:,None]*np.linalg.inv(Vr)))
Out[176]: True
从之前的测试中:
Htest@Vr == E*Vr
Htest@Vr == Vr*E
Htest@Vr == Vr@diag(E)
Htest@Vr@inv(Vr) == Vr@diag(E)@inv(Vr)
Htest == Vr@diag(E)@inv(Vr)
按照相同的逻辑:Vl
In [201]: np.allclose(Htest.conj().T, (Vl*E.conj())@np.linalg.inv(Vl))
Out[201]: True
In [203]: np.allclose(Htest.conj().T, [email protected](E.conj())@np.linalg.inv(Vl))
Out[203]: True
评论
0赞
Shasa
7/7/2023
谢谢你的努力。我找到了正确的转换,那就是。如果你能把这个纳入你的答案,问题就解决了,我可以接受它,让其他人从中受益。Vrs @ np.diag(Es) @np.linalg.inv(Vrs)
评论
Vls.T.conj() @ np.diag(Es) @Vrs