使用scipy进行矩阵求幂:expm,expm2和expm3

时间:2017-07-18 12:46:21

标签: python scipy sparse-matrix

可以使用scipy.linalg库中的函数(即expm, expm2, expm3)在python中执行矩阵取幂。 expm使用了Pade近似值; expm2使用特征值分解方法,expm3使用泰勒级数,默认条件数为20。

在SciPy 0.13.0发行说明中声明:

  

不推荐使用矩阵指数函数scipy.linalg.expm2和scipy.linalg.expm3。所有用户都应该使用数字更强大的scipy.linalg.expm函数。

虽然自发布版本SciPy 0.13.0以来已弃用expm2expm3,但我发现在许多情况下这些实现都比expm快。 由此产生了一些问题:

在什么情况下,expm2和expm3会导致数值不稳定?

在什么情况下(例如稀疏矩阵,对称,...),每种算法都更快/更精确?

1 个答案:

答案 0 :(得分:2)

这很大程度上取决于这些不同的矩阵取幂方法的实现细节。

一般来说,我认为特征分解(expm2)不适合稀疏矩阵,因为它可能会消除稀疏性。应用于非对称矩阵也将更加困难,因为这将需要使用复杂的算术和更昂贵的算法来计算特征分解。

对于泰勒级数方法(expm3),如果存在与矩阵范数无关的固定数量的项,则这听起来有风险。当计算标量x的e ^ x时,泰勒级数中最大的项大约是n接近x的项。

但是,这些(已弃用)函数的实现细节可能会使用对角加载矩阵等技巧,以提高这些系列扩展的稳定性。