wolfram-mathematica - Mathematica 的 NDSolve 正在快速找到一个刚性系统,试图求解大量微分方程
问题描述
我是一名物理学博士生,解决与圆柱形像素中二元液滴蒸发相关的润滑方程(非线性偏微分方程),以模拟形状演化。所以我将系统分成 N 个 ODE,每个代表 i 点的高度演变 (dh/dt),写为有限差分,并同时使用 NDSolve 求解。对于单液滴,这非常有效,液滴蒸发干净。
然而,对于二元液滴,我在每个点包括 N 个额外的 ODE,用于组成分数演变 (dX/dt)。这也为 dh/dt 方程增加了一个新项(marangoni 应力)。NDSolve 立即说道:
在 t == 0.00029140763302667777`,步长实际上为零;
怀疑是奇点或僵硬系统。
我在这个 t 值处绘制了液滴高度,它在原点显示了一个狭窄的尖峰(明显爆炸,因此刚度);绘制成分图在原点处显示了一个狭窄的直线下降(也在爆炸,只是负数。此外,物理学显然不应该允许成分分数低于 0)。
最后,两组方程的项都取决于成分梯度 dX/dr。如果将其设置为零并且我也将蒸发相互作用设置为零(意味着两种液体以相同的速率蒸发并且不会有 X 梯度),那么 X 在任何地方都应该没有变化,它应该减少到单一液体的情况(dX/dt = 0 且 dh/dt 不再取决于 X)。然而,该过程在 X 中引入了一些小的梯度,这会爆炸并导致相同的数值不稳定性。
我的问题是:NDSolve 有什么可能导致这种情况的吗?我已经研究过方程和离散化一百次,并且确信它是正确的。我还查看了 NDSolve 的文档,但没有找到任何对我有帮助的东西。它会在成分梯度中引入一个小的数值误差吗?
我可以在下面发布一个 MRE 代码,但它非常密集并且显然是用数学代码编写的(不能很好地转移到现实世界......)所以我不知道它有多大帮助。无论如何,感谢您阅读本文!
解决方案
推荐阅读
- angular - 如何将 NgControl 状态传递给 Angular 中的子组件,实现 ControlValueAccessor?
- javascript - 如何单击按钮更改其属性并禁用?
- html - 旋转 90 度的六边形不会在容器内生长
- python-3.x - 在创建 Spark DataFrame 时从 hdfs 文件传递模式
- material-ui - 服务器和客户端呈现的组件之间的类名不一致
- mongodb - 如何在 MongoDB 中存储查找值?
- django-rest-framework - serializers.MultipleChoiceField 导致错误
- r - 在 qqplot 中的多个图上绘制多个子图
- batch-file - 从文件夹中的多个文本文件中解析特定字符串(2 个字符串)
- python - Tkinter 小部件在同一行,但为什么它们不那样出现?