0

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

4

1 回答 1

2

你在这里有两个问题:

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

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

  2. 高阶 Runge-Kutta 方法,例如ode45不仅在每个积分步骤中利用导数的值,而且还在中间评估它(不,它们不能为这个中间时间步骤提供可用的解决方案) .

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

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

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

于 2017-06-23T20:33:24.503 回答