expm_frechet#
- scipy.linalg.expm_frechet(A, E, method=None, compute_expm=True, check_finite=True)[source]#
计算矩阵 A 的矩阵指数的 Frechet 导数,方向为 E。
本文档假定数组参数具有指定的“核心”形状。然而,此函数的数组参数可能在核心形状前额外添加“批处理”维度。在这种情况下,该数组被视为低维切片的批处理;详见批处理线性运算。
- 参数:
- A(N, N) array_like
用于计算矩阵指数的矩阵。
- E(N, N) array_like
计算 Frechet 导数的矩阵方向。
- methodstr, 可选
算法选择。应为以下之一:
SPS (默认)
blockEnlarge
- compute_expmbool, 可选
除了expm_frechet_AE之外,是否也计算expm_A。默认为 True。
- check_finitebool, 可选
是否检查输入矩阵仅包含有限数。禁用此选项可能会提高性能,但如果输入包含无穷大或 NaN,则可能导致问题(崩溃、无法终止)。
- 返回:
- expm_Andarray
A 的矩阵指数。
- expm_frechet_AEndarray
计算矩阵 A 的矩阵指数的 Frechet 导数,方向为 E。
- 当
compute_expm = False
时,仅返回expm_frechet_AE。
另请参阅
expm
计算矩阵的指数。
备注
本节描述了可以通过method参数选择的可用实现。默认方法是SPS。
方法blockEnlarge是一种朴素算法。
方法SPS是 Scaling-Pade-Squaring [1]。它是一种复杂的实现,所需时间仅为朴素实现的约 3/8。渐近性相同。
添加于版本 0.13.0。
参考文献
[1]Awad H. Al-Mohy and Nicholas J. Higham (2009) Computing the Frechet Derivative of the Matrix Exponential, with an application to Condition Number Estimation. SIAM Journal On Matrix Analysis and Applications., 30 (4). pp. 1639-1657. ISSN 1095-7162
示例
>>> import numpy as np >>> from scipy import linalg >>> rng = np.random.default_rng()
>>> A = rng.standard_normal((3, 3)) >>> E = rng.standard_normal((3, 3)) >>> expm_A, expm_frechet_AE = linalg.expm_frechet(A, E) >>> expm_A.shape, expm_frechet_AE.shape ((3, 3), (3, 3))
创建一个 6x6 矩阵,包含 [[A, E], [0, A]]
>>> M = np.zeros((6, 6)) >>> M[:3, :3] = A >>> M[:3, 3:] = E >>> M[3:, 3:] = A
>>> expm_M = linalg.expm(M) >>> np.allclose(expm_A, expm_M[:3, :3]) True >>> np.allclose(expm_frechet_AE, expm_M[:3, 3:]) True