scipy.sparse.linalg.

expm_multiply#

scipy.sparse.linalg.expm_multiply(A, B, start=None, stop=None, num=None, endpoint=None, traceA=None)[source]#

计算 A 的矩阵指数作用于 B。

参数:
A可转置线性算子

指数是感兴趣的算子。

Bndarray,稀疏数组

要乘以 A 的矩阵指数的矩阵或向量。

start标量,可选

序列的起始时间点。

stop标量,可选

序列的结束时间点,除非 endpoint 设置为 False。 在这种情况下,序列由除 num + 1 个均匀间隔的时间点中的最后一个时间点之外的所有时间点组成,因此排除了 stop。 请注意,当 endpoint 为 False 时,步长会发生变化。

numint,可选

要使用的时间点数。

endpointbool,可选

如果为 True,则 stop 是最后一个时间点。 否则,不包括在内。

traceA标量,可选

A 的迹。 如果未给出,则为线性算子估计迹,或者为稀疏矩阵精确计算迹。 它用于预处理 A,因此近似迹是可以接受的。 对于线性算子,应提供 traceA 以确保性能,因为估计不能保证适用于所有情况。

1.9.0 版本中添加。

返回值:
expm_A_Bndarray

作用 \(e^{t_k A} B\) 的结果。

警告:
UserWarning

如果 A 是线性算子并且 traceA=None(默认)。

注释

定义均匀间隔时间点序列的可选参数与 numpy.linspace 的参数兼容。

输出 ndarray 形状有些复杂,所以我在这里解释一下。 输出的 ndim 可以是 1、2 或 3。 如果您计算单个时间点上单个向量的 expm 作用,则为 1。 如果您计算多个时间点上向量的 expm 作用,或者计算单个时间点上矩阵的 expm 作用,则为 2。 如果您希望计算多个时间点上具有多个列的矩阵的作用,则为 3。 如果请求多个时间点,则 expm_A_B[0] 将始终是 expm 在第一时间点的作用,无论该作用是针对向量还是矩阵。

参考文献

[1]

Awad H. Al-Mohy 和 Nicholas J. Higham (2011) “计算矩阵指数的作用,并将其应用于指数积分器。” SIAM Journal on Scientific Computing, 33 (2). pp. 488-511. ISSN 1064-8275 http://eprints.ma.man.ac.uk/1591/

[2]

Nicholas J. Higham 和 Awad H. Al-Mohy (2010) “计算矩阵函数。” Acta Numerica, 19. 159-208. ISSN 0962-4929 http://eprints.ma.man.ac.uk/1451/

示例

>>> import numpy as np
>>> from scipy.sparse import csc_array
>>> from scipy.sparse.linalg import expm, expm_multiply
>>> A = csc_array([[1, 0], [0, 1]])
>>> A.toarray()
array([[1, 0],
       [0, 1]], dtype=int64)
>>> B = np.array([np.exp(-1.), np.exp(-2.)])
>>> B
array([ 0.36787944,  0.13533528])
>>> expm_multiply(A, B, start=1, stop=2, num=3, endpoint=True)
array([[ 1.        ,  0.36787944],
       [ 1.64872127,  0.60653066],
       [ 2.71828183,  1.        ]])
>>> expm(A).dot(B)                  # Verify 1st timestep
array([ 1.        ,  0.36787944])
>>> expm(1.5*A).dot(B)              # Verify 2nd timestep
array([ 1.64872127,  0.60653066])
>>> expm(2*A).dot(B)                # Verify 3rd timestep
array([ 2.71828183,  1.        ])