对角化后具有复杂单元的矩阵重构

Reconstructing a matrix with complex elements after diagonalization

提问人:Shasa 提问时间:7/6/2023 更新时间:7/8/2023 访问量:50

问:

我有一个包含复杂元素的随机矩阵,我使用 .有了分解的矩阵,我尝试重建原始矩阵。这是我的剧本Htestscipy.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))

你有什么建议来解决这个问题吗?

python scipy 特征向量

评论

0赞 hpaulj 7/7/2023
您能为这种说法提供参考吗?Vls.T.conj() @ np.diag(Es) @Vrs

答:

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)