通过最小化求解非线性 PDE 系统

计算科学 优化 pde 共轭梯度 scipy
2021-11-26 02:25:22

我有两个耦合非线性偏微分方程的形式:

u˙f(u,u,u,v,v,v)=0v˙g(u,u,u,v,v,v)=0

边界条件是这样的,我知道u有时t=0v有时t=. 我也知道坐标区间两个边界处两个函数的值。我需要解决方案x[0,1]t(,0]对于一个特定的参数值,我还知道一个解析解,这使我可以一点一点地调整这个参数,然后通过使用我对先前参数值的解作为解的初始猜测来解方程。

我正在通过写作解决这个问题 S(u˙f(u,u,u,v,v,v))2+(v˙g(u,u,u,v,v,v))2 然后找到 S 的最小值并验证它是否近似为零。目前我正在通过离散化进行最小化uv在我的时间和坐标网格上,然后使用 SciPy 优化库中的共轭梯度算法。这给了我很好的结果,但对于较大的网格来说非常慢。对于一个网格104网格点我的求解器已经不可行。

我的问题:

1)哪种最小化算法最适合这类任务?共轭梯度似乎需要很多步骤才能收敛到解。

2)有哪些外部库可以解决此类问题?我更喜欢使用 Python API 的。我查看了一些有限元库,对于这个问题,它们似乎有点矫枉过正。

1个回答

1)如果您只是想在没有任何其他优化的情况下解决偏微分方程,那么我的答案将是“都不是”。离散化偏微分方程然后将它们求解为代数方程的算法是大规模可并行化的。求解超过十亿点网格的 PDE 是可能的。非线性规划算法最近取得了很大进展。现在可以稍微有效地使用预处理迭代算法来解决具有内点方法的大规模非线性程序,但是一旦我们排除特殊结构,我不知道任何已经以十亿自由度解决的非线性程序(通常是随机程序)。

有一种 PDE 约束优化方法称为同时分析和设计(SAND,也称为“all-at-once”),它将 PDE 视为要在优化公式中求解的约束。大规模问题实例的解决通常取决于为 KKT 系统制定一个好的预处理器。这种方法与您的最小二乘方法不同,并且没有使用 PDE 作为约束的优化问题,我不推荐这种方法。

2)如果你对优化不感兴趣,我会尝试 pyipopt,它是优化库 IPOPT 的 Python 接口,它是目前最好的开源非线性规划求解器。

不过,真的,我建议使用传统的离散化方法来解决偏微分方程,有许多好的 Python 库可供使用(取决于你想要做什么,PyClaw、FEniCS、FiPy、sfepy、firedrake、petsc4py、PyTrilinos、等等...)。