首页 文章

用ode45 Matlab求解延迟微分方程

提问于
浏览
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?

1 回答

  • 2

    你有两个问题:

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

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

    • 高阶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 可以处理非常小的延迟(小于集成步骤),如果你遇到这种情况 .

相关问题