scipy.sparse.linalg.

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-5atol 的預設值為 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 矩陣在非線性步驟中通常變化不大,這可能很有用。

參考文獻

[1] (1,2,3)

A.H. Baker 和 E.R. Jessup 和 T. Manteuffel,“加速重新啟動 GMRES 收斂的技術”,SIAM J. Matrix Anal. Appl. 26, 962 (2005)。

[2] (1,2)

A.H. Baker,“關於改進線性求解器重新啟動 GMRES 的效能”,博士論文,科羅拉多大學 (2003)。

範例

>>> 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