BicGStab 生成意外的故障标志



我需要求解一连串稀疏线性系统Ax=b。第一个系统的解决方案x是第二个系统的输入,第二个系统是第三个系统的输入,依此类推。由于数值误差复合和其他原因,我必须使用scipy.sparse.linalg.bicgstab作为线性求解器。然而,对于一个甚至没有条件并且肯定有逆的系统,求解器给了我一个标志:"非法输入或故障"。

import numpy as np
from scipy.sparse.linalg import bicgstab, inv
from scipy import sparse
A = np.array(
[[ -1.,   0.,   0.,   0.,   0.,   0.,   0.,   0.],
[  0.,  -1.,   0.,   0.,   0.,   0.,   0.,   0.],
[  0.,   0., -10.,   0.,   0.,   0.,   0.,   0.],
[  0.,   0.,   0., -10.,   0.,   0.,   0.,   0.],
[  0.,   0.,   3.,   0.,  -3.,   0.,   0.,   0.],
[  0.,   0.,   0.,   3.,   0.,  -3.,   0.,   0.],
[  0.,   0.,   0.,   7.,   3.,   0., -10.,   0.],
[  0.,   0.,   7.,   0.,   0.,   3.,   0., -10.]]
)
A = -sparse.csc_matrix(A)
b = np.array([ 1.,  0., 10.,  0.,  0.,  0.,  0.,  0.])
x, flag = bicgstab(A=A, b=b, maxiter=40, tol=1e-6)
x, flag
>>> (array([1.        , 0.        , 1.        , 0.        , 1.00118012,
0.        , 0.3004875 , 0.70009946]), -10)

只是为了证明这一点

inv(A).dot(b)
>>> array([1. , 0. , 1. , 0. , 1. , 0. , 0.3, 0.7])

上面的输出正是我所期望的。有谁知道为什么 bicgstab 没有给我所需的输出?我找不到有关 bicgstab 非法输入或故障的文档,因此我是关于 SO 的问题。

-10错误代码并不一定意味着您的输入错误;在您的情况下,故障很可能发生在迭代求解期间。

通过稍微改变您的 RHS:

b = np.array([ 1.,  0., 0.,  0.,  10.,  0.,  0.,  0.])

即使没有预调节器,scipy.bicgstab也不会有收敛的麻烦:

x, flag = bicgstab(A=A, b=b, maxiter=40, tol=1e-6)
print (x, flag)
(array([1.        , 0.        , 0.        , 0.        , 3.33333333,
0.        , 1.        , 0.        ]), 0)

矩阵具有逆条件数和体面条件数的事实

print(np.linalg.cond(A))
14.616397823169317

不保证可以轻松获得特定 RHS的解,尤其是使用迭代求解器或特定迭代求解器。在我看来(没有对矩阵谱及其核空间进行详细分析(,您的 RHS 正好位于这样一个"坏区域"。

如果您只是对解决方案感兴趣,我建议您切换到GMRES:

x, flag = gmres(A=A, b=b, maxiter=40, tol=1e-6)
(

数组([1. , 0. , 0.1 , 0. , 0.1 , 0. , 0.03, 0.07](, 0(

如果您有兴趣调查为什么BiCGStab失败,而GMRES成功解决了该系统,我会邀请您向计算科学SE提出缩小范围的问题。

相关内容

  • 没有找到相关文章

最新更新