当前位置: 首页 > article >正文

Matlab求解微分方程(解析解与数值解)

matlab求解微分方程解析解和数值解

  • Matlab求微分方程解析解
    • 例题1
    • 例题2
    • 例题3
  • Matlab求微分方程数值解
    • 一阶微分方程
      • 例题一
      • 例题二
    • 高阶微分方程
      • 例题

Matlab求微分方程解析解

dsolve(eqns,conds,options) eqns:微分方程(组)、conds:初值条件、options:精度设置

例题1

%例题一:y-Dy=2x(Dny表示y的n阶导),y(0)=3
dsolve('y-Dy=2*x','y(0)=3','x')

在这里插入图片描述

这种求解形式虽然简单,但是警告内容说它会在未来版本中被移除,因此推荐使用下面的方法使用dsolve函数

syms y(x)
eqn1=(y-diff(y,x)==2*x)
cond1=(y(0)==3)
dsolve(eqn1,cond1)

例题2

%例题二:D2y+4Dy+29y=0,y(0)=0,Dy(0)=15
syms y(x)
eqn2=(diff(y,x,2)+4*diff(y,x)+29*y==0)
Dy=diff(y,x)
cond2=[(y(0)==0),(Dy(0)==15)]
dsolve(eqn2,cond2)

例题3

在这里插入图片描述

syms x(t) y(t) z(t)
eqn3=[(diff(x,t)==2*x-3*y+3*z+t),(diff(y, t)==4*x-5*y+3*z+t),(diff(z,t)==4*x-4*y+2*z+t)]
ans3=dsolve(eqn3)

Matlab求微分方程数值解

一阶微分方程

[x,y]=solver('f',ts,x0,options)

①solver:求解器(以具体求解器作为函数名)
最常用的两个求解器包括ode45和ode15s。ode45采用4-5阶Runge-Kutta法,适用于求解非刚性问题(求解出的函数图像不发生突变);ode15s基于数值差分公式,适用于求解刚性问题(求解出的函数图像发生突变)。
因此在实际操作中,通常先采用ode45作为求解器,如果运行过程卡顿,说明面临刚性问题,应切换ode15s。

②f:包含微分方程的函数文件名f.m,除了使用字符串‘f’外可传入@f,标准形式dy=f(x,y)(dy;一阶微分)

③ts=[ t a , t b t_a,t_b ta,tb],表示自变量的范围,可使用 t a : s t e p : t b t_a:step:t_b ta:step:tb设置步距

④x0:函数的初值,n个函数对应n个初值

⑤options:设置求解精度,options=odeset(‘reltol’,rt,‘abstol’,at),默认相对误差rt=1e-3,绝对误差at=1e-6

⑥[x,y] x:返回所取自变量的离散值 y:返回各个函数对应于x的函数值

例题一

%df1.m
function dy=df1(x,y) 
    dy=y-2*x;
end

%练习一
[x1,y1]=ode45(@df1,[0,2],3)
figure(1)
plot(x1,y1,'r*-')

例题二

在这里插入图片描述

function dy=df2(x,y)
   dy=zeros(3,1);
   dy(1)=y(2)*y(3);
   dy(2)=-y(1)*y(3);
   dy(3)=-0.51*y(1)*y(2);
end

%练习二
[x2,y2]=ode45(@df2,[0 4*pi],[0 1 1])
figure(2)
plot(x2,y2(:,1),'o',x2,y2(:,2),'*',x2,y2(:,3),'+')
legend('y1','y2','y3')
axis([0 4*pi -inf inf])

高阶微分方程

处理高阶微分方程,需要先通过变量转化将问题转变为一阶微分方程,然后使用solver求解

例题

在这里插入图片描述

设置 y 1 = y ′ , y 2 = y , 则( 1 + x 2 ) y 1 ′ = 2 x y 1 , y 2 ′ = y 1 , 二阶微分方程转化为一阶微分方程组 设置y_1=y^{'},y_2=y,则(1+x^2)y_1^{'}=2xy_1,y_2^{'}=y_1,二阶微分方程转化为一阶微分方程组 设置y1=y,y2=y,则(1+x2y1=2xy1,y2=y1,二阶微分方程转化为一阶微分方程组

%df3.m
function dy=df3(x,y)
    dy=zeros(2,1)
    dy(2)=y(1)
    dy(1)=(2*x*y(1))/(1+x^2)
end

%高阶微分方程例题 y1=y',y2=y
[x,y]=ode45(@df3,[-2,2],[4 3])
figure(1)
plot(x,y(:,2),'r*')

http://www.kler.cn/news/314005.html

相关文章:

  • 利士策分享,华为三折叠手机:重塑未来科技生活的里程碑
  • 【高等代数笔记】线性空间(五-九)
  • module ‘urllib.request‘ has no attribute ‘urlencode‘ 问题解决
  • LeetCode2414题: 最长的字母序连续子字符串的长度(原创)
  • 【数据结构-差分】力扣1589. 所有排列中的最大和
  • 十三、SOA(企业服务总线ESB架构实现)
  • JVM 一个对象是否已经死亡?
  • Invalid Private Key, Not a valid string or uint8Array
  • jQuery国内大厂CDN加速链接
  • 741. 摘樱桃
  • JVM 案例研究与实战经验
  • 硬件工程师笔试面试——滤波器
  • IntelliJ IDEA 2024创建Java项目
  • 红帽 Quay- 配置镜像代理缓存
  • 记一次安装discuz时遇到的错误
  • descrTable常用方法
  • 利士策分享,自我和解:通往赚钱与内心富足的和谐之道
  • Leetcode—移除元素
  • 海外问卷调查:选择静态IP还是动态IP?
  • Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)
  • Redis中Hash(哈希)类型的基本操作
  • 「已解决」KeyError: ‘getpwuid(): uid not found: 1004‘
  • 编写函数,对字符数组中的字母由大到小的字母顺序进行排序
  • Jira Cloud涨价5%-20%,钉钉项目Teambition成优选替代
  • 使用Microsoft Visual Studio Installer Projects 2022打包桌面程序
  • 【大数据】MapReduce的“内存增强版”——Spark
  • 基于对数变换的图像美白增强,Matlab实现
  • Docker 数据目录迁移:一篇详细的技术指南
  • 软件测试 BUG 篇
  • java初学者:一个经典又全新改造的游戏——打地鼠