matlab解微分方程

1.匿名函数

1.1创建

f=@(变量) 表达式;

f=@(x1,x2) x1.^2+x2;

1.2 求解

x1为2 3 4 5;x2为3 4 5 6的情况下求解函数f的值

f=@(x1,x2) x1.^2+x2;
y=f(2:5,3:6);
subplot(121);%选择子图位置
plot(y)%画图

在这里插入图片描述

2.一阶微分方程

用“dsolve”

2.1例 y.-y=0

step1: 申明自变量和因变量

  • syms y(x)

step2:编程

clear all;
syms y(x)
ode=diff(y,x)-y==0;				%注意是==
cond=[];
dsolve(ode,cond);

得到:

ans =
 
C1*exp(x)

2.2例 y.-y=x

step1: 申明自变量和因变量

  • syms y(x)

step2:编程

clear all;
syms y(x)
ode=diff(y,x)-y==x;				%注意是==
cond=[];
dsolve(ode,cond);

得到

ans =
 
C1*exp(x) - x - 1

2.3例dy/dx=sinx

step1.写函数文件

function dy = ST1(x,y)
dy= sin(x);
end

step2.主函数

clear all;
[X,Y]=ode45('ST1',[2*pi],[1]);
plot(X,Y(:,1))

在这里插入图片描述

3.二阶微分方程

相当于定义了一个新向量y,然后列匿名函数,方程的左边都是一阶导数,如y(1).;y(2).等等,右边直接打公式。

3.1例,x… = -x,x初值0,x.初值2

step1:改写

  • y(1)=x;
  • y(2)=x.

step2:得y的导数

  • y(1).=x.=y(2)
  • y(2).=x…=-x=-y(1)

step3:编程

clear;
F=@(t,y) [0,1;-1,0]*y;
ode45(F,[0,10],[0,2])%[0,10]表示t的范围,02表示积分初值

3.2例 ax…+bsin(x)=0

step1:改写

  • y(1)=x;
  • y(2)=x.;

step2:得y的导数

  • y(1).=x.=y(2) ;
  • y(2).=x…=-bsin(x)/a;

step3:编程

clear;
F=@(t,y)[y(2);-9.8*sin(y(1))];
[t,y]=ode45(F,[0,20],[9.5*pi/10,0]);%注意这里加了[t,y]
plot(y(:,1),y(:,2));%这样才能输出y的值

3.3例洛伦兹方程

在这里插入图片描述
step1:改写

  • y(1)=x
  • y(2)=y
  • y(3)=z

step2:得y的导数

  • y(1).=-ay(1)+ay(2);
  • y(2).=b*y(1)-y(2)-y(1)*y(3);
  • y(3).=y(1)y(2)-cy(3);

step3:编程

clear;
a=10;
b=35;
c=8/3;
F=@(t,y)[-a*y(1)+a*y(2);
    b*y(1)-y(2)-y(1)*y(3);
    y(1)*y(2)-c*y(3)];
[t,y]=ode45(F,[0,20],[-0.01,0.0,0.001]);
plot3(y(:,1),y(:,2),y(:,3));

在这里插入图片描述

3.4 耦合

在这里插入图片描述
step1:改写

  • y(1)=r
  • y(2)=r.
  • y(3)=xita
  • y(4)=xita.

step2:得y的导数

  • y(1).=y(2)
  • y(2).=-a/y(1)2+y(1) y(4)2
  • y(3).=y(4)
  • y(4).=-b*y(2)*y(4)/y(1)

step3:编程

clear;
a=5.965*6.67295;
b=2;
F=@(t,y)[y(2);
    -a/(y(1)^2)+y(1)*y(4)^2;
    y(4);
    -b*y(2)*y(4)/y(1)];
[t,y]=ode45(F,[0,1500],[63.71,0.0,0.001,0.79/63]);
[x,y]=pol2cart(y(:,3),y(:,1));%极坐标转化为直角坐标
plot(x,y)

在这里插入图片描述

4.混合求导的耦合微分方程

这个叫法肯定不太专业,主要是求导变量换了。

4.1例1

在这里插入图片描述
step1.写函数文件

function dy = ST1(x,y)
dy=zeros(2,1);%一定要写!!!!,声明列向量的维度!!!!
dy(1)= y(1)+y(2)/x;
dy(2)= sin(y(1))+x;
end

step2:主程序ode求解

clear all;
[X,Y]=ode45('ST1',[2*pi,3*pi],[1,1]);
plot(X,Y(:,1),X,Y(:,2))

4.2例

在这里插入图片描述

step1:改写

  • y(1)=x
  • y(2)=y

step2:得y的导数

  • y(1).=r1 y(1) (1-y(1)/n1-s1*y(2)/n2)
  • y(2).=r2 y(2) (1-y(2)/n2-s2*y(1)/n1)

step3:编程

clear;
r1=1;
r2=0.2;
n1=100;
n2=100;
s1=0.5;
s2=2;
F=@(t,y)[r1*y(1)*(1-(y(1)/n1)-s1*(y(2)/n2));
    r2*y(2)*(1-(y(2)/n2)-s2*(y(1)/n1))];
[t,y]=ode45(F,[0,20],[10,10]);
plot(t,y(:,1),t,y(:,2))

在这里插入图片描述

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
matlab中的微分方程-matlab中的微分方程.doc 1510 matlab中的微分方程 第1节  Matlab能够处理什么样的微分方程Matlab提供了决包括微分方程在内的各种类型问题的函数: 1. 常规微分方程(ODEs)的初始值问题 初值问题是用MATLAB ODE求解决的最普遍的问题。初始值问题最典型的是对非刚性度(?nonstiff)问题应用ODE45,对刚性度(?stiff)问题采用ODE15S。(对于stiffness的释,请参照“什么是Stiffness”一节。) 2. 微分-代数方程(DAEs)的初值问题 在那些守恒定律规定一些变量之间满足常数关系领域经常遇到这类问题。Matlab 可以用ODE15S 或者 ODE23T决索引(index)为1的DAEs。(对于索引的释,请参阅“DAEs与他们的索引”一章。) 3. 边界值问题(BVPs) 这种通常要求微分方程在两边都具有特殊的条件组成。尽管他们通常不象IVPs那样经常遇到,但是他们也是工程应用中比较常见的问题。可以利用函数BVP4C来决这类问题。 4. 时延微分方程(DDEs) 这类微分方程包含了独立变量的延迟。他们在生物与化学模型这类大量的应用中遇到,可以通过DDE23来决这类问题。 5. 偏微分方程(PDEs) 采用PDEPE可以决一维时空的抛物面与椭圆方程的初值、边界值的问题。而那些对更加多的一般的偏微分方程感兴趣的可以利用PDE工具箱。 更多的matlab的综合应用技术的信息请参阅Solution8314。 更多的有关matlab采用的各种求解器的算法的信息请查看下面的URLs: ● ODE 函数 ● BVP 函数 ● DDE 函数 ● PDE 函数 第2节 可以从什么地方获得更多的指导与附加信息?    可以从MATLAB Center、网站的新闻组、文件交换点可以获得一系列资料,可以进一步MATLAB决各种方程(ODE,DAE,BVP,DDE)的求解器的算法和使用。你可以下载各种方程的文章与手册,他们通常带有大量的实例。   可以从 matlab自带的帮助文件的 Mathematics|Differential Equations下找到使用指导。   Cleve Moler的《Numerical Computing with MATLAB》的第七章详细讨论了OEDs的法,并附带有大量的实例与简单的问题练习。    第3节 对ODE求解器的语法存在有些什么变化? 在MATLAB6.5(R13)中应用ODE求解求解的首选语法是: [t,y]=odesolver(odefun,tspan,y0,options,parameter1,parameter2,…,parameterN); odesolver 是你采用的求解器,例如ODE45或者ODE15S。odefun是微分方程的定义函数,所以odefun定义独立参数(典型的是时间t)的导数y‘ 以及y和其他的参数。在MATLAB6.5(R13)中,推荐使用函数句柄作为odefun。 例如,ode45(@xdot,tspan,y0),而不是用 ode45('xdot',tspan,y0)。 请看采用函数句柄的好处的文档: 采用函数句柄传递你定义MATLAB求解器计算的量、例如大规模矩阵或者Jacobian模式的函数。 如果你喜好采用字符串儿传递你的函数,matlab求解器将回溯匹配。 在老的matlab版本里,通过传递标志来规定求解器的状态和恰当的计算。在MATALB6.0以及其后的版本中,这就没有必要了,可以从matlab自带的文档中发现这个差别。 如果里采用的matlab的ODE求解器的老的语法,你可以看看我们FTP站点上的各种求解器的老的实例: ftp://ftp.mathworks.com/pub/doc/papers/ 前面的站点包含了BVP,DAE与DDE这三个方向的采用老的语法的实例。你可以在下面的站点中找到应用ODE45与ODE23的实例: ftp://ftp.mathworks.com/pub.mathworks/toolbox/matlab/funfun 你可以在MATLAB Center的文件交换站点查看这些例子的更新版本。 第4节  如何减小ODE的阶次? 求解一阶ODE的代码是很直接的。然而,二阶或者三阶的ODE不能够直接应用求解。你必须先将高阶的ODE改写成一阶的ODEs系统,使得它可以采用MATLAB ODE求解器。 这是一个如何将二阶微分方程改写成两个一阶微分

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值