用Matlab求解时滞微分方程
我试图用Matlab中的ode45解决DDE问题。我的问题是关于我解这个方程的方法。我不知道我是对还是错,我应该用dde23来代替。 我有一个方程式:用Matlab求解时滞微分方程,matlab,differential-equations,dde,timedelay,ode45,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)的确切数量,我替换了它的数量并解出了方程 我的解决方案正确吗?还是应该使用dd
xdot(t)=Ax+BU(t-td)+E(t) & U(t-td)=Kx(t-td) & K=constant
通常,当我的方程没有延迟时,我用ode45解这个方程。现在在我的等式上有延迟,我再次使用ode45来得到结果。我得到了每一步U(t-td)的确切数量,我替换了它的数量并解出了方程
我的解决方案正确吗?还是应该使用dde23?这里有两个问题:
ode45
是一个具有自适应步长的解算器。这意味着您的采样步骤不一定等同于实际的集成步骤。相反,积分器根据需要将采样步骤拆分为多个积分步骤,以达到所需的精度(有关更多信息,请参阅科学计算)。
因此,您可能无法在集成的每个步骤中提供正确的延迟值U
,即使您认为这样做了
但是,如果采样步骤足够小,则每个采样步骤确实有一个时间步骤。这样做的原因是,通过使时间步长小于所需的时间步长(从而浪费计算时间),可以有效地禁用自适应积分ode45
不仅在每个积分步骤中使用导数的值,而且在两个积分步骤之间对其进行评估(不,它们不能为这两个时间步骤之间的导数提供可用的解)
例如,假设延迟和积分步长为td=16。要使积分步骤从t=32变为t=48,您需要计算U
,而不仅仅是在t = 32−16 = 16和t = 48−16 = 32,但也在t = 40−16 = 24现在,你可能会说:好的,让我们进行积分,这样我们在所有这些时间点都有一个积分步骤。但是对于这些集成步骤,您需要中间的步骤,例如,如果要从t=16到t=24,则需要在t= 0、t=4、t=8时评估<代码> u>代码>。你会得到一个由越来越小的时间步组成的无穷无尽的级联如果仅在积分步骤中提供
U
,则实际上执行的是a,这是最差的插值,因此需要使用非常小的积分步骤。如果您真的愿意,您可以这样做,dde23
及其更复杂的分段三次Hermite插值可以使用更大的时间步长并自适应地进行积分,因此速度会更快。而且,你不太可能会犯错误。最后,dde23
可以处理非常小的延迟(小于集成步骤),如果您正处于这种情况。这里有两个问题:
ode45
是一个具有自适应步长的解算器。这意味着您的采样步骤不一定等同于实际的集成步骤。相反,积分器根据需要将采样步骤拆分为多个积分步骤,以达到所需的精度(有关更多信息,请参阅科学计算)。
因此,您可能无法在集成的每个步骤中提供正确的延迟值U
,即使您认为这样做了
但是,如果采样步骤足够小,则每个采样步骤确实有一个时间步骤。这样做的原因是,通过使时间步长小于所需的时间步长(从而浪费计算时间),可以有效地禁用自适应积分ode45
不仅在每个积分步骤中使用导数的值,而且在两个积分步骤之间对其进行评估(不,它们不能为这两个时间步骤之间的导数提供可用的解)
例如,假设延迟和积分步长为td=16。要使积分步骤从t=32变为t=48,您需要计算U
,而不仅仅是在t = 32−16 = 16和t = 48−16 = 32,但也在t = 40−16 = 24现在,你可能会说:好的,让我们进行积分,这样我们在所有这些时间点都有一个积分步骤。但是对于这些集成步骤,您需要中间的步骤,例如,如果要从t=16到t=24,则需要在t= 0、t=4、t=8时评估<代码> u>代码>。你会得到一个由越来越小的时间步组成的无穷无尽的级联U
,则实际上执行的是a,这是最差的插值,因此需要使用非常小的积分步骤。如果您真的愿意,您可以这样做,dde23
及其更复杂的分段三次Hermite插值可以使用更大的时间步长并自适应地进行积分,因此速度会更快。而且,你不太可能会犯错误。最后,dde23
可以处理非常小的延迟(比集成步骤小),如果您喜欢这种类型的话