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-5
和atol=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