2017-06-23 157 views
0

我想在Matlab中使用ode45解决DDE问题。我的问题是关于我解决这个问题的方式。我不知道我是对的还是我错了,我应该使用dde23。 我有一个公式如下:使用ode45解决延迟微分方程Matlab

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

正常情况下,我不知道,我解决了这个利用ODE45对我的方程延迟。现在拖延我的等式,我再次使用ode45来获得结果。我在每一步都有U(t-td)的确切数量,并且我取代它的数量并求解方程。

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

+1

“U”以任何方式取决于“x”?如果不是,那么它不是DDE,因为它必须涉及未知函数的时移值。 – LutzL

+0

是的,你用x表示。但是,正如我所提到的,U(t-td)的确切值是已知的。 U = Kx(t-td),K是常数。 – Cena

+0

@Cena:请[编辑]你的问题来反映这一点,最好只是提到依赖。 – Wrzlprmft

回答

2

您这里有两个问题:

  1. ode45是具有自适应步长求解器。这意味着您的采样步骤不一定等同于实际的集成步骤。相反,积分器根据需要将采样步骤分成几个积分步骤,以达到所需的精度(有关更多信息,请参见Scientific Computing的this question)。 因此,即使您认为这样做,您也可能无法在集成的每个步骤中提供U的正确延迟值。但是,如果您的采样步骤足够小,则每个采样步骤确实会有一个时间步长。原因在于,通过使时间步长小于所需时间(从而浪费计算时间),可以有效地禁用自适应集成。

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

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

由于问题2,就不可能从过去的任何一个,但一个步骤集成提供确切的状态 - 用这可能不是你的情况是个好主意。因此,如果要将DDE与多步积分器集成,则不可避免地需要使用某种内插来获取过去的值。 dde23使用良好的插值以复杂的方式完成此操作。

如果您仅在积分步骤中提供U,则实质上是执行piecewise-constant interpolation,这是可能出现的最差插值,因此需要使用非常小的积分步骤。虽然你可以做到这一点,但如果你真的想要的话,dde23其更复杂的分段立方Hermite插值可以使用更大的时间步长和自适应集成,因此会更快。另外,你不太可能犯了一个错误。最后,如果你遇到这种情况,dde23可以处理非常小的延迟(小于积分步骤)。

+0

这也缺少一个关键的细节。如果步长大于延迟的大小,即使使用'ode45',这实际上最终也是隐含的。所以你需要确保它可以通过Picard迭代或Anderson加速来解决这个隐式方程。 'ode45'不会这样做,所以你需要确保设置选项,使最大时间步长小于'td',否则解决方案根本就不正确。另一个原因是:用DDE求解器求解DDE。 –

+0

@ChrisRackauckas:虽然这是我错过的一个细节,但我不同意它是“至关重要的”。在大多数实际情况下,您不会有这么小的延迟,因为您可以用undelayed状态替换它们。当然,这也可能发生在状态相关的延迟上,但是'dde23'并不支持IIRC。此外,在这种情况下,您会遇到一个非常简单的问题,因为您会尝试访问尚不存在的状态。 – Wrzlprmft