【问题标题】:Eigenanalysis of complex hermitian matrix: different phase angles for EIG and EIGH复厄米特矩阵的特征分析:EIG 和 EIGH 的不同相位角
【发布时间】:2020-09-06 21:05:43
【问题描述】:

我知道特征向量只能定义为乘法常数。据我所知,所有numpy 算法(例如linalg.eig、linalg.eigh、linalg.svd)为实矩阵 产生相同的特征向量,因此显然它们使用相同的归一化。然而,在复杂矩阵的情况下,算法会产生不同的结果。

也就是说,特征向量在(复数)常数z 之前是相同的。在对eig 和eigh 进行了一些实验后,我意识到eigh 总是将每个特征向量的第一个分量的相位角(定义为arctan(复数部分/实数部分))设置为0,而eig 似乎开始了有一些(任意?)非零相位角。

问:有没有办法像 eig 那样对来自 eigh 的特征向量进行归一化(即不强制相位角 = 0)?

示例

我有一个复杂的厄米特矩阵 G,我想使用以下两种算法计算其特征向量:

  • numpy.linalg.eig 用于实数/复方矩阵
  • numpy.linalg.eigh用于实对称/复厄米矩阵(1 的特殊情况。)

检查 G 是否为厄米特

# check if a matrix is hermitian
def isHermitian(a, rtol=1e-05, atol=1e-08):
    return np.allclose(a, a.conjugate().T, rtol=rtol, atol=atol)

print('G is hermitian:', isHermitian(G))

输出:

G is hermitian: True

进行特征分析

# eigenvectors from EIG()
l1,u1 = np.linalg.eig(G)
idx = np.argsort(l1)[::-1]
l1,u1 = l1[idx].real,u1[:,idx]

# eigenvectors from EIGH()
l2,u2 = np.linalg.eigh(G)
idx = np.argsort(l2)[::-1]
l2,u2 = l2[idx],u2[:,idx]

检查特征值

print('Eigenvalues')
print('eig\t:',l1[:3])
print('eigh\t:',l2[:3])

输出:

Eigenvalues
eig     : [2.55621629e+03 3.48520440e+00 3.16452447e-02]
eigh    : [2.55621629e+03 3.48520440e+00 3.16452447e-02]

两种方法产生相同的特征向量。

检查特征向量

现在查看特征向量(例如 3. 特征向量),它们相差一个常数因子 z。

multFactors = u1[:,2]/u2[:,2]
if np.count_nonzero(multFactors[0] == multFactors):
    print("All multiplication factors are same:", multFactors[0])
else:
    print("Multiplication factors are different.")

输出:

All multiplication factors are same: (-0.8916113627685007+0.45280147727156245j)

检查相位角

现在检查 3. 特征向量的第一个分量的相位角:

print('Phase angel (in PI) for first point:')
print('Eig\t:',np.arctan2(u1[0,2].imag,u1[0,2].real)/np.pi)
print('Eigh\t:',np.arctan2(u2[0,2].imag,u2[0,2].real)/np.pi)

输出:

Phase angel (in PI) for first point:
Eig     : 0.8504246311627189
Eigh    : 0.0

重现图的代码

num = 2
fig = plt.figure()
gs = gridspec.GridSpec(2, 3) 
ax0 = plt.subplot(gs[0,0])
ax1 = plt.subplot(gs[1,0])
ax2 = plt.subplot(gs[0,1:])
ax3 = plt.subplot(gs[1,1:])
ax2r= ax2.twinx()
ax3r= ax3.twinx()
ax0.imshow(G.real,vmin=-30,vmax=30,cmap='RdGy')
ax1.imshow(G.imag,vmin=-30,vmax=30,cmap='RdGy')
ax2.plot(u1[:,num].real,label='eig')
ax2.plot((u2[:,num]).real,label='eigh')
ax3.plot(u1[:,num].imag,label='eig')
ax3.plot((u2[:,num]).imag,label='eigh')
for a in [ax0,ax1,ax2,ax3]:
    a.set_xticks([])
    a.set_yticks([])
ax0.set_title('Re(G)')
ax1.set_title('Im(G)')
ax2.set_title('Re('+str(num+1)+'. Eigenvector)')
ax3.set_title('Im('+str(num+1)+'. Eigenvector)')
ax2.legend(loc=0)
ax3.legend(loc=0)
fig.subplots_adjust(wspace=0, hspace=.2,top=.9) 
fig.suptitle('Eigenanalysis of Hermitian Matrix G',size=16)
plt.show()

【问题讨论】:

    标签: python numpy matrix eigenvector


    【解决方案1】:

    根据我的经验(这里有很多问题可以支持这一点),当eigh 是一个选项时,你永远不会想使用eig - eig 非常慢而且非常不稳定。与此相关的是,我认为您的问题是落后的 - 您希望将 eig 的特征向量归一化为像 eigh 的特征向量,并且您知道该怎么做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2019-01-15
      • 2013-04-06
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多