gmres#
- scipy.sparse.linalg.gmres(A, b, x0=None, *, rtol=1e-05, atol=0.0, restart=None, maxiter=None, M=None, callback=None, callback_type=None)[來源]#
使用廣義最小殘差迭代法來解
Ax = b
。- 參數:
- A{稀疏陣列, ndarray, LinearOperator}
線性系統的實數或複數 N 乘 N 矩陣。或者,A 可以是線性算子,它可以使用例如
scipy.sparse.linalg.LinearOperator
來產生Ax
。- bndarray
線性系統的右側。形狀為 (N,) 或 (N,1)。
- x0ndarray
解的起始猜測值(預設為零向量)。
- atol, rtolfloat
收斂性測試的參數。為了收斂,應滿足
norm(b - A @ x) <= max(rtol*norm(b), atol)
。預設值為atol=0.
和rtol=1e-5
。- restartint,可選
重新啟動之間的迭代次數。較大的值會增加迭代成本,但對於收斂可能是必要的。如果省略,則使用
min(20, n)
。- maxiterint,可選
最大迭代次數(重新啟動週期)。即使尚未達到指定的容差,迭代也會在 maxiter 步驟後停止。請參閱 callback_type。
- M{稀疏陣列, ndarray, LinearOperator}
A 的預處理器的逆矩陣。M 應該近似於 A 的逆矩陣,並且易於求解(請參閱「註解」)。有效的預處理可以顯著提高收斂速度,這表示達到給定的誤差容差所需的迭代次數更少。預設情況下,不使用預處理器。在此實作中,使用左預處理,並最小化預處理後的殘差。但是,最終收斂性是針對
b - A @ x
殘差進行測試的。- callbackfunction
在每次迭代後呼叫的使用者提供的函數。它被呼叫為
callback(args)
,其中args
由 callback_type 選擇。- callback_type{‘x’, ‘pr_norm’, ‘legacy’},可選
- 請求的回呼函數參數
x
:目前的迭代 (ndarray),在每次重新啟動時呼叫pr_norm
:相對(預處理)殘差範數 (float),在每次內部迭代時呼叫legacy
(預設):與pr_norm
相同,但也將 maxiter 的含義更改為計算內部迭代次數而不是重新啟動週期。
如果未設定 callback,則此關鍵字無效。
- 返回:
- xndarray
收斂的解。
- infoint
- 提供收斂資訊
0:成功退出 >0:未達到容差的收斂,迭代次數
另請參閱
註解
選擇預處理器 P,使得 P 接近 A 但易於求解。此常式所需的預處理器參數為
M = P^-1
。最好不要顯式計算逆矩陣。而是使用以下範本來產生 M# Construct a linear operator that computes P^-1 @ x. import scipy.sparse.linalg as spla M_x = lambda x: spla.spsolve(P, x) M = spla.LinearOperator((n, n), M_x)
範例
>>> import numpy as np >>> from scipy.sparse import csc_array >>> from scipy.sparse.linalg import gmres >>> A = csc_array([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float) >>> b = np.array([2, 4, -1], dtype=float) >>> x, exitCode = gmres(A, b, atol=1e-5) >>> print(exitCode) # 0 indicates successful convergence 0 >>> np.allclose(A.dot(x), b) True