jax.scipy.sparse.linalg.gmres#
- jax.scipy.sparse.linalg.gmres(A, b, x0=None, *, tol=1e-05, atol=0.0, restart=20, maxiter=None, M=None, solve_method='batched')[源代码]#
GMRES 求解线性系统 A x = b 的 x,给定 A 和 b。
A 被指定为一个执行 A(vi) -> vf = A @ vi 的函数,原则上不需要有任何特殊的属性,例如对称性。 然而,对于近似对称的算子,收敛速度通常很慢。
- 参数:
A (ndarray, 函数, 或 matmul兼容对象) – 2D 数组或函数,用于计算线性映射(矩阵-向量乘积)
Ax
,当像A(x)
或A @ x
这样调用时。A
必须返回与其参数具有相同结构和形状的数组。b (数组 或 数组树) – 线性系统的右侧,表示单个向量。可以存储为数组或任意形状的数组的 Python 容器。
x0 (数组 或 数组树, 可选) – 解的起始猜测。必须与
b
具有相同的结构。如果未指定,则使用零值。tol (float, 可选) – 收敛的容差,
norm(residual) <= max(tol*norm(b), atol)
。我们没有实现 SciPy 的“旧式”行为,因此 JAX 的容差将与 SciPy 不同,除非您显式将atol
传递给 SciPy 的gmres
。atol (float, 可选) – 收敛的容差,
norm(residual) <= max(tol*norm(b), atol)
。我们没有实现 SciPy 的“旧式”行为,因此 JAX 的容差将与 SciPy 不同,除非您显式将atol
传递给 SciPy 的gmres
。restart (整数, 可选) – Krylov 子空间的大小(“迭代次数”),在重启之间构建。 GMRES 通过将真实解 x 近似为它在该维度的 Krylov 空间中的投影来工作 - 因此该参数限制了任何猜测解可以达到的最大精度。较大的值会增加迭代次数和迭代成本,但对于收敛可能是必要的。如果在构建完整子空间之前达到收敛,则算法会提前终止。 默认值为 20。
maxiter (整数) – 从上次迭代找到的解开始,重新构建大小为
restart
的 Krylov 空间的最大次数。 如果 GMRES 停止或非常慢,则减少此参数可能会有所帮助。 默认值是无限大。M (ndarray, 函数, 或 matmul兼容对象) – A 的预处理器。 预处理器应该近似 A 的逆。 有效的预处理显着提高了收敛速度,这意味着需要更少的迭代次数才能达到给定的误差容差。
solve_method ('incremental' 或 'batched') – ‘incremental’ 求解方法使用 Givens 旋转在 GMRES 过程中逐步构建 Krylov 子空间的 QR 分解。 这提高了数值稳定性,并提供残差范数的自由估计,从而允许在单个“重启”中提前终止。 相比之下,‘batched’ 求解方法在每次 GMRES 迭代结束时从头开始求解最小二乘问题。 它不允许提前终止,但在 GPU 上的开销要小得多。
- 返回:
x (数组或数组树) – 收敛的解。与
b
具有相同的结构。info (None) – 收敛信息的占位符。 未来,JAX 将报告未达到收敛时的迭代次数,如 SciPy。