MATLAB 数学应用 微分方程 时滞微分方程 具有常时滞的DDE

本文详细介绍了如何利用MATLAB的dde23函数解决具有常时滞的时滞微分方程(DDE)方程组。具体步骤包括定义时滞向量、编写方程代码、设定历史解函数以及调用dde23求解器进行求解。示例中展示了如何处理具有不同时滞的方程组,并提供了绘制解的图形方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文讲述了如何使用 dde23 对具有常时滞的DDE(时滞微分方程)方程组求解。

方程组为:

y1′(t)=y1(t−1)y'_1(t)=y_1(t−1)y1(t)=y1(t1)

y2′(t)=y1(t−1)+y2(t−0.2)y'_2(t)=y_1(t-1)+y_2(t-0.2)y2(t)=y1(t1)+y2(t0.2)

y3′(t)=y2(t)y'_3(t)=y_2(t)y3(t)=y2(t).

t≤0 的历史解函数是常量 y1(t)=y2(t)=y3(t)=1y_1(t)=y_2(t)=y_3(t)=1y1(t)=y2(t)=y3(t)=1

方程中的时滞仅存在于 y 项中,并且时滞本身是常量,因此各方程构成常时滞方程组。

要在 MATLAB 中求解此方程组,您需要先编写方程组、时滞和历史解的代码,然后再调用时滞微分方程求解器 dde23,该求解器适用于具有常时滞的方程组。您可以将所需的函数作为局部函数包含在文件末尾,或者将它们作为单独的命名文件保存在 MATLAB 路径上的目录中。

编写时滞代码

首先,创建一个向量来定义方程组中的时滞。此方程组有两种不同时滞:

  • 在第一个分量 y1(t−1)y_1(t−1)y1(t1) 中时滞为 1。
  • 在第二个分量 y2(t−0.2)y_2(t−0.2)y2(t0.2) 中时滞为 0.2。

dde23 接受时滞的向量参数,其中每个元素是一个分量的常时滞。

lags = [1 0.2];

编写方程代码

现在,创建一个函数来编写方程的代码。此函数应具有签名 dydt = ddefun(t,y,Z),其中:

t 是时间(自变量)。

y 是解(因变量)。

Z(:,j) 用于逼近时滞 y(t−τj)y(t−τ_j)y(tτj),其中常时滞 τjτ_jτj 由 lags(j) 给定。

求解器会自动将这些输入传递给该函数,但是变量名称决定如何编写方程代码。在这种情况下:

  • Z(:,1) →  y1(t−1)Z(:,1) →  y_1(t−1)Z(:,1)y1(t1)
  • Z(:,2) →  y2(t−0.2)Z(:,2) →  y_2(t−0.2)Z(:,2)y2(t0.2)
function dydt = ddefun(t,y,Z)
  ylag1 = Z(:,1);
  ylag2 = Z(:,2);

  dydt = [ylag1(1); 
          ylag1(1)+ylag2(2); 
          y(2)];
end

注意:所有函数都作为局部函数包含在示例的末尾。

编写历史解代码

接下来,创建一个函数来定义历史解。历史解是时间 t≤t0t≤t_0tt0 的解。

function s = history(t)
  s = ones(3,1);
end

求解方程

最后,定义积分区间 [t0  tf][t_0  t_f][t0tf] 并使用 dde23 求解器对 DDE 求解。

tspan = [0 5];
sol = dde23(@ddefun, lags, @history, tspan);

对解进行绘图

解结构体 sol 具有字段 sol.x 和 sol.y,这两个字段包含求解器在这些时间点所用的内部时间步和对应的解。(如果您需要在特定点的解,可以使用 deval 来计算在特定点的解。)

绘制三个解分量对时间的图。

plot(sol.x,sol.y,'-o')
xlabel('Time t');
ylabel('Solution y');
legend('y_1','y_2','y_3','Location','NorthWest');

在这里插入图片描述

局部函数

此处列出了 DDE 求解器 dde23 为计算解而调用的局部辅助函数。您也可以将这些函数作为它们自己的文件保存在 MATLAB 路径上的目录中。

function dydt = ddefun(t,y,Z) % equation being solved
  ylag1 = Z(:,1);
  ylag2 = Z(:,2);

  dydt = [ylag1(1); 
          ylag1(1)+ylag2(2); 
          y(2)];
end
%-------------------------------------------
function s = history(t) % history function for t <= 0
  s = ones(3,1);
end
%-------------------------------------------
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结冰架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值