我需要在存在电介质的情况下检查各种电极配置周围的(静态)电场分布,并且一直在对二维广义泊松方程使用有限差分方法来做到这一点。James Nagel 的好论文位于 http://www.drjamesnagel.com/notes/Nagel%20-%20Numerical%20Poisson.pdf 一直是我的向导,并建议对泊松方程的离散积分形式进行 SOR。但 Nagel 的论文还指出,对于大介电常数——我有——SOR 收敛缓慢或失败:然后他使用 Matlab/Octave "\" 作为稀疏系统矩阵上的黑盒操作。这对我来说在高达 300x300 网格或附近的问题上效果很好 - 但它很慢,我真的想使用 C 或类似的东西与其他例程集成。因此,我正在寻求有关适用于此问题的合适算法的建议。我认为 ADI 可能是我需要的——但在学习如何编码和使用它之前,我会重视指导,也许还有其他建议。也许我只需要调用“\”的LAPACK版本?当然,我想要无条件的稳定性、高精度和即时收敛!谢谢阅读!
求二维广义泊松解算法推荐
有许多优秀的代码可以解决泊松方程。我可以向您指出http://dealii.org/developer/doxygen/deal.II/step_6.html上的 deal.II 教程的第 6 步, 这只是一个示例。(免责声明:这是我自己的代码。)大多数其他有限元库都有类似的示例代码。
解决这个问题的一个好方法是使用现有的强大的数值包,例如 PETSc。寻找解决泊松方程的 PETSc 示例,这将是一个很好的起点。
FDM 论文(我个人写的,顺便说一句)更多地用于基础教育,而不是用于大规模实施。您可能已经注意到,大型域的主要瓶颈是设置系统矩阵并将其反转。根据我的经验,Matlab 在尝试直接运行反演时只是内存不足,因此您必须聪明地执行此步骤。我尽我最大的努力尝试简化代码中的这一步,但是为这种计算获得一个实心矩阵求逆本身就是一个数值挑战。如果有人有一些聪明的更新可以让我的代码处理更大的矩阵,我很想听听。
...当然,您也可以随时使用 FEM,并更有效地对网格进行采样。:)
编辑:在处理稀疏矩阵时,我不确定 Matlab 和 Octave 之间的区别。在 Matlab 中,设置矩阵对我来说一直很容易。它一直是通过耗尽内存来杀死它的反转步骤。
我建议使用 MATLAB 中的“运行和时间”选项来准确查看在 300x300 网格示例中花费的时间。我几乎可以肯定它不在 \ 运算符中。通常,MATLAB 具有非常快速、最先进的稀疏矩阵分解实现。
我在您链接中提到的站点上查看了 James Nagel 的 MATLAB 代码。我没有尝试运行它,因为我找不到示例案例。但我确实注意到网格中的所有点(例如 300x300)都有一个循环来填充稀疏矩阵,然后再调用 . 我强烈怀疑这是花费大部分时间的地方。在 MATLAB 中编写代码通常更有效,以便对长向量而不是标量执行操作。
如果您搜索“向量化 MATLAB 代码”,您可以找到许多关于此主题的参考资料。
我应该补充一点,如果您对用 MATLAB 编写的泊松方程的快速基本有限元代码感兴趣,您可以在以下链接中找到
http://www.isima.fr/~jkoko/codes.html
以及关于它是如何设计的讨论。