使用 ode45 Matlab 求解延迟微分方程
Solving Delayed Differential Equations using ode45 Matlab
我正在尝试在 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?
你这里有两个问题:
ode45
是具有自适应步长的求解器。这意味着您的采样步骤不一定等同于实际的集成步骤。相反,集成器根据需要将采样步骤拆分为多个集成步骤,以达到所需的精度(有关更多信息,请参阅科学计算上的 this question)。
因此,您可能无法在集成的每个步骤中提供 U
的正确延迟值,即使您认为这样做也是如此。
但是,如果您的采样步长足够小,您确实会在每个采样步长中有一个时间步长。这样做的原因是您通过使时间步长小于所需时间(从而浪费计算时间)来有效地禁用自适应积分。
高阶 Runge–Kutta 方法,例如 ode45
不仅在每个积分步骤中使用导数的值,而且还在中间(并且没有,他们无法为这个中间时间步长提供可用的解决方案。
例如,假设你的延迟和积分步长是td=16。要进行从 t=32 到 t=48 的积分步骤,您不仅需要在 t=32−16=16 和 t=48−16=32 处计算 U
,而且还要在 t=40−16 处计算 U
=24. 现在,您可能会说:好的,让我们整合,以便我们在所有这些时间点都有一个整合步骤。但是对于这些集成步骤,您再次需要中间的步骤,例如,如果您想从 t=16 集成到 t=24,您需要在 t=0、t=4 和 t 评估 U
=8。你会得到一个永无止境的级联,时间步长越来越小。
由于问题 2,除了一步积分器之外,不可能提供过去的确切状态——在您的情况下使用这可能不是一个好主意。因此,如果要将 DDE 与多步积分器积分,则不可避免地要使用某种插值来获取过去的值。 dde23
使用良好的插值以复杂的方式做到这一点。
如果您仅在积分步骤中提供 U
,您实际上是在执行 piecewise-constant interpolation,这是最糟糕的插值,因此需要您使用非常小的积分步骤。虽然如果您真的愿意也可以这样做,但 dde23
及其更复杂的分段三次 Hermite 插值可以使用更大的时间步长并自适应地积分,因此会更快。此外,您不太可能以某种方式犯错。最后,dde23
可以处理非常小的延迟(小于积分步骤),如果你喜欢那种东西的话。
我正在尝试在 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?
你这里有两个问题:
ode45
是具有自适应步长的求解器。这意味着您的采样步骤不一定等同于实际的集成步骤。相反,集成器根据需要将采样步骤拆分为多个集成步骤,以达到所需的精度(有关更多信息,请参阅科学计算上的 this question)。 因此,您可能无法在集成的每个步骤中提供U
的正确延迟值,即使您认为这样做也是如此。但是,如果您的采样步长足够小,您确实会在每个采样步长中有一个时间步长。这样做的原因是您通过使时间步长小于所需时间(从而浪费计算时间)来有效地禁用自适应积分。
高阶 Runge–Kutta 方法,例如
ode45
不仅在每个积分步骤中使用导数的值,而且还在中间(并且没有,他们无法为这个中间时间步长提供可用的解决方案。例如,假设你的延迟和积分步长是td=16。要进行从 t=32 到 t=48 的积分步骤,您不仅需要在 t=32−16=16 和 t=48−16=32 处计算
U
,而且还要在 t=40−16 处计算U
=24. 现在,您可能会说:好的,让我们整合,以便我们在所有这些时间点都有一个整合步骤。但是对于这些集成步骤,您再次需要中间的步骤,例如,如果您想从 t=16 集成到 t=24,您需要在 t=0、t=4 和 t 评估U
=8。你会得到一个永无止境的级联,时间步长越来越小。
由于问题 2,除了一步积分器之外,不可能提供过去的确切状态——在您的情况下使用这可能不是一个好主意。因此,如果要将 DDE 与多步积分器积分,则不可避免地要使用某种插值来获取过去的值。 dde23
使用良好的插值以复杂的方式做到这一点。
如果您仅在积分步骤中提供 U
,您实际上是在执行 piecewise-constant interpolation,这是最糟糕的插值,因此需要您使用非常小的积分步骤。虽然如果您真的愿意也可以这样做,但 dde23
及其更复杂的分段三次 Hermite 插值可以使用更大的时间步长并自适应地积分,因此会更快。此外,您不太可能以某种方式犯错。最后,dde23
可以处理非常小的延迟(小于积分步骤),如果你喜欢那种东西的话。