在 Matlab 中求解 DDE

Solving DDE in Matlab

我正在尝试学习如何在 Matlab 上求解 DDE(延迟差分方程),并且我正在使用一个非常有用的 (Youtube-tutorial),这个人求解示例。在3维系统的情况下,代码如下:

tau = [1 0.5];
tf = 10;
sol = dde23(@dde,tau,@history,[0 tf]);
t = linspace(0,tf,200);
y = deval(sol,t);

figure(1)
plot(t,y)

function y = history(t)
y = [1;0;-1];
end

根据教程的dde函数是:

function dydt = dde(t,y,tau)
y1tau1 = tau(:,1);
y2tau2 = tau(:,2);
dydt = [y1tau1(1)
    y(1) - y1tau1(1) + y2tau2(2)
    y(2) - y(3)];
end

,如果我理解得好,我们有一个 3by2 矩阵,其中包含状态变量及其各自的延迟:第一列是关于三个状态变量中每一个的第一个延迟 tau_1,以及第二列是 tau_2。 尽管如此,该矩阵只有 2 个非零分量,它们是 y_1 的 tau_1 延迟和 y_2 的 tau_2 延迟。 鉴于此,我认为它会是一样的(至少在这种情况下,我们只有一个 y_1 延迟和一个 y_2 延迟)就好像函数是:

function dydt = dde(t,y,tau)
dydt = [tau(1)
    y(1) - tau(1) + tau(2)
    y(2) - y(3)];
end 

我 运行 两者的脚本和结果在质量和数量上都完全不同,我不明白为什么。有人可以解释一下区别吗?

y1tau1(1)y2tau2(2)tau(1,1)tau(2,2)

tau(1)tau(2)tau(1,1)tau(2,1) 相同。

所以第二个是不同的,没有理由两者不同,如果只是稍微不同,DDE系统应该有相同的解决方案。


因为你也有一个一般性的解释问题,DDE系统在数学上是

dy1(t)/dt = y1(t-1)
dy2(t)/dt = y1(t) - y1(t-1) + y2(t-0.5)
dy3(t)/dt = y2(t) - y3(t)

不幸的是,延迟值也被命名为tau,最好使用其他名称,如yd

function dydt = dde(t,y,yd)
  dydt = [ yd(1,1)
           y(1) - yd(1,1) + yd(2,2)
           y(2) - y(3) ];

end

这个yd有两列,第一列是值y(t-tau(1))=y(t-1),第二列是y(t-tau(2))=y(t-0.5)。 DDE 函数不知道延迟本身,它只计算这些延迟的值。这些是从分段插值函数中获得的,该函数使用迄今为止的解来延续历史函数。历史函数代替了初始条件。