scipy.sparse.linalg.

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),其中 argscallback_type 選擇。

callback_type{‘x’, ‘pr_norm’, ‘legacy’},可選
請求的回呼函數參數
  • x:目前的迭代 (ndarray),在每次重新啟動時呼叫

  • pr_norm:相對(預處理)殘差範數 (float),在每次內部迭代時呼叫

  • legacy(預設):與 pr_norm 相同,但也將 maxiter 的含義更改為計算內部迭代次數而不是重新啟動週期。

如果未設定 callback,則此關鍵字無效。

返回:
xndarray

收斂的解。

infoint
提供收斂資訊

0:成功退出 >0:未達到容差的收斂,迭代次數

另請參閱

LinearOperator

註解

選擇預處理器 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