scipy.sparse.linalg.

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.        ])