二阶 ODE 能否与其边界条件“不一致”?

计算科学 有限元 有限差分 微分方程 数学
2021-12-02 08:40:16

我正在尝试解决一组耦合的非线性 ODE。唯一的因变量是一维空间坐标,我们称之为现在,我已经设法近似消除了方程之间的一些耦合,这样第一个方程根本不依赖于第二个方程。我用 FEM 轻松解决了这个问题:满足边界条件,残差看起来不错,物理上有意义的结果。x

所以现在我只剩下一个非线性的二阶 ODE,其中非线性系数函数完全由 FEM 解决方案确定,例如

{A(x)+B(x)f(x)+C(x)f(x)+D(x)f(x)=0f(0)=f(1)=0

其中ABCD是已知的,至少在 FEM 网格的分辨率下是已知的。

问题是,使用与以前相同的基本代码,解决方案似乎完全违反了边界条件,爆炸为x0而不是接近零(甚至任何有限值,我似乎无关紧要选择)。认为这是我的代码的问题,我尝试了更精细的网格和有限差分而不是有限元,但没有成功。它每次都找到相同的荒谬结果。

最后,我将系数的数值数据放入 Mathematica 并尝试解决上述 BVP。在放弃之前,我让它运行了一段时间(可能是 15-30 分钟)。它从未找到解决方案。

所以最后,我的问题是:这个方程有可能根本无法用这些边界条件求解吗?例如,我尝试更改并且 Mathematica 几乎立即找到了解决方案,但它仍然违反了新的边界条件;不知何故,这并没有引发错误,但这让我怀疑这里可能会发生“更大”的事情。f(1)=0f(0)=0

我正在寻找为什么数值方法在这些情况下可能会失败以及如何缓解这些问题背后的一些数学直觉。

更新

这个方程是线性的(在这里更正以便评论仍然有意义)。不过,我认为这不是我问题的根源;我尝试使用具有适当刚度矩阵和载荷向量的线性求解器来求解,这应该很容易;这里,是第一个方程的 FEM 解。该解决方案满足边界条件,但“锯齿状”(想想覆盖在平滑函数上的锯齿图案)。现在我认为将第一个方程的 FEM 解代入第二个方程可能有问题,但我不知道为什么。f(x)=g(x)g(x)

还没有放弃。

更新 2

我想我可以安全地排除这段代码的问题;我正在使用 SymPy 生成源文件,因此不应该存在与更改我想要求解的方程的函数形式等相关的人为错误。作为我现在看到的示例,请参见下图。我对此的唯一直觉是代码“试图”满足边界条件(它们是齐次狄利克雷),但无论出于何种原因,解决方案基本上都想炸毁所以我们最终得到了这种跨越两种可能性的“妥协”解决方案。

这甚至是远程正确的吗?在这一点上我改变什么似乎并不重要,细化网格只会增加锯齿形式的频率。

解不满足边界条件

1个回答

有限元或有限差分不可能违反您施加的边界条件。它与您的问题的物理特性无关,而只是您的实现问题。无论您的 ODE 是否与您的边界条件或其他内容一致。唯一重要的是,当您尝试在有限元或有限差分方法中组装刚度矩阵和响应向量时强制执行边界条件,如果正确组装它们,它应该恢复施加的边界条件。否则,您的矩阵组装中可能有一个错误,这会使刚度矩阵奇异,这会在边界处向您显示一些无意义的值。因此,我的建议是检查您的矩阵组装函数,并检查您的线性求解器或任何可能在您的刚度矩阵或响应向量出现问题时产生信息性警告/错误的东西。你至少需要得到你想要正确地施加在你的方程上的任何东西,然后当你想讨论你的模型的物理意义时,这是另一个故事,这是否有意义。

此外,您的 ODE 不是非线性的,因为不依赖于本身,因此应该通过简单的线性有限元或有限差分轻松求解求解器(例如 scipy BVP 求解器)。A(x)B(x)C(x)D(x)f