右手边不连续的 ODE 系统

计算科学 Python
2021-12-21 12:51:43

我有一个一阶 ODE 系统。其中一个方程是 2 个因变量的分段函数。我尝试在 Python 环境中解决它。

x˙1=x2x3x˙2=x1+x4x˙3={(x2x4)(0.5)x2x40,x2<x4x˙4=x3x1

(实际上这不是我真正的 ODE 系统。我只是制造它来勾勒我的问题。这是我真正的 ODE 系统

我仔细阅读了《A Primer of Scientific Programming with Python》一书。在那本书中,我们必须像这样编写 ODE:

u˙=f(u,t)
对于标量 ODE,u 和 f 对应于浮点对象,并且对应于 ODE 系统的数组。但没有提到右手边是否是未知变量的分段函数。

2个回答

大多数(如果不是全部)ODE 求解器在右侧有一定的连续性要求。如果不是这种情况,自适应求解器通常会将步长调节得越来越小(最终由于达到最小步长或类似情况而失败)。主要的例外是如果积分步骤恰好达到不连续点。

现在,您的函数仅在右侧的导数中不连续,但这种不连续性非常严重(从 0 到 ∞ 的跳跃)。您可以尝试逐字执行不连续性,但这可能会失败。

更好的选择是:

  • 通过使用非常尖锐的sigmoid来平滑不连续性。无论如何,这可能也更现实。

  • 使用事件检测来定位不连续点并在该点交换右侧。

典型的 ODE 求解器只需要为您提供一个描述右侧计算的函数。也就是说,他们将使用给定的参数调用此函数x,t你只需要返回什么f(x,t)是为了这些论点。在您的情况下,该函数的实现将只包含一个if语句。这在实践中是一件非常普遍的事情,任何好的 ODE 求解器都不会对它进行抨击。

在您的情况下,更大的问题是您的右手边不是 Lipschitz。大多数 ODE 求解器算法的收敛证明要求右手边如果 Lipschitz 来保证通常的收敛顺序。你在这里的右手边不满足这个要求——这可能意味着也可能不意味着你选择的方法以预期的速度收敛。但这是一个与你所问的问题不同的问题。