线性方程组:直接求解器有效,迭代求解器无效

计算科学 线性求解器 迭代法 共轭梯度
2021-12-16 14:49:34

我必须在 b = A*x 中求解 x,其中 a 是稀疏的。这适用于 Matlab 的 mldivide:x = A \ b。由于我将不得不对非常大的 A 使用迭代算法,因此我目前正在测试 Matlab 的迭代算法,特别是 bicgstab:

[L, U] = ilu(A, struct('type', 'ilutp', 'droptol', 0.0000001, 'udiag', 0));
[delta2, flag, relres, iter] = bicgstab(A, b, 0.0000001, 2000, L, U);

基本上,这适用于使用 randn(...) 生成的一般向量 b。但它不适用于我的问题中的向量 b 。在这种情况下不起作用意味着:它执行一次或仅几次迭代并返回标志 1,表示它没有在允许的迭代次数内收敛。与 x = A \b 的解相比,返回的向量是错误的。

向量 b 和矩阵 A 的值在很大的幅度范围内(大约 1e10),矩阵 A 是一个一般的稀疏矩阵,维度大约为 2000x2000,条件大约为 1e14

我目前唯一的想法是更改矩阵后面系统的物理单位,使大值变小,小值变大。

我知道关于这个问题的信息很少,但我很乐意提供任何提示,尤其是如何找到有关该问题的更多信息。

1个回答

问题出在底层耦合 PDE FEM 模型中。该模型包括一个在任何点都不固定的势,因此任何结果势 = phi + C 都是一个解,其中 C 是一个积分常数。我不知道为什么,但是直接求解器(使用 UMFPACK 的 Matlab 的 \)找到了一个解决方案,而迭代求解器遇到了巨大的麻烦。

我首先检查了对角线上的所有子矩阵——耦合 PDE 系统中每个变量到自身的映射。所以我发现这个势的矩阵条件很差。其次,我发现消除该矩阵中的任何行+相应列都会使条件正常,这暗示其中一个行/列是线性相关的,这告诉我,一个自由度太多了。我怀疑是积分常数在修复其中一个点后被证明是正确的猜测。