使用 scipy 的矩阵求幂:expm、expm2 和 expm3

Matrix exponentiation with scipy: expm, expm2 and expm3

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

在 SciPy 0.13.0 发行说明中指出:

The matrix exponential functions scipy.linalg.expm2 and scipy.linalg.expm3 are deprecated. All users should use the numerically more robust scipy.linalg.expm function instead.

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

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

在什么情况下(例如稀疏矩阵、对称等)每个算法 faster/more 都是精确的?

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

一般来说,我认为 eigen-decomposition (expm2) 不太适合稀疏矩阵,因为它可能会消除稀疏性。它也将更难应用于 non-symmetric 矩阵,因为这将需要使用复杂的算术和更昂贵的算法来计算 eigen-decomposition.

对于 Taylor-series 方法 (expm3),如果有固定数量的项独立于矩阵的范数,这听起来很冒险。当计算标量 x 的 e^x 时,泰勒级数中的最大项围绕 n 接近 x 的项。

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