问题描述
给定一个特征值问题 Ax = λBx 在这里显示的两个问题中更有效的解决方法是什么:
import scipy as sp
import numpy as np
def geneivprob(A,B):
# Use scipy
lamda,eigvec = sp.linalg.eig(A,B)
return lamda,eigvec
def geneivprob2(A,B):
# Reduce the problem to a standard symmetric eigenvalue problem
Linv = np.linalg.inv(np.linalg.cholesky(B))
C = Linv @ A @ Linv.transpose()
#C = np.asmatrix((C + C.transpose())*0.5,np.float32)
lamda,V = np.linalg.eig(C)
return lamda,Linv.transpose() @ V
我在代码库中看到了第二个版本,想知道它是否比简单地使用 scipy 更好。
解决方法
嗯,使用第二种方法没有明显的优势,也许对于某些类的矩阵会更好,我建议你测试你想要解决的问题。由于您正在变换特征向量,这也将变换误差对解的影响方式,也许这就是使用第二种方法的原因,不是效率,而是数值精度或收敛性。
另一件事是第二种方法仅适用于对称 B。