gcrotmk#
- scipy.sparse.linalg.gcrotmk(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=1000, M=None, callback=None, m=20, k=None, CU=None, discard_C=False, truncate='oldest')[源代码]#
使用灵活的 GCROT(m,k) 算法求解
Ax = b
。- 参数:
- A{稀疏数组, ndarray, LinearOperator}
线性系统的实数或复数 N×N 矩阵。或者,A 可以是一个线性算子,它可以产生
Ax
,例如,使用LinearOperator
。- bndarray
线性系统的右侧。形状为 (N,) 或 (N,1)。
- x0ndarray
解的起始猜测。
- rtol, atol浮点型,可选
收敛测试的参数。为了收敛,应该满足
norm(b - A @ x) <= max(rtol*norm(b), atol)
。默认值为rtol=1e-5
和atol=0.0
。- maxiter整型,可选
最大迭代次数。即使未达到指定的容差,迭代也会在 maxiter 步后停止。默认值为
1000
。- M{稀疏数组, ndarray, LinearOperator}, 可选
A 的预处理器。预处理器应该近似 A 的逆。gcrotmk 是一种“灵活”算法,预处理器可以随迭代而变化。有效的预处理显着提高了收敛速度,这意味着需要更少的迭代才能达到给定的误差容限。
- callback函数,可选
用户提供的函数,在每次迭代后调用。它被调用为
callback(xk)
,其中xk
是当前解向量。- m整型,可选
每次外部迭代的内部 FGMRES 迭代次数。默认值:20
- k整型,可选
在内部 FGMRES 迭代之间携带的向量数。根据 [2],良好的值大约为 m。默认值:m
- CU元组列表,可选
元组列表
(c, u)
,其中包含 GCROT(m,k) 算法中矩阵 C 和 U 的列。有关详细信息,请参见 [2]。给定的列表和其中包含的向量会就地修改。如果未给出,则从空矩阵开始。元组中的c
元素可以为None
,在这种情况下,向量将通过c = A u
重新计算,并如 [3] 中所述进行正交化。- discard_C布尔值,可选
在最后丢弃 C 向量。如果为不同的线性系统回收 Krylov 子空间,则很有用。
- truncate{‘oldest’, ‘smallest’}, 可选
要使用的截断方案。丢弃:最旧的向量,或使用 [1,2] 中讨论的方案具有最小奇异值的向量。有关详细比较,请参见 [2]。默认值:‘oldest’
- 返回值:
- xndarray
找到的解决方案。
- info整型
提供收敛信息
0 : 成功退出
>0 : 未达到收敛容限,迭代次数
参考文献
[1]E. de Sturler, “最佳 Krylov 子空间方法的截断策略”,SIAM J. Numer. Anal. 36, 864 (1999)。
[2] (1,2,3)J.E. Hicken 和 D.W. Zingg, “用于求解非对称线性系统的 GCROT 的简化和灵活变体”,SIAM J. Sci. Comput. 32, 172 (2010)。
[3]M.L. Parks, E. de Sturler, G. Mackey, D.D. Johnson, S. Maiti, “线性系统序列的 Krylov 子空间回收”,SIAM J. Sci. Comput. 28, 1651 (2006)。
示例
>>> import numpy as np >>> from scipy.sparse import csc_array >>> from scipy.sparse.linalg import gcrotmk >>> R = np.random.randn(5, 5) >>> A = csc_array(R) >>> b = np.random.randn(5) >>> x, exit_code = gcrotmk(A, b, atol=1e-5) >>> print(exit_code) 0 >>> np.allclose(A.dot(x), b) True