scipy.sparse.linalg.

gcrotmk#

scipy.sparse.linalg.gcrotmk(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=1000, M=None, callback=None, m=20, k=None, CU=None, discard_C=False, truncate='oldest')[source]#

使用彈性 GCROT(m,k) 演算法解矩陣方程式。

參數:
A{稀疏陣列, ndarray, 線性算符}

線性系統的實數或複數 N×N 矩陣。 或者,A 可以是一個線性算符,它可以使用例如 LinearOperator 來產生 Ax

bndarray

線性系統的右側。 形狀為 (N,) 或 (N,1)。

x0ndarray

解的起始猜測值。

rtol, atolfloat, 選用項目

收斂性測試的參數。 為了收斂,應該滿足 norm(b - A @ x) <= max(rtol*norm(b), atol)。 預設值為 rtol=1e-5atol=0.0

maxiterint, 選用項目

最大迭代次數。 即使尚未達到指定的容差,迭代也會在 maxiter 步驟後停止。 預設值為 1000

M{稀疏陣列, ndarray, 線性算符}, 選用項目

A 的預處理器。 預處理器應近似於 A 的反矩陣。 gcrotmk 是一種「彈性」演算法,預處理器可能會因迭代而異。 有效的預處理可以顯著提高收斂速度,這表示達到給定的誤差容差所需的迭代次數更少。

callback函數, 選用項目

在每次迭代後呼叫的使用者提供函數。 它被呼叫為 callback(xk),其中 xk 是目前的解向量。

mint, 選用項目

每次外部迭代的內部 FGMRES 迭代次數。 預設值:20

kint, 選用項目

在內部 FGMRES 迭代之間攜帶的向量數量。 根據 [2],好的值約為 m。 預設值:m

CUtuple 列表, 選用項目

tuple 列表 (c, u),其中包含 GCROT(m,k) 演算法中矩陣 C 和 U 的列。 有關詳細資訊,請參閱 [2]。 給定的列表和其中包含的向量會就地修改。 如果未給定,則從空矩陣開始。 tuple 中的 c 元素可以是 None,在這種情況下,向量會在啟動時透過 c = A u 重新計算,並按照 [3] 中的描述進行正交化。

discard_Cbool, 選用項目

在結尾處捨棄 C 向量。 如果為不同的線性系統回收 Krylov 子空間,則很有用。

truncate{‘oldest’, ‘smallest’}, 選用項目

要使用的截斷方案。 捨棄:最舊的向量,或使用 [1,2] 中討論的方案捨棄具有最小奇異值的向量。 有關詳細比較,請參閱 [2]。 預設值:'oldest'

返回:
xndarray

找到的解。

infoint

提供收斂資訊

  • 0 : 成功退出

  • >0 : 未達到收斂容差,迭代次數

參考文獻

[1]

E. de Sturler, ‘’Truncation strategies for optimal Krylov subspace methods’’, SIAM J. Numer. Anal. 36, 864 (1999).

[2] (1,2,3)

J.E. Hicken and D.W. Zingg, ‘’A simplified and flexible variant of GCROT for solving nonsymmetric linear systems’’, SIAM J. Sci. Comput. 32, 172 (2010).

[3]

M.L. Parks, E. de Sturler, G. Mackey, D.D. Johnson, S. Maiti, ‘’Recycling Krylov subspaces for sequences of linear systems’’, SIAM J. Sci. Comput. 28, 1651 (2006).

範例

>>> import numpy as np
>>> from scipy.sparse import csc_array
>>> from scipy.sparse.linalg import gcrotmk
>>> R = np.random.randn(5, 5)
>>> A = csc_array(R)
>>> b = np.random.randn(5)
>>> x, exit_code = gcrotmk(A, b, atol=1e-5)
>>> print(exit_code)
0
>>> np.allclose(A.dot(x), b)
True