【问题标题】:Solving Delayed Differential Equations using ode45 Matlab使用 ode45 Matlab 求解延迟微分方程
【发布时间】:2017-06-23 15:09:04
【问题描述】:

我正在尝试在 Matlab 中使用 ode45 解决 DDE。我的问题是关于我求解这个方程的方式。我不知道我是对还是错,我应该使用 dde23 代替。 我有以下等式:

xdot(t)=Ax+BU(t-td)+E(t) & U(t-td)=Kx(t-td) & K=constant

通常,当我的方程式没有延迟时,我会使用 ode45 来解决这个问题。现在由于我的方程延迟,我再次使用 ode45 来获得结果。我在每一步都有准确的 U(t-td) 数量,我替换它的数量并求解方程。

我的解决方案是正确的还是应该使用 dde23?

【问题讨论】:

  • U 是否以任何方式依赖于x?如果不是,则它不是 DDE,因为它必须涉及未知函数的时移值。
  • 是的,U 依赖于 x。然而,正如我所提到的,U(t-td) 的确切值是已知的。 U = Kx(t-td),K 是一个常数。
  • @Cena:请edit您的问题反映这一点,最好只提及依赖关系。

标签: matlab differential-equations dde timedelay ode45


【解决方案1】:

这里有两个问题:

  1. ode45 是一个具有自适应步长的求解器。这意味着您的采样步骤不一定等同于实际的集成步骤。相反,积分器根据需要将采样步骤拆分为几个积分步骤,以达到所需的精度(有关更多信息,请参阅科学计算上的this question)。 因此,您可能无法在集成的每个步骤中提供正确的延迟值 U,即使您认为这样做也是如此。

    但是,如果您的采样步骤足够小,那么每个采样步骤确实会有一个时间步骤。这样做的原因是,您可以通过使时间步长小于所需时间(从而浪费计算时间)来有效地禁用自适应积分。

  2. 诸如ode45 之类的高阶龙格-库塔方法不仅在每个积分步骤中利用导数的值,而且还在中间评估它(不,它们不能为此提供可用的解决方案中间时间步)。

    例如,假设您的延迟和积分步长为 td=16。要进行从 t=32 到 t=48 的积分步骤,您不仅需要在 t=32−16=16 和 t=48−16=32 处评估U,还需要在 t=40−16=24 处评估. 现在,您可能会说:好的,让我们进行积分,以便我们在所有这些时间点都有一个积分步骤。但是对于这些积分步骤,您再次需要中间的步骤,例如,如果您想从 t=16 积分到 t=24,您需要在 t=0、t=4 和 t=8 处评估 U .你会得到越来越小的时间步长的永无止境的级联。

由于问题 2,除了一步式积分器之外,无法提供过去的确切状态 - 在您的情况下使用这可能不是一个好主意。出于这个原因,如果您想将 DDE 与多步积分器集成,则不可避免地使用某种插值来获得过去的值。 dde23 使用良好的插值以一种复杂的方式执行此操作。

如果您只在积分步骤中提供U,您实际上是在执行piecewise-constant interpolation,这是最糟糕的插值,因此需要您使用非常小的积分步骤。如果你真的愿意,你可以这样做,dde23 具有更复杂的分段三次 Hermite 插值,可以使用更大的时间步长并自适应集成,因此会更快。此外,您不太可能以某种方式犯错误。最后,dde23 可以处理非常小的延迟(小于集成步骤),如果您喜欢这种事情的话。

【讨论】:

  • 这也遗漏了一个关键细节。如果步长最终大于延迟的大小,即使您使用的是ode45,这实际上也是隐含的。因此,您需要确保它解决了这个隐式方程,可能通过 Picard 迭代或安德森加速。 ode45 不会这样做,因此您需要确保设置选项,使最大时间步长小于td,否则解决方案根本不正确。再说一个理由:用 DDE 求解器求解 DDE。
  • @ChrisRackauckas:虽然这是我错过(并添加)的一个细节,但我不同意它是“至关重要的”。在大多数实际情况下,您不会有这么小的延迟,因为您可以将它们替换为未延迟状态。当然,这也可能发生在与状态相关的延迟上,但 dde23 无论如何 IIRC 都不支持它们。此外,在所讨论的情况下,您会遇到一个非常简单的问题,因为您会尝试访问尚不存在的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多