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乘N矩阵。或者,
A
可以是线性运算符,它可以产生Ax
使用,例如,scipy.sparse.linalg.LinearOperator
。- bndarray
线性系统的右侧。具有形状(N,)或(N,1)。
- x0ndarray
开始猜测解决方案。
- TOL,ATOL浮动,可选
收敛容差,
norm(residual) <= max(tol*norm(b), atol)
。的默认设置atol
是 tol 。警告
的默认值 atol 将在将来的版本中进行更改。为了将来的兼容性,请指定 atol 明确地说。
- maxiter整型,可选
最大迭代次数。即使未达到指定的公差,迭代也将在最大步长后停止。
- M{稀疏矩阵,ndarray,LinearOperator},可选
A的预条件。预条件应该近似于A的逆。有效的预处理显著地提高了收敛速度,这意味着达到给定的误差容限所需的迭代次数更少。
- callback函数,可选
每次迭代后要调用的用户提供的函数。它被称为回调(Xk),其中xk是当前的解向量。
- inner_m整型,可选
每个外部迭代的内部GMRES迭代数。
- outer_k整型,可选
内部GMRES迭代之间要携带的向量数。根据 [1], 好值在1.3的范围内。但是,请注意,如果要使用附加向量来加速解决多个类似问题,较大的值可能是有益的。
- outer_v元组列表,可选
包含元组的列表
(v, Av)
向量和相应的矩阵-向量乘积,用于扩充Krylov子空间,并在内部GMRES迭代之间进行。该元素Av
可以是 None 是否应该重新计算矩阵向量积。此参数由就地修改lgmres
,并可用于在解决类似问题时将“猜测”向量传入和传出算法。- store_outer_Av布尔值,可选
除向量外,LGMRES是否还应存储A*v v 在 outer_v 列表。默认值为True。
- prepend_outer_v布尔值,可选
是否在Krylov迭代之前放置out_v增广向量。在标准LGMRES中,Prepend_out_v=FALSE。
- 退货
- xndarray
收敛的解。
- info集成
提供融合信息:
0:退出成功
>0:未达到容差收敛,迭代次数
<0:非法输入或细分
注意事项
LGMRES算法 [1] [2] 被设计用来避免重新启动的GMRES由于交替的残差向量而导致收敛速度变慢。通常,它的性能通常在某种程度上超过可比内存需求的GMRES(M),或者至少不会差很多。
此算法的另一个优点是,您可以在 outer_v 扩充Krylov子空间的自变量。如果解位于这些向量的跨度附近,则算法收敛更快。如果几个非常相似的矩阵需要一个接一个地求逆,例如在牛顿-克里洛夫迭代中,其中雅可比矩阵在非线性步骤中通常变化很小,这可能是有用的。
参考文献
- 1(1,2,3)
A.H.贝克和E.R.Jessup和T.Manteuffel,“加速重启GMRES收敛的技术”,SIAM J.Matrix anal。应用程序。26962(2005)。
- 2(1,2)
A.H.Baker,“关于改进线性求解器重新启动GMRES的性能”,科罗拉多大学博士论文(2003)。
示例
>>> 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) >>> print(exitCode) # 0 indicates successful convergence 0 >>> np.allclose(A.dot(x), b) True