在 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 函数不知道延迟本身,它只计算这些延迟的值。这些是从分段插值函数中获得的,该函数使用迄今为止的解来延续历史函数。历史函数代替了初始条件。
我正在尝试学习如何在 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 函数不知道延迟本身,它只计算这些延迟的值。这些是从分段插值函数中获得的,该函数使用迄今为止的解来延续历史函数。历史函数代替了初始条件。