scipy.sparse.linalg.

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) 算法求解矩阵方程。

参数
A{稀疏数组,ndarray,线性算子}

线性系统的实数或复数 N×N 矩阵。或者,A 可以是线性算子,它可以使用例如 LinearOperator 生成 Ax

bndarray

线性系统的右侧。形状为 (N,) 或 (N,1)。

x0ndarray

解的初始猜测。

rtol, atol浮点数,可选

收敛测试的参数。为了收敛,应满足 norm(b - A @ x) <= max(rtol*norm(b), atol)。默认值为 rtol=1e-5atol=0.0

maxiter整数,可选

最大迭代次数。即使未达到指定的容差,迭代也会在 maxiter 步后停止。默认值为 1000

M{稀疏数组,ndarray,线性算子},可选

A 的预处理器。预处理器应近似于 A 的逆。gcrotmk 是一种“灵活”的算法,预处理器可以逐次迭代地变化。有效的预处理可以显著提高收敛速度,这意味着需要较少的迭代才能达到给定的误差容限。

callback函数,可选

用户提供的函数,在每次迭代后调用。它被调用为 callback(xk),其中 xk 是当前解向量。

m整数,可选

每次外部迭代的内部 FGMRES 迭代次数。默认值:20

k整数,可选

在内部 FGMRES 迭代之间携带的向量数量。根据 [2],好的值在 m 附近。默认值:m

CU元组列表,可选

包含 GCROT(m,k) 算法中矩阵 C 和 U 的列的元组 (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