在Python中更改参数时特征值不遵循顺序
我有一个在Python中更改参数时特征值不遵循顺序,python,python-3.x,numpy,eigenvalue,Python,Python 3.x,Numpy,Eigenvalue,我有一个6x6矩阵H,其中两个特征值在参数l的特定值处变为复数(对于lambda)。显然,它们是特征值数组Ewe对角化H(调用np.linalg.eig模块)后的前两个元素。然而,当它们变为现实时(在我的例子中,当l介于-1和1之间时),这个序列就不会保持。我可以通过将它们与精确的解析表达式进行比较来跟踪它们 请参见下面的我的代码: import numpy as np import matplotlib.pyplot as plt import cmath dim=6; t=1.0; eps
6x6
矩阵H
,其中两个特征值在参数l
的特定值处变为复数(对于lambda)。显然,它们是特征值数组E
we对角化H
(调用np.linalg.eig
模块)后的前两个元素。然而,当它们变为现实时(在我的例子中,当l
介于-1和1之间时),这个序列就不会保持。我可以通过将它们与精确的解析表达式进行比较来跟踪它们
请参见下面的我的代码:
import numpy as np
import matplotlib.pyplot as plt
import cmath
dim=6; t=1.0; eps=0.5; U = 2.0
# Initialize H
H=np.zeros((dim,dim),float)
# Vary parameter l
for l in np.linspace(-2,2,3):
# Construct H-matrix (size: 6 x 6)
tm=t-l; tp=t+l
H[0][0]=H[2][2]=H[3][3]=H[5][5]=2.0*eps
H[1][1]=H[4][4]=2.0*eps+U
H[1][2]=H[2][4]=tm
H[2][1]=H[4][2]=tp
H[1][3]=H[3][4]=-tm
H[3][1]=H[4][3]=-tp
# Diagonalize H
E,psi=np.linalg.eig(H)
# Print all the eigenvalues
print('lambda=',l,'===>')
print()
print('First two eigenvalues: E0=',E[0], 'E1=',E[1] )
print('Always real eigenvalues: E2=',E[2], 'E3=',E[3], 'E4=',E[4], 'E5=',E[5] )
print()
print("Expected sometimes complex eigenvalues:")
print("2\eps+[U+\srqt{16(t^2-\lambda^2)+U^2}]/2=",2.0*eps+(U+cmath.sqrt(16*tp*tm+U**2) )*0.5,"degeneracy=1")
print("2\eps+[U-\srqt{16(t^2-\lambda^2)}+U^2]/2=",2.0*eps+(U-cmath.sqrt(16*tp*tm+U**2) )*0.5,"degeneracy=1")
print("Expected always real eigenvalues:")
print("2\eps=",2.0*eps,"degeneracy=3")
print("2\eps+U=",2.0*eps+U,"degeneracy=1")
print('---------------------')
print()
我如何维护序列,以便仅根据l
(或lambda)绘制“有时复杂”的特征值对
输出:
lambda= -2.0 ===>
First two eigenvalues: E0= (2.0000000000000058+3.3166247903554043j) E1= (2.0000000000000058-3.3166247903554043j)
Always real eigenvalues: E2= (2.9999999999999982+0j) E3= (0.9999999999999999+0j) E4= (1+0j) E5= (1+0j)
Expected sometimes complex eigenvalues:
2\eps+[U+\srqt{16(t^2-\lambda^2)+U^2}]/2= (2+3.3166247903554j) degeneracy=1
2\eps+[U-\srqt{16(t^2-\lambda^2)}+U^2]/2= (2-3.3166247903554j) degeneracy=1
Expected always real eigenvalues:
2\eps= 1.0 degeneracy=3
2\eps+U= 3.0 degeneracy=1
---------------------
lambda= 0.0 ===>
First two eigenvalues: E0= -0.23606797749979025 E1= 2.9999999999999996
Always real eigenvalues: E2= 4.236067977499788 E3= 1.0 E4= 1.0 E5= 1.0
Expected sometimes complex eigenvalues:
2\eps+[U+\srqt{16(t^2-\lambda^2)+U^2}]/2= (4.23606797749979+0j) degeneracy=1
2\eps+[U-\srqt{16(t^2-\lambda^2)}+U^2]/2= (-0.2360679774997898+0j) degeneracy=1
Expected always real eigenvalues:
2\eps= 1.0 degeneracy=3
2\eps+U= 3.0 degeneracy=1
---------------------
lambda= 2.0 ===>
First two eigenvalues: E0= (2.000000000000008+3.3166247903554043j) E1= (2.000000000000008-3.3166247903554043j)
Always real eigenvalues: E2= (2.999999999999997+0j) E3= (1+0j) E4= (1+0j) E5= (1+0j)
Expected sometimes complex eigenvalues:
2\eps+[U+\srqt{16(t^2-\lambda^2)+U^2}]/2= (2+3.3166247903554j) degeneracy=1
2\eps+[U-\srqt{16(t^2-\lambda^2)}+U^2]/2= (2-3.3166247903554j) degeneracy=1
Expected always real eigenvalues:
2\eps= 1.0 degeneracy=3
2\eps+U= 3.0 degeneracy=1
---------------------
PS:如果我的问题不清楚或需要重新组织,请告诉我。答案在文档中: 我引述: 。。。特征值不一定是有序的。生成的数组将是复数类型,除非虚部为零,在这种情况下,它将转换为实类型。当a为实时,得到的特征值将为实(0虚部)或以共轭对出现 因此,如果你想保持顺序,并且你知道特征值的实部相对于参数是连续变化的,你需要做的是按键对特征向量进行排序,其中键只由特征值的实部给出:
vals, eigs = np.linalg.eig(H);
eigs = eigs[ np.argsort( np.real(vals) ) ]
应该这样做。相关:不,我仍然得到
lambda=0.0==>前两个特征值:E0=-0.23606797749979025 E1=2.99999999996
我期望的E1=4.23606797749979
。