用ode45 Matlab求解延迟微分方程

时间:2017-06-23 15:09:05

标签: matlab differential-equations dde timedelay ode45

我正在尝试使用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?

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

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

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

  2. 高阶Runge-Kutta方法(如ode45)不仅可以在每个积分步骤中使用导数的值,还可以在中间进行评估(并且不会,它们无法提供这个中间时间步骤的可用解决方案。)

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

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

    如果您只在集成步骤中提供U,那么您实际上是在执行piecewise-constant interpolation,这是最差的插值,因此需要您使用非常小的集成步骤。如果您真的想要这样做,dde23使用更复杂的分段立方Hermite插值可以使用更大的时间步长并自适应地集成,因此会更快。而且,你不太可能以某种方式犯错误。最后,dde23可以处理非常小的延迟(小于整合步骤),如果你遇到这种情况。