expm_multiply#
- scipy.sparse.linalg.expm_multiply(A, B, start=None, stop=None, num=None, endpoint=None, traceA=None)[原始碼]#
計算矩陣 A 指數函數作用於 B 的結果。
- 參數:
- A可轉置的線性運算子
感興趣的指數函數的運算子。
- Bndarray
要與 A 的矩陣指數相乘的矩陣或向量。
- start純量,可選
序列的起始時間點。
- stop純量,可選
序列的結束時間點,除非 endpoint 設定為 False。在這種情況下,序列由
num + 1
個均勻間隔的時間點組成,但不包含最後一個,因此會排除 stop。請注意,當 endpoint 為 False 時,步長會改變。- num整數,可選
要使用的時間點數量。
- endpoint布林值,可選
如果為 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. ])