在 MATLAB 中迭代求解 3D 泊松方程

计算科学 有限差分 线性求解器 稀疏矩阵 迭代法 泊松
2021-12-16 14:28:00

我编写了一个函数,它以相对有效的方式为 3D Poisson 方程设置稀疏矩阵A和 RHS b 。设置没有什么花哨的:我已经将 2D 5 点模板扩展为等效的 3D 7 点模板。导体(此时)只是 Dirichlet BC 的块,我(还)没有考虑电介质。因此,构造的 A非常简单:

  • 非零项的最大数量是Nx*Ny*Nz*7
  • 在实践中,我的实际非零项数约为最大值的 90%
  • 由于 BC,A是非对称的(我应该从一开始就提到这一点

通过在 50-100 之间运行 Nx、Ny 和 Nz 的一些非常简单的问题,然后使用mldivide. 但是,对于这些测试问题,我的峰值内存使用量已经达到了 ~20GB,而我将使用更大的数组来解决我的实际问题。

所以现在我正在研究迭代方法,但我的知识目前并没有超出 Gauss-Seidel、Jacobi 和 SOR。当我尝试使用任何开箱即用的内置迭代求解器时,我通常会收到以下消息:

METHOD stopped at iteration 2 without converging to the desired tolerance 1e-06
because a scalar quantity became too small or too large to continue computing.
The iterate returned (number 1) has relative residual 0.97.

由于这是一个非常常见的解决系统,我希望能轻松找到一些相关资源,但我发现有用的信息比我预期的要少得多。一些建议和指示将不胜感激!

1个回答

Poisson 方程的有限差分矩阵是对称的和正定的。因此,预处理共轭梯度算法是该问题的首选迭代求解器。

预处理器的选择对方法的收敛性有很大的影响。众所周知,不完全 Cholesky 分解可以很好地解决这个问题。

以下 MATLAB 代码构造 3D Poisson 问题的有限差分矩阵,并求解所有 1 右侧的方程。

function laplaceEqnTestCSE
n = 50;
L=1;
h = L/(n+1);
dim=3;
K=laplaceEqn(dim, n);
neq = rows(K);
b = ones(neq,1);
ne2 = ceil(neq/2);
tic
disp('Begin solve.');
if(0)
u = K\b;
else
tol=1e-8;
maxIter=100;
L = ichol(K);
u = pcg(K, b, tol, maxIter, L, L');
end
toc
end

function K=laplaceEqn(dim, n)
h = 1/(n+1);

K1D = spdiags(ones(n,1)*[-1 2 -1],-1:1,n,n);  % 1d Poisson matrix
%subplot(2,3,4), spy(K1D)
if(dim==1)
K = K1D/h^2;
return;
end

I1D = speye(size(K1D));                       % 1d identity matrix
K2D = kron(K1D,I1D)+kron(I1D,K1D);            % 2d Poisson matrix
%subplot(2,3,5), spy(K2D)
if(dim==2)
K = K2D/h^2;
return;
end

I2D = speye(size(K2D));                       % 2d identity matrix
K3D = kron(K2D,I1D)+kron(I2D,K1D);            % 3d Poisson matrix
if(dim==3)
K = K3D/h^2;
return;
end

end

我在 Octave 中运行了这段代码,并在 54 次迭代中得到了一个收敛的解决方案。在我的桌面 Windows PC 上花了大约一秒钟。

一些评论指出,一些离散边界条件或引入空间变化系数的方法可能会导致不对称的有限差分矩阵。但从根本上说,拉普拉斯算子是自伴的,因此理想情况下,我们希望数值系数矩阵也是自伴的(即对称的)。如果不是这种情况,离散化方法可能不是最好的方法。Leveque 的有限差分法入门书(Leveque) 以前在这里推荐过。它解决了如何应用边界条件的问题,以及在示例 2.1 中如何处理空间变化的系数以保持系数矩阵的对称性。套用 Leveque 的话说,通过取导数然后用 FD 对其进行近似来处理空间变化系数的最“明显”方法并不是离散这种情况的最佳方法。他更详细地讨论了为什么原始 PDE 的重要基本性质应该反映在数值近似中。