當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy linalg.gmres用法及代碼示例


本文簡要介紹 python 語言中 scipy.sparse.linalg.gmres 的用法。

用法:

scipy.sparse.linalg.gmres(A, b, x0=None, *, tol=<object object>, restart=None, maxiter=None, M=None, callback=None, restrt=<object object>, atol=0.0, callback_type=None, rtol=1e-05)#

使用廣義最小殘差迭代求解 Ax = b

參數

A {稀疏矩陣,ndarray,LinearOperator}

線性係統的實數或複數N-by-N 矩陣。或者,A 可以是一個線性運算符,它可以使用例如 scipy.sparse.linalg.LinearOperator 生成 Ax

b ndarray

線性係統的右手邊。具有形狀 (N,) 或 (N,1)。

x0 ndarray

開始猜測解決方案(默認情況下為零向量)。

atol, rtol 浮點數

收斂測試的參數。為了收斂,應滿足norm(b - A @ x) <= max(rtol*norm(b), atol)。默認為 atol=0.rtol=1e-5

restart 整數,可選

重新啟動之間的迭代次數。較大的值會增加迭代成本,但對於收斂可能是必要的。如果省略,則使用min(20, n)

maxiter 整數,可選

最大迭代次數(重新啟動周期)。即使尚未達到指定的容差,迭代也會在 maxiter 步驟後停止。請參閱callback_type。

M {稀疏矩陣,ndarray,LinearOperator}

A 的預條件子的逆。M 應該近似於 A 的逆,並且很容易求解(參見注釋)。有效的預處理可以顯著提高收斂速度,這意味著達到給定的容錯能力所需的迭代次數更少。默認情況下,不使用預處理器。在此實現中,使用左預處理,並且最小化預處理殘差。然而,最終的收斂是針對 b - A @ x 殘差進行測試的。

callback 函數

每次迭代後調用的用戶提供的函數。它被稱為回調(args),其中args由callback_type選擇。

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

  • pr_norm:相對(預處理)殘差範數(浮點),在每次內部迭代時調用

  • legacy(默認):與pr_norm,但也改變了含義馬克西特計算內部迭代而不是重新啟動周期。

如果未設置回調,則該關鍵字無效。

restrt int,可選,已棄用
tol 浮點數,可選,已棄用

返回

x ndarray

融合解決方案。

info int
提供收斂信息:

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_matrix
>>> from scipy.sparse.linalg import gmres
>>> A = csc_matrix([[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

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.sparse.linalg.gmres。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。