expm_multiply#
- scipy.sparse.linalg.expm_multiply(A, B, start=None, stop=None, num=None, endpoint=None, traceA=None)[源代码][源代码]#
计算矩阵指数 A 对 B 的作用。
- 参数:
- A可转置线性算子
感兴趣的指数的算子。
- Bndarray
要与 A 的矩阵指数相乘的矩阵或向量。
- 开始标量,可选
序列的起始时间点。
- 停止标量,可选
序列的结束时间点,除非 endpoint 设置为 False。在这种情况下,序列包含所有但最后一个
num + 1均匀间隔的时间点,因此 stop 被排除。注意,当 endpoint 为 False 时,步长会改变。- numint, 可选
要使用的时点数量。
- 端点bool, 可选
如果为真,stop 是最后一个时间点。否则,它不包括在内。
- traceA标量,可选
A 的迹。如果没有给出,迹会为线性算子估计,或为稀疏矩阵精确计算。它用于预处理 A,因此近似的迹是可以接受的。对于线性算子,应提供 traceA 以确保性能,因为估计并不保证在所有情况下都可靠。
Added in version 1.9.0.
- 返回:
- expm_A_Bndarray
动作的结果 \(e^{t_k A} B\)。
- 警告:
- 用户警告
如果 A 是一个线性算子且 ``traceA=None``(默认)。
注释
定义均匀间隔时间点的可选参数与
numpy.linspace的参数兼容。输出 ndarray 的形状有些复杂,所以我在这里解释一下。输出的 ndim 可以是 1、2 或 3。如果是计算单个向量在单个时间点的 expm 作用,那么 ndim 将是 1。如果是计算向量在多个时间点的 expm 作用,或者计算矩阵在单个时间点的 expm 作用,那么 ndim 将是 2。如果是计算具有多个列的矩阵在多个时间点的 expm 作用,那么 ndim 将是 3。如果请求了多个时间点,expm_A_B[0] 将始终是第一个时间点的 expm 作用,无论作用对象是向量还是矩阵。
参考文献
[1]Awad H. Al-Mohy 和 Nicholas J. Higham (2011) “计算矩阵指数的作用,及其在指数积分器中的应用。” SIAM 科学计算杂志,33 (2)。第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_matrix >>> from scipy.sparse.linalg import expm, expm_multiply >>> A = csc_matrix([[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. ])