lgmres#
- scipy.sparse.linalg.lgmres(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=1000, M=None, callback=None, inner_m=30, outer_k=3, outer_v=None, store_outer_Av=True, prepend_outer_v=False)[原始碼]#
使用 LGMRES 演算法解矩陣方程式。
LGMRES 演算法 [1] [2] 旨在避免重新啟動 GMRES 中的收斂問題,並且通常在較少的迭代次數中收斂。
- 參數:
- A{稀疏陣列, ndarray, 線性算子}
線性系統的實數或複數 N 乘 N 矩陣。或者,
A
可以是一個線性算子,可以使用例如scipy.sparse.linalg.LinearOperator
來產生Ax
。- bndarray
線性系統的右手邊。形狀為 (N,) 或 (N,1)。
- x0ndarray
解的起始猜測值。
- rtol, atolfloat, optional
收斂性測試的參數。為了收斂,應滿足
norm(b - A @ x) <= max(rtol*norm(b), atol)
。預設值為rtol=1e-5
,atol
的預設值為0.0
。- maxiterint, optional
最大迭代次數。即使尚未達到指定的容忍度,迭代也會在 maxiter 步驟後停止。
- M{稀疏陣列, ndarray, 線性算子}, optional
A 的預處理器。預處理器應逼近 A 的反矩陣。有效的預處理可以顯著提高收斂速度,這表示達到給定的誤差容忍度所需的迭代次數更少。
- callbackfunction, optional
在每次迭代後呼叫的使用者提供的函數。它被呼叫為 callback(xk),其中 xk 是目前的解向量。
- inner_mint, optional
每次外部迭代的內部 GMRES 迭代次數。
- outer_kint, optional
在內部 GMRES 迭代之間攜帶的向量數量。根據 [1],良好的值範圍為 1…3。但是,請注意,如果您想使用額外的向量來加速解決多個相似的問題,則較大的值可能更有利。
- outer_vlist of tuples, optional
包含向量和相應的矩陣向量乘積
(v, Av)
的元組列表,用於擴增 Krylov 子空間,並在內部 GMRES 迭代之間攜帶。如果應重新評估矩陣向量乘積,則元素Av
可以是 None。此參數由lgmres
就地修改,並且可以在解決相似問題時用於傳入和傳出演算法的「猜測」向量。- store_outer_Avbool, optional
LGMRES 是否也應在 outer_v 列表中儲存 A@v 以及向量 v。預設值為 True。
- prepend_outer_vbool, optional
是否將 outer_v 擴增向量放在 Krylov 迭代之前。在標準 LGMRES 中,prepend_outer_v=False。
- 返回:
- xndarray
收斂解。
- infoint
提供收斂資訊
0 : 成功退出
>0 : 未達到容忍度收斂,迭代次數
<0 : 非法輸入或崩潰
註解
LGMRES 演算法 [1] [2] 旨在避免重新啟動 GMRES 中由於交替殘差向量而導致的收斂速度減慢。通常,它在記憶體需求相當的情況下,通常優於 GMRES(m),或者至少不會差太多。
此演算法的另一個優點是,您可以在 outer_v 參數中向其提供「猜測」向量,以擴增 Krylov 子空間。如果解接近這些向量的跨度,則演算法會更快收斂。如果需要一個接一個地反轉幾個非常相似的矩陣,例如在 Newton-Krylov 迭代中,其中 Jacobian 矩陣在非線性步驟中通常變化不大,這可能很有用。
參考文獻
範例
>>> import numpy as np >>> from scipy.sparse import csc_array >>> from scipy.sparse.linalg import lgmres >>> A = csc_array([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float) >>> b = np.array([2, 4, -1], dtype=float) >>> x, exitCode = lgmres(A, b, atol=1e-5) >>> print(exitCode) # 0 indicates successful convergence 0 >>> np.allclose(A.dot(x), b) True