时滞微分方程的matlab解法
有位小伙伴在matlab编程爱好者群中问道有关时滞微分方程的matlab解法,问题是选自由清华大学出版社出版、薛定宇著的《高等应用数学问题的MATLAB求解 (第四版)》的课后习题,问题的如下:
显然这是时滞固定的时滞微分方程,采用dde23函数即可对其进行求解,在给出解法之前先来看看dde23到底该怎么使用,其常用的调用格式如下:
sol = dde23(ddefun,lags,history,tspan);
以上语句中:
ddefun —— 待求解的时滞微分方程,要求:函数必须为以下形式:
dydt = ddefun(t,y,Z);
lags —— 固定正时滞向量 τ1, ..., τk;
history —— 按以下三种方式之一指定 history:
- ① 一个 t 函数,要求 y = history(t) 能够将 t ≤ t0 的解 y(t) 以列向量的形式返回
- ② 一个固定列向量(如果 y(t) 为常量)
- ③ 来自之前积分的解 sol(如果此调用继续该积分)
- tspan —— 从 t0=tspan(1) 到 tf=tspan(end) 的时间积分区间,其中 t0 < tf。
- sol —— 返回的计算结果,为结构体类型数据,通过sol.x来读取时间,sol.y来读取计算结果。
- 了解了dde23函数的使用方法,接下来就是如何实现的问题了。
在ddefun中,t对应时间t,y对应导数x'(t)、y'(t),Z对应各个历史x(t-0.1)、x(t-0.2)、x(t-0.5)、y(t-0.1)、y(t-0.2)、y(t-0.5),为了求解所有的量都需要定义成列向量的形式,即有:
y = [x'(t);y'(t)],
Z = [x(t-0.1) x(t-0.2) x(t-0.5); y(t-0.1) y(t-0.2) y(t-0.5)],
=[Z(1,1) Z(1,2) Z(1,3); Z(2,1) Z(2,2) Z(2,3)],
所以有:dydt = ddefun(t,y,Z).
lags = [0.1 0.2 0.5].
history = [t; exp(t)].
tspan = [0 0.8].
这里,tspan是自行定义的。
到这儿,其实代码已经完成了,照葫芦画瓢填进去即可,下面就一起来看看本题的源代码吧:
% 作者:巴山
% 欢迎关注matlab爱好者公众号
% Q群:531421022
% 知识星球:资源分享园地
% 抖音号:matlab. (有个点哦)
% B站号:matlabaihaozhe
clc;clear;close all
% 定义微分方程 —— ddefun
ddefun = @(t,x,Z)[Z(1,2)^2+Z(2,2)^2-6*Z(1,3)-8*Z(2,1);...
x(1)*(2*Z(2,2) - x(1)+5 - 2*Z(1,1)^2)];
% 定义时滞向量 —— lags
lags = [0.1 0.2 0.5];
% 定义历史 —— history
history =@(t)[t;exp(t)];
% 定义时间积分区间 —— tspan
tspan = [0 0.8];
sol=dde23(ddefun,lags,history,tspan);
figure('Color','w');
% plot(sol.x,sol.y)
plot(sol.x,sol.y(1,:),'r','LineWidth',2.0);
hold on
plot(sol.x,sol.y(2,:),'b--','LineWidth',2.0)
hold off
title('时滞微分方程组');
xlabel('时间 t');
ylabel('结果 y');
legend('x(t)','y(t)');
本文只起抛砖引玉之作用,今后若有小伙伴在matlab编程爱好者Q群中提有意思的matlab编程问题,同样会与大家分享,指不定哪天就能派上用场。
matlab中求解时滞微分方程相关的函数了dde23之外,还有ddensd 、ddesd、ddeset、ddeget、deval等着大家学习,这里就不赘述了。
更多关于微分方程、含积分方程的求解与拟合问题,敬待后续推送!
参考资料:
[1] 薛定宇. 《高等应用数学问题的MATLAB求解 (第四版)》. 清华大学出版社.
[2] https://ww2.mathworks.cn/help/matlab/ref/dde23.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第1天:网易2018年校园招聘NLP算法工程师笔试试卷分析
- 【React+Typescript+Antd】全局路由跳转
- 【React+Typescript+Antd】防止样式感染——LESS CSS 框架简介
- 【React+Typescript+Antd】界面框架布局——Layout布局+ Grid栅格
- SpringBoot源码学习(三)
- Axure RP 9 安装与中文汉化
- Linux 离线安装docker的过程
- Mac环境变量设置(以ADB为例)
- Linux 基础之定时任务
- Git库迁移步骤(从服务器A迁移至服务器B)
- springboot源码解析(四)
- 第2天:网易2018年校园招聘NLP算法工程师笔试试卷分析(二)
- Windows下Scoop安装、配置与使用
- Flutter免费iOS真机调试 AndroidStudio iPhone真机运行教程
- Flutter GridView 网格控件