python中广义特征值问题的高效求解

问题描述

给定一个特征值问题 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。