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


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


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

用法:

scipy.sparse.linalg.lgmres(A, b, x0=None, *, tol=1e-05, maxiter=1000, M=None, callback=None, inner_m=30, outer_k=3, outer_v=None, store_outer_Av=True, prepend_outer_v=False, atol=None)#

使用 LGMRES 算法求解矩陣方程。

LGMRES 算法 [1] [2] 旨在避免重新啟動的 GMRES 收斂中的一些問題,並且通常在較少的迭代中收斂。

參數

A {稀疏矩陣,ndarray,LinearOperator}

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

b ndarray

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

x0 ndarray

開始猜測解決方案。

tol, atol 浮點數,可選

收斂公差,norm(residual) <= max(tol*norm(b), atol).默認為atoltol.

警告

atol 的默認值將在未來版本中更改。為了將來的兼容性,請明確指定 atol。

maxiter 整數,可選

最大迭代次數。即使沒有達到指定的容差,迭代也會在 maxiter 步後停止。

M {稀疏矩陣,ndarray,LinearOperator},可選

A 的預處理器。預處理器應該近似於 A 的逆。有效的預處理顯著提高了收斂速度,這意味著需要更少的迭代來達到給定的誤差容限。

callback 函數,可選

每次迭代後調用的用戶提供的函數。它被稱為 callback(xk),其中 xk 是當前解向量。

inner_m 整數,可選

每次外部迭代的內部 GMRES 迭代次數。

outer_k 整數,可選

在內部 GMRES 迭代之間攜帶的向量數。根據 [1],好的值在 1…3 的範圍內。但是,請注意,如果您想使用額外的向量來加速解決多個類似問題,較大的值可能是有益的。

outer_v 元組列表,可選

包含元組的列表(v, Av)向量和相應的matrix-vector 乘積,用於增強 Krylov 子空間,並在內部 GMRES 迭代之間進行。元素AvNone如果應該重新評估matrix-vector 產品。此參數通過以下方式就地修改lgmres, 並且可用於在解決類似問題時將“guess” 向量傳入和傳出算法。

store_outer_Av 布爾型,可選

LGMRES 是否應該在 outer_v 列表中除了向量 v 之外還存儲 A@v。默認為真。

prepend_outer_v 布爾型,可選

是否在 Krylov 迭代之前放置 outer_v 擴充向量。在標準 LGMRES 中,prepend_outer_v=False。

返回

x ndarray

融合解決方案。

info int

提供收斂信息:

  • 0 : successful exit

  • >0 : convergence to tolerance not achieved, number of iterations

  • <0 : illegal input or breakdown

注意

LGMRES 算法 [1] [2] 旨在避免由於交替殘差向量而導致重新啟動的 GMRES 中收斂速度變慢。通常,它在某些方麵通常優於可比較的內存要求的 GMRES(m),或者至少不會差很多。

該算法的另一個優點是您可以在 outer_v 參數中為其提供 ‘guess’ 向量,以增加 Krylov 子空間。如果解決方案接近這些向量的跨度,則算法收斂速度更快。如果需要一個接一個地反轉幾個非常相似的矩陣,這可能很有用,例如在 Newton-Krylov 迭代中,雅可比矩陣在非線性步驟中通常變化很小。

參考

[1] (1,2,3)

A.H. Baker 和 E.R. Jessup 和 T. Manteuffel,“加速重啟 GMRES 收斂的技術”,SIAM J. Matrix Anal。應用程序。 26, 962 (2005)。

[2] (1,2)

A.H. Baker,“關於提高線性求解器的性能重新啟動 GMRES”,PhD 論文,科羅拉多大學(2003 年)。

例子

>>> import numpy as np
>>> from scipy.sparse import csc_matrix
>>> from scipy.sparse.linalg import lgmres
>>> A = csc_matrix([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float)
>>> b = np.array([2, 4, -1], dtype=float)
>>> x, exitCode = lgmres(A, b, atol=1e-5)
>>> print(exitCode)            # 0 indicates successful convergence
0
>>> np.allclose(A.dot(x), b)
True

相關用法


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