实验2利用matlab解非线性、微分方程组答案

合集下载

matlab求解微分方程组用matlab对微分方程求解实验报告

matlab求解微分方程组用matlab对微分方程求解实验报告

matlab求解微分方程组用matlab对微分方程求解实验报告导读:就爱阅读网友为您分享以下“用matlab对微分方程求解实验报告”的资讯,希望对您有所帮助,感谢您对的支持!o 《高等数学》上机作业(三)一、上机目的1、学会用Matlab 求简单微分方程的解析解。

2、学会用Matlab 求微分方程的数值解。

二、上机内容1、求简单微分方程的解析解.2、求微分方程的数值解.3、数学建模实例.4、上机作业. 三、上机作业1. 求微分方程:xy ' ? y ? ex?0在初值条件y (1 ) ? 2 e 下的特解,并画出解函数的图形. 命令>> y=dsolve('x*Dy+y-exp(x)=0','y(1)=2*exp(1) ','x') 运行结果:y = 1/x*exp(x)+1/x*exp(1)函数图象:2. 求微分方程的特解.?d2ydy?4?5y?0?2dx ?dx?y(0)?0,y'(1)?10?命令>> y=dsolve('D2y+4*Dy-5*y=0','y(0)=0,Dy(1)= 10','x') 运行结果:y=10/(exp(1)+5*exp(-5))*exp(x)-10/(exp(1)+5*exp(-5))*exp(-5*x)3. 鱼雷追击问题一敌舰在某海域内沿着正北方向航行时,我方战舰恰好位于敌舰的正西方向1 公里处.我舰向敌舰发射制导鱼雷,敌舰速度为0.42 公里/分,鱼雷速度为敌舰速度的2倍。

试问敌舰航行多远时将被击中?M文件x0=0; xf=0.9999999999999;[x,y]=ode15s('eq1',[x0 xf],[0 0]); plot(x,y(:,1),'b.') hold on; y=0:0.1:1;plot(1,y, '*') 运行结果图像:结论:大概在y=0.67处击中敌方舰艇!(选做)一个慢跑者在平面上沿椭圆以恒定的速率v=1跑步,设椭圆方程为: x=10+20cost, y=20+5sint. 突然有一只狗攻击他. 这只狗从原点出发,以恒定速率w跑向慢跑者,狗的运动方向始终指向慢跑者.分别求出w=20,w=5时狗的运动轨迹.W=20M文件代码function dy=eq3(t,y)dy=zeros(2,1);dy(1)=20*(10+20*cos(t)-y(1))/sqrt((10+20*cos(t)-y(1))+(20 +15*sin(t)-y(2)));dy(2)=20*(20+15*sin(t)-y(2))/sqrt((10+20*cos(t)-y(1))+(20+ 15*sin(t)-y(2)));运行命令t0=0;tf=10;[t,y]=ode45('eq3',[t0 tf],[0 0]);T=0:0.1:2*pi;X=10+20*cos(T);Y=20+15*sin(T);plot(X,Y,'-')hold onplot(y(:,1),y(:,2),'r*')运行结果:利用二分法更改tf tf=5时tf=2.5时tf=3.15时:所以在t=3.15时刻恰好追上!W=5M文件代码function dy=eq4(t,y)dy=zeros(2,1);dy(1)=5*(10+20*cos(t)-y(1))/sqrt((10+20*cos(t)-y(1))+(20+15*sin(t)-y(2)));dy(2)=5*(20+15*sin(t)-y(2))/sqrt((10+20*cos(t)-y(1))+(20+1 5*sin(t)-y(2)));命令:t0=0;tf=10;[t,y]=ode45('eq4',[t0 tf],[0 0]);T=0:0.1:2*pi;X=10+20*cos(T);Y=20+15*sin(T);plot(X,Y,'-')hold onplot(y(:,1),y(:,2),'*')运行结果更改tf=20运行结果Tf=40所以永远追不上!四、上机心得体会高等数学是工科学生的主干科目,它应用于生产生活的方方面面,通过建模,计算可以求出实际问题的最优化问题!因此我们需要掌握建模和利用专业软件处理实际问题的能力!百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网,您的在线图书馆。

实验二微分方程与差分方程模型Matlab求解

实验二微分方程与差分方程模型Matlab求解

实验二: 微分方程与差分方程模型Matlab 求解一、实验目的[1] 掌握解析、数值解法,并学会用图形观察解的形态和进展解的定性分析;[2] 熟悉MATLAB 软件关于微分方程求解的各种命令; [3] 通过范例学习建立微分方程方面的数学模型以及求解全过程;[4] 熟悉离散 Logistic 模型的求解与混沌的产生过程。

二、实验原理1. 微分方程模型与MATLAB 求解 解析解用MATLAB 命令dsolve(‘eqn1’,’eqn2’, ...) 求常微分方程〔组〕的解析解。

其中‘eqni'表示第i 个微分方程,Dny 表示y 的n 阶导数,默认的自变量为t 。

〔1〕 微分方程例1 求解一阶微分方程 21y dxdy+= (1) 求通解 输入:dsolve('Dy=1+y^2') 输出: ans =tan(t+C1) 〔2〕求特解 输入:dsolve('Dy=1+y^2','y(0)=1','x') 指定初值为1,自变量为x输出: ans =tan(x+1/4*pi)例2 求解二阶微分方程 221()04(/2)2(/2)2/x y xy x y y y πππ'''++-=='=-原方程两边都除以2x ,得211(1)04y y y x x '''++-= 输入:dsolve('D2y+(1/x)*Dy+(1-1/4/x^2)*y=0','y(pi/2)=2,Dy(pi/2)=-2/pi','x') ans =- (exp(x*i)*(pi/2)^(1/2)*i)/x^(1/2) +(exp(x*i)*exp(-x*2*i)*(pi/2)^(3/2)*2*i)/(pi*x^(1/2))试试能不用用simplify 函数化简 输入: simplify(ans)ans =2^(1/2)*pi^(1/2)/x^(1/2)*sin(x) 〔2〕微分方程组例3 求解 d f /d x =3f +4g ; d g /d x =-4f +3g 。

牛顿迭代法解非线性方程组(MATLAB版)

牛顿迭代法解非线性方程组(MATLAB版)

⽜顿迭代法解⾮线性⽅程组(MATLAB版)⽜顿迭代法,⼜名切线法,这⾥不详细介绍,简单说明每⼀次⽜顿迭代的运算:⾸先将各个⽅程式在⼀个根的估计值处线性化(泰勒展开式忽略⾼阶余项),然后求解线性化后的⽅程组,最后再更新根的估计值。

下⾯以求解最简单的⾮线性⼆元⽅程组为例(平⾯⼆维定位最基本原理),贴出源代码:1、新建函数fun.m,定义⽅程组1 function f=fun(x);2 %定义⾮线性⽅程组如下3 %变量x1 x24 %函数f1 f25 syms x1 x26 f1 = sqrt((x1-4)^2 + x2^2)-sqrt(17);7 f2 = sqrt(x1^2 + (x2-4)^2)-5;8 f=[f1 f2];2、新建dfun.m,求出⼀阶微分⽅程1 function df=dfun(x);2 f=fun(x);3 df=[diff(f,'x1');diff(f,'x2')]; %雅克⽐矩阵3、建⽴newton.m,执⾏⽜顿迭代过程1 clear;clc2 format;3 x0=[0 0]; % 迭代初始值4 eps = 0.00001; % 定位精度要求5for i = 1:106 f = double(subs(fun(x0),{'x1''x2'},{x0(1) x0(2)}));7 df = double(subs(dfun(x0),{'x1''x2'},{x0(1) x0(2)})); % 得到雅克⽐矩阵8 x = x0 - f/df;9if(abs(x-x0) < eps)10break;11 end12 x0 = x; % 更新迭代结果13 end14 disp('定位坐标:');15 x16 disp('迭代次数:');17 i结果如下:定位坐标:x =0.0000 -1.0000迭代次数:i =4。

实验二_基于Matlab的微分方程数值解法

实验二_基于Matlab的微分方程数值解法

实验二微分方程数值解法一.实验原理及实验内容:对微分方程描述的控制系统,利用欧拉法、二阶龙格-库塔法、四阶龙格-库塔法分别编写M文件,进行数值计算和作图。

1.分别用欧拉法、二阶龙格-库塔法、四阶龙格-库塔法求下面系统的输出响应y(t)在0≤t≤1上,h=0.1时的数值解。

'2,(0)1=-=y y y要求保留4位小数,并将三种方法的结果与真解2=进行比较。

()ty t e-2.若为如2y y y==何编程计算?',(0)1二.实验仪器:计算机Matlab软件三.实验数据记录:程序一:disp('欧拉算法');y=1;h=0.1;for i=0:0.1:1disp(y);y=y+h*(-2*y);enddisp('欧拉算法');ydisp('精确解');yy=exp(-2*t)h=0.1;disp('函数的2阶数值解为');disp('y=');y=1;for t=0:h:1;disp(y);k1=-2*y;k2=-2*(y+k1*h);y(i+1)=y(i)+(k1+k2)*h*1/2;endh=0.1;disp('函数的4阶数值解为');disp('y=');y=1;for t=0:h:1;disp(y);k1=-2*y;k2=-2*(y+k1*h*1/2);k3=-2*(y+k2*h*1/2);k4=-2*(y+k3*h);y=y+h*1/6*(k1+2*k2+2*k3+k4); end>>程序2:t=0:0.1:1;n=length(t);y(1)=1;h=0.1;for i=1:n-1y(i+1)=y(i)+h*(y(i)*y(i)); enddisp('欧拉算法');ydisp('精确解');yy=exp(-2*t)h=0.1;disp('函数的2阶数值解为');disp('y=');y=1;for t=0:h:1;disp(y);k1=y*y;k2=(y+k1*h)^2;y=y+(k1+k2)*h*1/2;endh=0.1;disp('函数的4阶数值解为');disp('y=');y=1;disp(y);k1=y*y;k2=(y+k1*h*1/2)^2;k3=(y+k2*h*1/2)^2;k4=(y+k3*h)^2;y=y+h*1/6*(k1+2*k2+2*k3+k4); end。

用MATLAB求解微分方程及微分方程组

用MATLAB求解微分方程及微分方程组
解 输入命令: y=dsolve('D2y+4*Dy+29*y=0','y(0)=0,Dy(0)=15','x') 运行结果为 : y =3e-2xsin(5x)
例 3 求微分方程组的通解. dx dt 2 x 3 y 3 z dy 4 x 5 y 3z dt dz 4 x 4 y 2 z dt
任取k1、k2的一组初始值:k0=[2,1];
输入命令: k=lsqcurvefit('curvefun1',k0,t,c) 运行结果为: k =[ 1.3240 作图表示求解结果: t1=0:0.1:18; f=curvefun1(k,t1); plot(t,c,'ko',t1,f,'r-')
90 80 70 60 50 40 30 20 10 0
0.2573]
0
2
46Leabharlann 81012
14
16
18
模型2:慢速饮酒时,体液中酒精含量的变化率
dx k2 x a dt x(0) 0
其中
M a T
M为饮酒的总量,T为饮酒的时间
则有;
a x (1 e k 2 t ) k2
5 5 ) 处时被导弹击中. 当 x 1时 y ,即当乙舰航行到点 (1, 24 24 y 5 被击中时间为: t . 若 v0=1, 则在 t=0.21 处被击中. v0 24v0
轨迹图如下
例: 饮酒模型
模型1:快速饮酒后,胃中酒精含量的变化率
dy k1 y dt y (0) M
5 5 ) 处时被导弹击中. 当 x 1时 y ,即当乙舰航行到点 (1, 24 24 y 5 被击中时间为 : t . 若 v0=1, 则在 t=0.21 处被击中. v0 24v0

实验二MATLAB数值计算常微分方程的求解

实验二MATLAB数值计算常微分方程的求解

实验二MATLAB数值计算常微分方程的求解引言:微分方程是描述物理问题和工程问题的重要工具,也是数学和工程学科中的重要课题。

解析方法可以求得一些简单微分方程的解析解,但对于复杂问题,常常无法得到解析解。

此时,数值求解方法成为一种有效的工具。

MATLAB是一个功能强大的数值计算软件,对于求解常微分方程组也提供了多种数值方法。

本实验将介绍MATLAB中求解常微分方程(组)的方法,并通过实例来演示这些方法的应用。

一、MATLAB的常微分方程(组)求解函数MATLAB提供了多种函数用于求解常微分方程(组),其中最常用的函数是ode45、ode23和ode15s。

这些函数采用不同的数值方法,精度和效率也不同。

下面分别对这些函数进行简单介绍:1. ode45函数:ode45函数采用了一种自适应的步长控制算法,可以在一个时间段内自动调整步长。

这个函数的语法是:[t,y] = ode45(odefun,tspan,y0,options)其中,odefun是一个函数句柄,表示待解的常微分方程组,tspan是求解区间,y0是初始条件,options是一个结构体,包含其他的参数和选项。

2. ode23函数:ode23函数也采用了自适应的步长控制算法,但相对于ode45,它是一个简化版本,只允许使用比较简单的问题。

这个函数的语法与ode45相似:[t,y] = ode23(odefun,tspan,y0,options)3. ode15s函数:ode15s函数采用了一种隐式数值方法,适用于比较刚性(stiff)的常微分方程。

这个函数的语法与前两个函数也相似:[t,y] = ode15s(odefun,tspan,y0,options)以上是MATLAB提供的三种解常微分方程(组)的函数,根据问题的特点和求解的需求选择相应的函数。

二、实例演示在本实验中,我们将通过一个实例来演示如何使用MATLAB解常微分方程组。

假设有一个简单的线性常微分方程组:dy1/dt = -2y1 + y2dy2/dt = y1 - 2y2给定初始条件为y1(0)=1,y2(0)=0,求在t=[0,5]时,y1和y2的解。

实验二MATLAB 求微分方程的解

实验二MATLAB    求微分方程的解

实验二 微分方程求解一、问题背景与实验目的实际应用问题通过数学建模所归纳而得到的方程,绝大多数都是微分方程,真正能得到代数方程的机会很少.另一方面,能够求解的微分方程也是十分有限的,特别是高阶方程和偏微分方程(组).这就要求我们必须研究微分方程(组)的解法,既要研究微分方程(组)的解析解法(精确解),更要研究微分方程(组)的数值解法(近似解).对微分方程(组)的解析解法(精确解),Matlab 有专门的函数可以用,本实验将作一定的介绍.本实验将主要研究微分方程(组)的数值解法(近似解),重点介绍 Euler 折线法.二、相关函数(命令)及简介1.dsolve('equ1','equ2',…):Matlab 求微分方程的解析解.equ1、equ2、…为方程(或条件).写方程(或条件)时用 Dy 表示y 关于自变量的一阶导数,用用 D2y 表示 y 关于自变量的二阶导数,依此类推.2.simplify(s):对表达式 s 使用 maple 的化简规则进行化简. 例如: syms xsimplify(sin(x)^2 + cos(x)^2) ans=13.[r,how]=simple(s):由于 Matlab 提供了多种化简规则,simple 命令就是对表达式 s 用各种规则进行化简,然后用 r 返回最简形式,how 返回形成这种形式所用的规则.例如: syms x[r,how]=simple(cos(x)^2-sin(x)^2) r = cos(2*x) how = combine4.[T,Y] = solver(odefun,tspan,y 0) 求微分方程的数值解. 说明:(1) 其中的 solver 为命令 ode45、ode23、ode113、ode15s 、ode23s 、ode23t 、ode23tb 之一.(2) odefun是显式常微分方程:⎪⎩⎪⎨⎧==00)(),(yt y y t f dt dy(3) 在积分区间 tspan =],[0f t t 上,从0t 到f t ,用初始条件0y 求解.(4) 要获得问题在其他指定时间点 ,210,,t t t 上的解,则令 tspan =],,,[,210f t t t t (要求是单调的).(5) 因为没有一种算法可以有效地解决所有的 ODE 问题,为此,Matlab 提供了多种求解器 Solver ,对于不同的ODE 问题,采用不同的Solver .(6) 要特别的是:ode23、ode45 是极其常用的用来求解非刚性的标准形式的一阶常微分方程(组)的初值问题的解的 Matlab 的常用程序,其中:ode23 采用龙格-库塔2 阶算法,用3 阶公式作误差估计来调节步长,具有低等的精度.ode45 则采用龙格-库塔4 阶算法,用5 阶公式作误差估计来调节步长,具有中等的精度.5.ezplot(x,y ,[tmin,tmax]):符号函数的作图命令.x,y 为关于参数t 的符号函数,[tmin,tmax] 为 t 的取值范围.6.inline():建立一个内联函数.格式:inline('expr', 'var1', 'var2',…) ,注意括号里的表达式要加引号.例:Q = dblquad(inline('y*sin(x)'), pi, 2*pi, 0, pi)三、实验内容1. 几个可以直接用 Matlab 求微分方程精确解的例子: 例1:求解微分方程22xxexy dxdy -=+,并加以验证.求解本问题的Matlab 程序为:syms x y %line1 y=dsolve('Dy+2*x*y=x*exp(-x^2)','x') %line2diff(y ,x)+2*x*y-x*exp(-x^2) %line3 simplify(diff(y ,x)+2*x*y-x*exp(-x^2)) %line4 说明:(1) 行line1是用命令定义x,y 为符号变量.这里可以不写,但为确保正确性,建议写上;(2) 行line2是用命令求出的微分方程的解:1/2*exp(-x^2)*x^2+exp(-x^2)*C1(3) 行line3使用所求得的解.这里是将解代入原微分方程,结果应该为0,但这里给出:-x^3*exp(-x^2)-2*x*exp(-x^2)*C1+2*x*(1/2*exp(-x^2)*x^2+exp(-x^2)*C1)(4) 行line4 用 simplify() 函数对上式进行化简,结果为 0, 表明)(x y y =的确是微分方程的解.例2:求微分方程0'=-+x e y xy 在初始条件e y 2)1(=下的特解,并画出解函数的图形.求解本问题的 Matlab 程序为: syms x yy=dsolve('x*Dy+y-exp(x)=0','y(1)=2*exp(1)','x') ezplot(y)微分方程的特解为:y=1/x*exp(x)+1/x* exp (1) (Matlab 格式),即xe e y x+=,解函数的图形如图 1:图1例3:求微分方程组⎪⎪⎩⎪⎪⎨⎧=--=++035y x dt dy e y x dtdx t在初始条件0|,1|00====t t y x 下的特解,并画出解函数的图形.求解本问题的 Matlab 程序为: syms x y t[x,y]=dsolve('Dx+5*x+y=exp(t)','Dy-x-3*y=0','x(0)=1','y(0)=0','t') simple(x); simple(y);ezplot(x,y ,[0,1.3]);axis auto微分方程的特解(式子特别长)以及解函数的图形均略. 2. 用ode23、ode45等求解非刚性的标准形式的一阶常微分方程(组)的初值问题的数值解(近似解).例4:求解微分方程初值问题⎪⎩⎪⎨⎧=++-=1)0(2222y x x y dxdy 的数值解,求解范围为区间[0, 0.5].fun=inline('-2*y+2*x^2+2*x','x','y'); [x,y]=ode23(fun,[0,0.5],1); x'; y';plot(x,y ,'o-') >> x' ans =0.0000 0.0400 0.0900 0.1400 0.1900 0.2400 0.2900 0.3400 0.3900 0.4400 0.4900 0.5000 >> y' ans =1.0000 0.9247 0.8434 0.7754 0.7199 0.6764 0.6440 0.6222 0.6105 0.6084 0.6154 0.6179 图形结果为图 2.图2例 5:求解描述振荡器的经典的 V er der Pol 微分方程.7,0)0(',1)0(,0)1(222====+--μμy y y dtdy y dty d分析:令,,121dtdx x y x ==则.)1(,1221221x x x dtdx x dtdx --==μ先编写函数文件verderpol.m : function xprime = verderpol(t,x) global mu;xprime = [x(2);mu*(1-x(1)^2)*x(2)-x(1)]; 再编写命令文件vdp1.m : global mu; mu = 7; y0=[1;0][t,x] = ode45('verderpol',[0,40],y0); x1=x(:,1);x2=x(:,2); plot(t,x1)图形结果为图3.图33. 用 Euler 折线法求解前面讲到过,能够求解的微分方程也是十分有限的.下面介绍用 Euler 折线法求微分方程的数值解(近似解)的方法.Euler 折线法求解的基本思想是将微分方程初值问题⎪⎩⎪⎨⎧==00)(),,(yx y y x f dx dy化成一个代数方程,即差分方程,主要步骤是用差商hx y h x y )()(-+替代微商dxdy ,于是:⎪⎩⎪⎨⎧==-+)()),(,()()(00x y y x y x f h x y h x y k k k k 记)(,1k k k k x y y h x x =+=+,从而)(1h x y y k k +=+,则有1,,2,1,0).,(,),(1100-=⎪⎩⎪⎨⎧+=+==++n k y x hf y yh x x x y y k k k k k k 例 6:用 Euler 折线法求解微分方程初值问题⎪⎩⎪⎨⎧=+=1)0(,22y y x y dxdy 的数值解(步长h 取0.4),求解范围为区间[0,2].解:本问题的差分方程为1,,2,1,0).2),( ),(,,4.0,1,021100-=⎪⎪⎪⎩⎪⎪⎪⎨⎧+=+=+====++n k y x y y x f y x hf y y h x x h y x k k k k k k (其中: 相应的Matlab 程序见附录 1. 数据结果为:0 1.0000 0.4000 1.4000 0.8000 2.1233 1.2000 3.1145 1.6000 4.4593 2.0000 6.3074图形结果见图4:图4特别说明:本问题可进一步利用四阶 Runge-Kutta 法求解,读者可将两个结果在一个图中显示,并和精确值比较,看看哪个更“精确”?(相应的 Matlab 程序参见附录 2).四、自己动手1. 求微分方程0sin 2')1(2=-+-x xy y x 的通解.2. 求微分方程x e y y y x sin 5'2''=+-的通解.3. 求微分方程组⎪⎪⎩⎪⎪⎨⎧=-+=++00y x dtdy y x dtdx在初始条件0|,1|00====t t y x 下的特解,并画出解函数()y f x =的图形. 4. 分别用 ode23、ode45 求上述第 3 题中的微分方程初值问题的数值解(近似解),求解区间为[0,2]t ∈.利用画图来比较两种求解器之间的差异.5. 用 Euler 折线法求解微分方程初值问题⎪⎩⎪⎨⎧=-=1)0(,12'32y y xy y 的数值解(步长h 取0.1),求解范围为区间[0,2].6. 用四阶 Runge-Kutta 法求解微分方程初值问题⎩⎨⎧=-=1)0(,cos 'y x e y y x 的数值解(步长h 取0.1),求解范围为区间[0,3].四阶 Runge-Kutta 法的迭代公式为(Euler 折线法实为一阶 Runge-Kutta 法):1,,2,1,0),()2,2()2,2(),()22(6,),(342312143211100-=⎪⎪⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎪⎪⎨⎧++=++=++==++++=+==++n k hL y h x f L L h y h x f L L h y h x f L y x f L L L L L hy y h x x x y y k k k k k k k k k k k k 相应的 Matlab 程序参见附录 2.试用该方法求解第5题中的初值问题. 7. 用 ode45 方法求上述第 6 题的常微分方程初值问题的数值解(近似解),从而利用画图来比较两者间的差异.五、附录附录 1:(fulu1.m)clearf=sym('y+2*x/y^2'); a=0; b=2; h=0.4;n=(b-a)/h+1; x=0; y=1;szj=[x,y]; for i=1:n-1y=y+h*subs(f,{'x','y'},{x,y}); x=x+h;szj=[szj;x,y]; end szjplot(szj(:,1),szj(:,2))附录 2:(fulu2.m)clearf=sym('y-exp(x)*cos(x)'); a=0; b=3; h=0.1;n=(b-a)/h+1; x=0; y=1;szj=[x,y];for i=1:n-1l1=subs(f,{'x','y'},{x,y});l2=subs(f,{'x','y'},{x+h/2,y+l1*h/2});l3=subs(f,{'x','y'},{x+h/2,y+l2*h/2});l4=subs(f,{'x','y'},{x+h,y+l3*h});y=y+h*(l1+2*l2+2*l3+l4)/6;x=x+h;szj=[szj;x,y];endszjplot(szj(:,1),szj(:,2))。

数学应用软件作业6-用Matlab求解微分方程(组)的解析解和数值解

数学应用软件作业6-用Matlab求解微分方程(组)的解析解和数值解

数学应用软件作业6-用Matlab 求解微分方程(组)的解析解和数值解注:上机作业文件夹以自己的班级姓名学号命名,文件夹包括如下上机报告和Matlab程序。

上机报告模板如下:佛山科学技术学院上机报告课程名称数学应用软件上机项目用Matlab求解微分方程(组)的解析解和数值解专业班级姓名学号一. 上机目的1.了解求微分方程(组)的解的知识。

2.学习Matlab中求微分方程的各种解的函数,如dsolve命令、ode45函数等等,其中注意把方程化为新的方程的形式。

3.掌握用matlab编写程序解决求解微分方程的问题。

二. 上机内容1、求高阶线性齐次方程:y’’’-y’’-3y’+2y=0。

2、求常微分方程组2210cos,224,0tttdx dyx t xdt dtdx dyy e ydt dt=-=⎧+-==⎪⎪⎨⎪++==⎪⎩3、求解分别用函数ode45和ode15s计算求解,分别画出图形,图形分别标注标题。

4、求解微分方程,1)0(,1'=++-=ytyy先求解析解,在[0,1]上作图;再用ode45求数值解(作图的图形用“o”表示),在同一副图中作图进行比较,用不同的颜色表示。

三. 上机方法与步骤给出相应的问题分析及求解方法,并写出Matlab 程序,并有上机程序显示截图。

题1:直接用命令dsolve求解出微分方程的通解。

Matlab程序:dsolve('D3y-D2y-3*Dy+2*y','x')题2:将微分方程组改写为5cos2exp(2)5cos2exp(2)(0)2,(0)0dxt t x yxtdyt t x ydtx y⎧=+---⎪⎪⎪=-+-+-⎨⎪==⎪⎪⎩,再用命令dsolve求解微分方程的通解。

Matlab程序:建立timu2.m如下:[x,y]=dsolve('Dx=5*cos(t)+2*exp(-2*t)-x-y','Dy=-5*cos(t)+2*exp(-2*t)+x-y ','x(0)=2,y(0)=0','t')x=simple(x)y=simple(y)题3:由于所给的微分方程为一阶微分方程,则直接用函数ode45和ode15s求解微分方程的数值解,具体程序如下:(1)Matlab程序:建立M文件fun2.m,如下:function dy=fun2(t,y);dy=zeros(2,1);dy(1)=0.04*(1-y(1))-(1-y(2))*y(1)+0.0001*((1-y(2))^2);dy(2)=-10000*y(1)+3000*((1-y(2))^2);取t0=0,tf=100,建立程序timu32.m如下:t0=0;tf=100;[T,Y]=ode45('fun2',[0 100],[1 1]);plot(T,Y(:,1),'+',T,Y(:,2),'*');title('ode45图形');(2)Matlab程序:建立M文件fun1.m,如下:function dy=fun1(t,y);dy=zeros(2,1);dy(1)=0.04*(1-y(1))-(1-y(2))*y(1)+0.0001*((1-y(2))^2);dy(2)=-10000*y(1)+3000*((1-y(2))^2);取t0=0,tf=100,建立程序timu3.m如下:t0=0;tf=100;[T,Y]=ode15s('fun1',[0 100],[1 1]);plot(T,Y(:,1),'+',T,Y(:,2),'*');title('ode15s图形');题4:Matlab程序:(1)先建立程序timu41.m如下:y=dsolve('Dy=-y+t+1','y(0)=1','t') 截图如下:作图:建立程序tuxing41.m如下:ezplot('t + 1/exp(t)',[0,1])title('t + 1/exp(t)')(2)先建立M文件fun3.m,如下:function dy=fun3(t,y)dy=zeros(1,1);dy(1)=-y(1)+t+1;再取t0=0,tf=1,建立程序tuxing42.m如下:t0=0;tf=1;[T,Y]=ode45('fun3',[0 1],[1]);plot(T,Y,'ro');title('比较图');t=0:0.1:1;y=t+1./exp(t);hold onplot(t,y,'b');四.上机结果题1结果为:ans =C4*exp(2*x) + C2*exp(x*(5^(1/2)/2 - 1/2)) + C3/exp(x*(5^(1/2)/2 + 1/2))题2结果为:x =4*cos(t) - 2/exp(2*t) + 3*sin(t) - (2*sin(t))/exp(t) y =sin(t) - 2*cos(t) + (2*cos(t))/exp(t)题3结果为:题4结果为:解析解为:y =t + 1/exp(t)作图如下:。

MATLAB求解微分方程

MATLAB求解微分方程

dx y z dt dy 例( 4 Rossler方程) x ay dt dz dt b ( x c) z
选定a=0.3,b=2,c=3 初值x(0)=0,y(0)=0,z(0)=0
• a=0.3;b=2;c=3; • rossler=@(t,y)[-y(2)-y(3),y(1)+a*y(2),b+(y(1)c)*y(3)]'; • ts=[0 100];x0=[0 0 0]; • [t,y]=ode45(rossler,ts,x0); • plot(t,y(:,1),'r',t,y(:,2),'b',t,y(:,3),'g'); • figure • plot3(y(:,1),y(:,2),y(:,3)) •
d 2x 2 dx 2 1000(1 x ) x 0 例3 dt dt x(0) 2; x' (0) 0
STEP1
令 y1=x,y2=y1’
化为一阶微分方程组:
y1 ' y2 2 (1 y1 ) y2 y1 y2 ' 1000 y (0) 2, y (0) 0 1 2
• STEP2 建立M文件 • function dy=vdp(t,y) dy=[y(2); 1000*(1-y(1)^2)*y(2)-y(1);]
STEP3 调用MATLAB 函数ODE15S [T,Y]=ode15s('vdp',[0 3000],[2 0]); plot(T,Y(:,1))
用Matlab求微分方程的数值解
[t,x]=solver(’f’,ts,x0,options)
自变 量值 函数 值

matlab求微分方程组的解析解

matlab求微分方程组的解析解

matlab求微分方程组的解析解(实用版)目录1.引言2.MATLAB 求微分方程组的解析解的方法3.示例:求解一阶微分方程组4.示例:求解二阶微分方程组5.总结正文一、引言微分方程组在数学建模和实际问题中有着广泛的应用,求解微分方程组对于理解问题的内在机制和预测未来发展趋势具有重要意义。

在众多数学软件中,MATLAB 凭借其强大的数值计算和图形绘制功能,成为求解微分方程组的常用工具。

本文将介绍如何使用 MATLAB 求解微分方程组的解析解。

二、MATLAB 求微分方程组的解析解的方法MATLAB 求解微分方程组的解析解主要依赖于符号计算函数和数值计算函数。

其中,符号计算函数主要用于求解微分方程组的解析解,数值计算函数则用于求解微分方程组的数值解。

在使用这些函数时,需要确保符号计算和数值计算的顺序,以避免计算错误。

三、示例:求解一阶微分方程组考虑如下一阶微分方程组:```dy/dx = x + ydz/dx = x - z```我们可以使用 MATLAB 的符号计算函数`symfun`和`symvar`来求解该方程组。

首先,定义符号变量 x、y、z 和 p(表示参数),然后使用`symfun`函数创建微分方程组的符号表达式。

接着,利用`symvar`函数求解微分方程组,并将结果转换为数值形式。

最后,使用`plot`函数绘制解的图形。

四、示例:求解二阶微分方程组考虑如下二阶微分方程组:```x"" + 3x" + 2x = 0y"" + 3y" + 2y = 0```我们可以使用 MATLAB 的符号计算函数`symfun`和`symvar`来求解该方程组。

首先,定义符号变量 x、y 和 p(表示参数),然后使用`symfun`函数创建微分方程组的符号表达式。

接着,利用`symvar`函数求解微分方程组,并将结果转换为数值形式。

最后,使用`plot`函数绘制解的图形。

matlab求微分方程组的解析解

matlab求微分方程组的解析解

MATLAB求微分方程组的解析解引言在科学与工程领域,微分方程组是一种常见的数学模型,用于描述各种物理现象和工程问题。

解析解是指能够用公式表达出来的精确解。

本文将介绍如何使用M ATL A B求解微分方程组的解析解。

1.方程组的建立首先,我们需要确定待求解的微分方程组。

假设我们有一个由n个微分方程组成的方程组,可以写为如下形式:d y1/dt=f1(t,y1,y2,...,yn)d y2/dt=f2(t,y1,y2,...,yn)......d y n/dt=f n(t,y1,y2,...,yn)其中`t`是自变量,`y1,y2,...,y n`是因变量,`f1,f2,...,fn`是给定的函数关系。

我们的目标是求解`y1(t),y2(t),...,yn(t)`的解析解。

2.使用MAT LAB求解M A TL AB提供了强大的求解微分方程组的工具,我们可以使用其中的函数来求解上述方程组的解析解。

首先,我们需要在MA T LA B中定义方程组的函数形式。

可以通过定义一个函数或者使用匿名函数来实现。

例如,我们可以定义一个名为`m yE qu at io ns`的函数,其输入参数为`t`和一个向量`y`,输出为一个向量`d y`,代表方程组的左侧和右侧的变量分别。

函数示例如下:f u nc ti on dy=m yE qua t io ns(t,y)%定义方程组d y=z er os(n,1);d y(1)=f1(t,y(1),y(2),...,y(n));d y(2)=f2(t,y(1),y(2),...,y(n));......d y(n)=fn(t,y(1),y(2),...,y(n));e n d然后,我们可以使用M AT LA B的`d so lv e`函数来求解微分方程组的解析解。

示例如下:s y ms ty1(t)y2(t)...yn(t)a s su me(t,'re al')a s su me(y1(t),'rea l')a s su me(y2(t),'rea l')......a s su me(y n(t),'rea l')e q n1=d if f(y1(t),t)==f1(t,y1(t),y2(t),...,y n(t));e q n2=d if f(y2(t),t)==f2(t,y1(t),y2(t),...,y n(t));......e q nn=d if f(yn(t),t)==fn(t,y1(t),y2(t),...,y n(t));e q ns=[eq n1,e qn2,...,eq nn];S=ds ol ve(e qn s);`S`即为方程组的解析解集合。

matlab练习程序(非线性常微分方程组参数拟合)

matlab练习程序(非线性常微分方程组参数拟合)

matlab练习程序(⾮线性常微分⽅程组参数拟合)和拟合类似,我们要⽤差分代替微分,然后进⾏插值处理,然后构造最⼩化函数。

最后⽤最优化⽅法处理该函数即可。

这⾥举个例⼦,先随便设⼀个⾮线性微分⽅程组,并给定初值:然后定义最⼩化函数:最后⽤⾮线性最优化⽅法解决。

matlab代码如下:clear all;close all;clc;bsrc = rand(4,1);[t,h] = ode45(@(t,x)test1(t,x,bsrc),[0100],[11]);plot(t,h(:,1),'r');hold on;plot(t,h(:,2),'r');hold on;t = t(1:3:2*end/3);x1 = h(1:3:2*end/3,1);x2 = h(1:3:2*end/3,2);plot(t,x1,'ro');plot(t,x2,'ro');T=min(t):0.1:max(t); %插值处理,如果数据多,也可以不插值X1=spline(t,x1,T)';X2=spline(t,x2,T)';plot(T,X1,'b.');plot(T,X2,'b.');dX1 = diff(X1)*10; dX1=[dX1;dX1(end)];dX2 = diff(X2)*10; dX2=[dX2;dX2(end)];%BFGS求解syms k1 k2 k3 k4;ff = sum((dX1 - (k1*exp(1./X1)+k4*sin(X2))).^2+(dX2-(cos(X1)*k2+k3*(1./X2))).^2);dff1 = diff(ff,k1);dff2 = diff(ff,k2);dff3 = diff(ff,k3);dff4 = diff(ff,k4);f = inline(char(ff),'k1','k2','k3','k4');g1 = inline(char(dff1),'k1','k2','k3','k4');g2 = inline(char(dff2),'k1','k2','k3','k4');g3 = inline(char(dff3),'k1','k2','k3','k4');g4 = inline(char(dff4),'k1','k2','k3','k4');b = rand(4,1);rho=0.2;sigma=0.2;H=eye(4);re=[];for i=1:1000g=[g1(b(1),b(2),b(3),b(4));g2(b(1),b(2),b(3),b(4));g3(b(1),b(2),b(3),b(4));g4(b(1),b(2),b(3),b(4));];dk=-inv(H)*g;mk=1;for j=1:50new=f(b(1)+rho^j*dk(1),...b(2)+rho^j*dk(2),...b(3)+rho^j*dk(3),...b(4)+rho^j*dk(4));old=f(b(1),b(2),b(3),b(4));if new < old +sigma*rho^j*g'*dkmk=j;break;endendnorm(g)if norm(g)<1e-30 || isnan(new)break;endb = b + rho^mk*dk;gg=[g1(b(1),b(2),b(3),b(4));g2(b(1),b(2),b(3),b(4));g3(b(1),b(2),b(3),b(4));g4(b(1),b(2),b(3),b(4));];q = gg - g; %q = g(k+1)-g(k)p = rho^mk*dk; %p = x(k+1)-x(k)H = H - (H*p*p'*H)/(p'*H*p) + (q*q')/(q'*p); %矩阵更新endbsrcb[t,h] = ode45(@(t,x)test1(t,x,b),[0100],[11]);plot(t,h(:,1),'g');hold on;plot(t,h(:,2),'g');test1.m:function dy=test1(t,x,A)a = A(1);b = A(2);c = A(3);d = A(4);dy=[a*exp(1/x(1))+d*sin(x(2));cos(x(1))*b+c/x(2)];结果如下:上⾯这个结果还算可以。

利用MATLAB求解微分方程

利用MATLAB求解微分方程

利用MATLAB求解微分方程第三章 MATLAB 上机练习题目(4)利用MATLAB 求解微分方程一、答卷形式:新建一个word 文档,将以下每道练习题使用的命令(或程序)及其运行结果按顺序排列在该word 文档中,文档中必须写上自己的名字和学号,并以自己的名字命名,最后提交该word 文档。

二、练习题目:1、利用dsolve 命令求解下列微分方程的通解,并用命令simplify 化简。

(1)x y xe '''= (2)33x y y y y e ''''''+++= (3)4cos x y y e x '''-=+2、利用dsolve 命令求解下列微分方程的特解,并用命令ezplot 在指定区间内画出积分曲线。

(1)Logistic 模型:0.2(1),(0)3,[0,60]500dx x x x t dt =-=∈ (2)2(1)0,(0)0,(0)1,[1,1]x y xy y y x ''''--===∈-(3)2633109,(0),(0),[5,0.25]77x y y y e y y x ''''-+===∈- 3、求解快速静脉注射条件下,药物在体内分布的二室模型的特解21213211112212()V df k k f k g dt V V dg k f k g dt V ?=-++=-??初始条件为01(0)/,(0)0f T V g == 4、求微分方程2,(0)1x y y y y'=-=的解析解和其在[0,1]上的数值解,计算它们之间的误差,分别用不同的线型和颜色将解析解和数值解绘制在一张图上。

计算数值解时,要求步长为0.01。

5、求微分方程组=-+=++00y x dtdy y x dt dx 在初始条件0|,1|00====t t y x 下的特解(解析解),并利用ezplot 命令画出解函数()y f x =的图形.6. 分别用 ode23、ode45 求上述第 5 题中的微分方程初值问题的数值解,求解区间为[0,2]t ∈.(求解析解的数值结果时利用命令subs 命令)利用画图和误差分析(主要比较误差的最大值、最小值和平均值)来比较两种求解器之间的差异.7、求二阶微分方程22120,2,222x y xy x y y y πππ''''++-===- ? ? ???????的数值解,,2x ππ??∈。

matlab微分方程组的解法

matlab微分方程组的解法

一、引言1.1 MATLAB在微分方程组求解中的应用MATLAB作为一种强大的数学工具,被广泛应用于微分方程组的求解与模拟分析。

1.2 本文的研究目的和意义本文旨在探讨MATLAB在求解微分方程组方面的应用方法,帮助读者更好地理解和运用MATLAB进行微分方程组的解法,从而提高数学建模和工程仿真的效率与精度。

二、微分方程组的基本概念2.1 微分方程组的定义微分方程组是由多个未知函数及其偏导数构成的方程组。

常见的微分方程组可以分为线性微分方程组与非线性微分方程组。

2.2 微分方程组的求解方法求解微分方程组的方法包括解析解法、数值解法和符号解法。

而MATLAB在微分方程数值解法中具有独特的优势。

三、MATLAB在微分方程组求解中的基本操作3.1 MATLAB中微分方程组的表示在MATLAB中,微分方程组可以使用符号表达式或者函数形式表示,便于进行数值求解和仿真分析。

3.2 MATLAB中微分方程组的数值求解利用MATLAB中的ode45、ode23等求解微分方程组的函数,可以快速地求得微分方程组的数值解,并且可以灵活地控制求解的精度和速度。

3.3 MATLAB中微分方程组的图像绘制MATLAB提供了丰富的绘图函数,能够直观地展现微分方程组的数值解,帮助用户更直观地理解微分方程组的解法结果。

四、 MATLAB在微分方程组求解中的应用实例4.1 简单的线性微分方程组求解通过一个简单的线性微分方程组的求解实例,展示MATLAB在微分方程组求解中的基本操作和方法。

4.2 复杂的非线性微分方程组求解通过一个包含非线性项的微分方程组求解实例,展示MATLAB在处理复杂微分方程组时的应用能力。

五、MATLAB在微分方程组求解中的进阶应用5.1 高阶微分方程组的数值求解MATLAB可以利用符号运算工具箱对高阶微分方程组进行符号求解,也可以通过数值求解的方式得到高阶微分方程组的数值解。

5.2 特定约束条件下的微分方程组求解MATLAB可以通过引入特定的约束条件,对微分方程组进行求解,满足实际应用中的各种约束条件。

非线性方程和常微分方程的解法

非线性方程和常微分方程的解法

非线性方程和常微分方程的解法非线性方程和常微分方程的解法实验8 非线性方程和常微分方程的解法一、实验目的学会用MATLAB软件求解非线性方程和常微分方程。

二、实验内容与要求1. 非线性方程的整值解(1)最小二乘法格式:fsolve(’fun’,x0)%求方程fun=0在估计值x附近的近似解。

[例1.72] 求方程x e 0的解。

fc=inline(‘x-exp(-x)’);xl=fsolve(fc,0)xl=0.5671问题1.28:求解方程5xsinx-e 0,观察知有多解,如何求之?先用命令fplot(’5__^2*sin(x)-exp(-x),0]’,[0,10])作图1.13,注意5__^2*sin(x)-exp(-x),0]中的“[ ,0]”是作y=0直线,即x轴。

方程在[0,10]区间从图中可看出有4个解,分别在0,3,6,9附近,所以用命令:fun=inline(’5__^2*sin(x)-exp(-x)’);fsolve(fun,[0,3,6,9],le-6)得出结果:ans=0.5918 3.1407 6.2832 9.4248【例1.73】求解方程组x-0.7sinx-0.2cosy=0 2-x-xy 0.7cosx 0.2siny 0先编制函数文件fu.m:function y=fu (x)y (1)=x (1) - 0.7*sin ( x (1) ) - 0.2*cos( x (2) ) ;y (2)=x (1) - 0.7*cos (x (1) ) + 0.2*sin (x (2) );y =[ y(1), y(2) ];在命令窗口调用fu运算:x1 =fsolve( ‘fu’, [0.5,0.5 ])x1 =0.5265 0.5079(2) 零点法格式:fzero('fun',x0) %求函数fun在x0附近的零点。

说明:估计值x0若为标量时,则在x0附近查找零点,x0=[x1,x2]向量时,则首先要求函数值fun(x1)fun(x2) 0,然后将严格在[x1,x2]区间内零点,若找不到,系统将给出提示。

Matlab实例源码教程:如何用MATLAB求解非线性微分方程

Matlab实例源码教程:如何用MATLAB求解非线性微分方程

Matlab实例源码教程:如何用MATLAB求解非线性微分方程Matlab实例源码教程:如何用MATLAB求解非线性微分方程做一个最基本的假设:你们都看过高数。

一。

老湿发话了:童鞋们,求解一下这个方程,判断她是否稳定。

要是稳定,那么她是否存在极限环:一看明白了,这不就是传说中的范德普方程。

地球人都知道她稳定并有极限环。

现在我们就看看如何用MATLAB求解她的轨迹。

二。

一般的计算机求解方程的方法无外乎是这样:首先把该方程改写成一个规范的形式,一般使用状态空间表示法;而后调用已有的算法进行求解;最后对得出的结果进行处理,比如画图之类的。

接下来就对这三大步分别作出解释。

三。

输入待求解的方程。

首先我们知道,状态空间的标准形式(自由系统)是:这里X是列向量,F是作用于列向量的函数,可以是线性也可以是非线性。

范德普方程可以改写成这样的标准形式:MATLAB中关于输入输入待解方程的语句特别简单。

需要先定义一个普通函数,函数名任意,姑且叫做myFcn,格式如下 function xdot = myFcn (t, x) 需要注意的是,函数必须含有t, x两个参数,名称可以自己任意定。

xdot是这个函数本身的返回值,只出现在这个函数内部,因此也可以任意定。

定义中的x被视为是一个列向量,x(i)表示列向量中的第i个分量。

那么F函数的每一个分量即简单地用表达时给出即可。

其中的自变量可以引用x(i)。

以范德普方程为例:xdot = [x(2) ; u(1-x(1)^2)*x(2)-x(1)]于是,这两句话便构成了待解函数。

四。

调用MATLAB函数进行求解通常人工求解微分方程需要知道初始值,计算机求解也不例外。

另外,由于非线性方程一般只有数值解,故计算精度也可以调整。

这些都是可以自己调整的参数。

调用MATLAB计算求解常微分方程的模式很简单,格式为:[t, x] = ode45(@myFcn, [开始时间结束时间], [初始值列向量], options) 注意到求解出来的结果是[t, x]即一堆数,所以需要我们进行后处理比如画图之类的。

实验2利用matlab解非线性、微分方程组答案

实验2利用matlab解非线性、微分方程组答案

实验2 利用matlab解(非)线性、微分方程(组)-答案1、对于下列线性方程组:(1)请用直接法求解;(2)请用LU分解方法求解;(3)请用QR分解方法求解;(4)请用Cholesky分解方法求解。

(1)>> A=[2 9 0;3 4 11;2 2 6]A =2 9 03 4 112 2 6>> B=[13 6 6]'B =1366>> x=inv(A)*Bx =7.4000-0.2000-1.4000或:>> X=A\BX =7.4000-0.2000-1.4000(2)>> [L,U]=lu(A);>> x=U\(L\B)x =7.4000-0.2000-1.4000(3)>> [Q,R]=qr(A);>> x=R\(Q\B)x =7.4000-0.2000-1.4000(4)>> chol(A)??? Error using ==> cholMatrix must be positive definite.2、设迭代精度为10-6,分别用Jacobi 迭代法、Gauss-Serdel 迭代法求解下列线性方程组,并比较此两种迭代法的收敛速度。

Jacobi 迭代法:>> A=[10 -1 0;-1 10 -2;0 -2 10];>> B=[9 7 5]';>> [x,n]=jacobi(A,B,[0,0,0]',1e-6)x =0.99370.93680.6874n =11Gauss-Serdel 迭代法:>> A=[10 -1 0;-1 10 -2;0 -2 10];>> B=[9 7 5]';>> [x,n]=gauseidel(A,B,[0,0,0]',1e-6)x =0.99370.93680.6874n =73、求解非线性方程010=-+x xe x 在2附近的根。

如何用matlab求解非线性微分方程组(基于龙格库塔的数值微分算法)?

如何用matlab求解非线性微分方程组(基于龙格库塔的数值微分算法)?

如何用matlab求解非线性微分方程组(基于龙格库塔的数值微分算法)?例如要求解下面这个含时间的线性微分方程组,如下图所示其中:这里的tau_q,g_f,w0都是不含时间的常数:初始条件为:归一化条件:通过观察以上方程组,可以看到:每个方程等式里面并没有u(t)*v(t)这样的交叉项形式,也就是没有非线性项。

因此,用龙格库塔的数值微分算法,可以有两种思路,一种思路是利用哈密顿量矩阵去算,另外一种思路是用列向量去算。

两种代码如下解析:(1)利用哈密顿量矩阵的思路先构建一个子程序m文件,文件名为:coupled_differential_equation.m这里.m文件写入以下代码:function[U,Er,U_condition,TEST]=coupled_differential_equation(rho_0,T,L,w 0,g_f,tau_q)t=linspace(0,T,L);%最终演化时间T就等于每一个tau_qh=T/L;%h这是步长和精度,不同的tau_q,精度应该不一样C{1}=rho_0; %演化矩阵的初态for x=1:1:LTEST(1:2,x)=C{1};%这里的测试代码时用,没有其他用途,以下才是龙格库塔算法 k1=master(t(1,x),C{1},w0,g_f,tau_q);k2=master(t(1,x)+h/2,C{1}+h*k1/2,w0,g_f,tau_q);k3=master(t(1,x)+h/2,C{1}+h*k2/2,w0,g_f,tau_q);k4=master(t(1,x)+h,C{1}+h*k3,w0,g_f,tau_q);C{1}=C{1}+(k1+2*k2+2*k3+k4)*h/6;U=C{1};endEr=w0*(abs(U(2,1)))^2-(w0*g_f^2)/4*(abs(U(1,1)+U(2,1)))^2-(w0*sqr t(1-g_f^2)-w0)/2;%这是根据Er公式算写的,U(1,1)和U(2,1)就是演化到每一个最终时间T=tau_q时的解u(tau_q)和v(tau_q)解。

Matlab求解微分方程(组)及偏微分方程(组)

Matlab求解微分方程(组)及偏微分方程(组)

第四讲 Matlab 求解微分方程(组)理论介绍:Matlab 求解微分方程(组)命令 求解实例:Matlab 求解微分方程(组)实例实际应用问题通过数学建模所归纳得到的方程,绝大多数都是微分方程,真正能得到代数方程的机会很少.另一方面,能够求解的微分方程也是十分有限的,特别是高阶方程和偏微分方程(组).这就要求我们必须研究微分方程(组)的解法:解析解法和数值解法. 一.相关函数、命令及简介1.在Matlab 中,用大写字母D 表示导数,Dy 表示y 关于自变量的一阶导数,D2y 表示y 关于自变量的二阶导数,依此类推.函数dsolve 用来解决常微分方程(组)的求解问题,调用格式为:X=dsolve(‘eqn1’,’eqn2’,…)函数dsolve 用来解符号常微分方程、方程组,如果没有初始条件,则求出通解,如果有初始条件,则求出特解.注意,系统缺省的自变量为t2.函数dsolve 求解的是常微分方程的精确解法,也称为常微分方程的符号解.但是,有大量的常微分方程虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解,在求常微分方程数值解方面,MATLAB 具有丰富的函数,我们将其统称为solver ,其一般格式为:[T,Y]=solver(odefun,tspan,y0)说明:(1)solver 为命令ode45、ode23、ode113、ode15s 、ode23s 、ode23t 、ode23tb 、ode15i 之一.(2)odefun 是显示微分方程'(,)y f t y =在积分区间tspan 0[,]f t t =上从0t 到f t 用初始条件0y 求解.(3)如果要获得微分方程问题在其他指定时间点012,,,,f t t t t 上的解,则令tspan 012[,,,]f t t t t =(要求是单调的).(4)因为没有一种算法可以有效的解决所有的ODE 问题,为此,Matlab 提供了多种求解器solver ,对于不同的ODE 问题,采用不同的solver.表1 Matlab中文本文件读写函数说明:ode23、ode45是极其常用的用来求解非刚性的标准形式的一阶微分方程(组)的初值问题的解的Matlab常用程序,其中:ode23采用龙格-库塔2阶算法,用3阶公式作误差估计来调节步长,具有低等的精度.ode45则采用龙格-库塔4阶算法,用5阶公式作误差估计来调节步长,具有中等的精度.3.在matlab命令窗口、程序或函数中创建局部函数时,可用内联函数inline,inline函数形式相当于编写M函数文件,但不需编写M-文件就可以描述出某种数学关系.调用inline函数,只能由一个matlab表达式组成,并且只能返回一个变量,不允许[u,v]这种向量形式.因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用inline函数,inline函数的一般形式为:FunctionName=inline(‘函数内容’, ‘所有自变量列表’)例如:(求解F(x)=x^2*cos(a*x)-b ,a,b是标量;x是向量)在命令窗口输入:Fofx=inline(‘x .^2*cos(a*x)-b’ , ‘x’,’a’,’b’); g= Fofx([pi/3 pi/3.5],4,1) 系统输出为:g=-1.5483 -1.7259注意:由于使用内联对象函数inline 不需要另外建立m 文件,所有使用比较方便,另外在使用ode45函数的时候,定义函数往往需要编辑一个m 文件来单独定义,这样不便于管理文件,这里可以使用inline 来定义函数. 二.实例介绍1.几个可以直接用Matlab 求微分方程精确解的实例 例1 求解微分方程2'2x y xy xe -+=程序:syms x y; y=dsolve(‘Dy+2*x*y=x*exp(-x^2)’,’x ’)例 2 求微分方程'0x xy y e +-=在初始条件(1)2y e =下的特解并画出解函数的图形.程序:syms x y; y=dsolve(‘x*Dy+y-exp(1)=0’,’y(1)=2*exp(1)’,’x ’);ezplot(y)例 3 求解微分方程组530tdx x y e dtdy x y dt⎧++=⎪⎪⎨⎪--=⎪⎩在初始条件00|1,|0t t x y ====下的特解并画出解函数的图形.程序:syms x y t[x,y]=dsolve('Dx+5*x+y=exp(t)','Dy-x-3*y=0','x(0)=1','y(0)=0','t') simple(x); simple(y)ezplot(x,y,[0,1.3]);axis auto2.用ode23、ode45等求解非刚性标准形式的一阶微分方程(组)的初值问题的数值解(近似解)例 4 求解微分方程初值问题2222(0)1dy y x xdx y ⎧=-++⎪⎨⎪=⎩的数值解,求解范围为区间[0,0.5].程序:fun=inline('-2*y+2*x^2+2*x','x','y');[x,y]=ode23(fun,[0,0.5],1); plot(x,y,'o-')例 5 求解微分方程22'2(1)0,(0)1,(0)0d y dyy y y y dt dtμ--+===的解,并画出解的图形.分析:这是一个二阶非线性方程,我们可以通过变换,将二阶方程化为一阶方程组求解.令12,,7dyx y x dtμ===,则 121221212,(0)17(1),(0)0dx x x dtdx x x x x dt⎧==⎪⎪⎨⎪=--=⎪⎩ 编写M-文件vdp.m function fy=vdp(t,x)fy=[x(2);7*(1-x(1)^2)*x(2)-x(1)]; end在Matlab 命令窗口编写程序 y0=[1;0][t,x]=ode45(@vdp,[0,40],y0);或[t,x]=ode45('vdp',[0,40],y0); y=x(:,1);dy=x(:,2); plot(t,y,t,dy)练习与思考:M-文件vdp.m 改写成inline 函数程序? 3.用Euler 折线法求解Euler 折线法求解的基本思想是将微分方程初值问题00(,)()dyf x y dxy x y ⎧=⎪⎨⎪=⎩ 化成一个代数(差分)方程,主要步骤是用差商()()y x h y x h +-替代微商dydx,于是00()()(,())()k k k k y x h y x f x y x h y y x +-⎧=⎪⎨⎪=⎩记1,(),k k k k x x h y y x +=+=从而1(),k k y y x h +=+于是0011(),,0,1,2,,1(,).k k k k k k y y x x x h k n y y hf x y ++=⎧⎪=+=-⎨⎪=+⎩例 6 用Euler 折线法求解微分方程初值问题22(0)1dyx y dxy y ⎧=+⎪⎨⎪=⎩的数值解(步长h 取0.4),求解范围为区间[0,2].分析:本问题的差分方程为00110,1,0.4,0,1,2,,1(,).k k k k k k x y h x x h k n y y hf x y ++===⎧⎪=+=-⎨⎪=+⎩程序:>> clear >> f=sym('y+2*x/y^2'); >> a=0; >> b=2; >> h=0.4; >> n=(b-a)/h+1; >> x=0; >> y=1;>> szj=[x,y];%数值解 >> for i=1:n-1y=y+h*subs(f,{'x','y'},{x,y});%subs ,替换函数 x=x+h; szj=[szj;x,y]; end >>szj>> plot(szj(:,1),szj(:,2))说明:替换函数subs 例如:输入subs(a+b,a,4) 意思就是把a 用4替换掉,返回 4+b ,也可以替换多个变量,例如:subs(cos(a)+sin(b),{a,b},[sym('alpha'),2])分别用字符alpha 替换a 和2替换b ,返回 cos(alpha)+sin(2)特别说明:本问题可进一步利用四阶Runge-Kutta 法求解,Euler 折线法实际上就是一阶Runge-Kutta 法,Runge-Kutta 法的迭代公式为001112341213243(),,(22),6(,),0,1,2,,1(,),22(,),22(,).k k k k k k k k k k k k y y x x x h h y y L L L L L f x y k n h h L f x y L h h L f x y L L f x h y hL ++=⎧⎪=+⎪⎪=++++⎪⎪=⎪=-⎨⎪=++⎪⎪⎪=++⎪⎪=++⎩相应的Matlab 程序为:>> clear >> f=sym('y+2*x/y^2'); >> a=0; >> b=2; >> h=0.4; >> n=(b-a)/h+1; >> x=0; >> y=1;>> szj=[x,y];%数值解 >> for i=1:n-1l1=subs(f, {'x','y'},{x,y});替换函数 l2=subs(f, {'x','y'},{x+h/2,y+l1*h/2}); l3=subs(f, {'x','y'},{x+h/2,y+l2*h/2}); l4=subs(f, {'x','y'},{x+h,y+l3*h}); y=y+h*(l1+2*l2+2*l3+l4)/6; x=x+h; szj=[szj;x,y]; end>>szj>> plot(szj(:,1),szj(:,2))练习与思考:(1)ode45求解问题并比较差异. (2)利用Matlab 求微分方程(4)(3)''20y y y -+=的解.(3)求解微分方程''2',2(1)0,030,(0)1,(0)0y y y y x y y --+=≤≤==的特解. (4)利用Matlab 求微分方程初值问题2''''00(1)2,|1,|3x x x y xy y y ==+===的解. 提醒:尽可能多的考虑解法 三.微分方程转换为一阶显式微分方程组Matlab 微分方程解算器只能求解标准形式的一阶显式微分方程(组)问题,因此在使用ODE 解算器之前,我们需要做的第一步,也是最重要的一步就是借助状态变量将微分方程(组)化成Matlab 可接受的标准形式.当然,如果ODEs 由一个或多个高阶微分方程给出,则我们应先将它变换成一阶显式常微分方程组.下面我们以两个高阶微分方程组构成的ODEs 为例介绍如何将它变换成一个一阶显式微分方程组.Step 1 将微分方程的最高阶变量移到等式左边,其它移到右边,并按阶次从低到高排列.形式为:()'''(1)'''(1)()'''(1)'''(1)(,,,,,,,,,,)(,,,,,,,,,,)m m n n m n x f t x x x x y y y y y g t x x x x y y y y ----⎧=⎨=⎩Step 2 为每一阶微分式选择状态变量,最高阶除外'''(1)123'''(1)123,,,,,,,,,m m n m m m m n x x x x x x x x x y x y x y x y--++++========注意:ODEs 中所有是因变量的最高阶次之和就是需要的状态变量的个数,最高阶的微分式不需要给它状态变量.Step 3 根据选用的状态变量,写出所有状态变量的一阶微分表达式''''122334123''12123,,,,(,,,,,),,(,,,,,)m m n m m m nm n x x x x x x x f t x x x x xx xg t x x x x +++++======练习与思考:(1)求解微分方程组**'''3312*'''3312()()22x x x y x r r y y y x y r r μμμμμμ⎧+-=+--⎪⎪⎨⎪=+--⎪⎩其中2r =1r =*1,μμ=-1/82.45,μ=(0) 1.2,x =(0)0,y ='(0)0,x ='(0) 1.049355751y =-(2)求解隐式微分方程组''''''''''''2235x y x y x y x y xy y ⎧+=⎨++-=⎩ 提示:使用符号计算函数solve 求'''',x y ,然后利用求解微分方程的方法 四.偏微分方程解法Matlab 提供了两种方法解决PDE 问题,一是使用pdepe 函数,它可以求解一般的PDEs,具有较大的通用性,但只支持命令形式调用;二是使用PDE 工具箱,可以求解特殊PDE 问题,PDEtoll 有较大的局限性,比如只能求解二阶PDE 问题,并且不能解决片微分方程组,但是它提供了GUI 界面,从复杂的编程中解脱出来,同时还可以通过File —>Save As 直接生成M 代码.1.一般偏微分方程(组)的求解(1)Matlab 提供的pdepe 函数,可以直接求解一般偏微分方程(组),它的调用格式为:sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t)@pdefun 是PDE 的问题描述函数,它必须换成标准形式:(,,)[(,,,)](,,,)m m u u u uc x t x x f x t u s x t u x t x x x-∂∂∂∂∂=+∂∂∂∂∂ 这样,PDE 就可以编写入口函数:[c,f,s]=pdefun(x,t,u,du),m,x,t 对应于式中相关参数,du 是u 的一阶导数,由给定的输入变量可表示出c,f,s 这三个函数.@pdebc 是PDE 的边界条件描述函数,它必须化为形式:(,,)(,,).*(,,,)0up x t u q x t u f x t u x∂==∂ 于是边值条件可以编写函数描述为:[pa,qa,pb,qb]=pdebc(x,t,u,du),其中a 表示下边界,b 表示上边界.@pdeic 是PDE 的初值条件,必须化为形式:00(,)u x t u =,故可以使用函数描述为:u0=pdeic(x)sol 是一个三维数组,sol(:,:,i)表示i u 的解,换句话说,k u 对应x(i)和t(j)时的解为sol(i,j,k),通过sol ,我们可以使用pdeval 函数直接计算某个点的函数值.(2)实例说明 求解偏微分2111222221220.024()0.17()u u F u u t xu u F u u tx ⎧∂∂=--⎪⎪∂∂⎨∂∂⎪=+-⎪∂∂⎩ 其中, 5.7311.46()x x F x e e -=-且满足初始条件12(,0)1,(,0)0u x u x ==及边界条件1(0,)0,u t x ∂=∂221(0,)0,(1,)1,(1,)0uu t u t t x∂===∂ 解:(1)对照给出的偏微分方程和pdepe 函数求解的标准形式,原方程改写为111221220.024()1.*()10.17u u F u u x u F u u u t x x ∂⎡⎤⎢⎥--⎡⎤⎡⎤⎡⎤∂∂∂=+⎢⎥⎢⎥⎢⎥⎢⎥-∂∂∂⎣⎦⎣⎦⎣⎦⎢⎥⎢⎥∂⎣⎦可见1121220.024()10,,,()10.17u F u u x m c f s F u u u x ∂⎡⎤⎢⎥--⎡⎤⎡⎤∂====⎢⎥⎢⎥⎢⎥-∂⎣⎦⎣⎦⎢⎥⎢⎥∂⎣⎦ %目标PDE 函数function [c,f,s]=pdefun(x,t,u,du) c=[1;1];f=[0.024*du(1);0.17*du(2)]; temp=u(1)-u(2);s=[-1;1].*(exp(5.73*temp)-exp(-11.46*temp)) end(2)边界条件改写为:下边界2010.*00f u ⎡⎤⎡⎤⎡⎤+=⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦上边界1110.*000u f -⎡⎤⎡⎤⎡⎤+=⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦%边界条件函数function [pa,qa,pb,qb]=pdebc(xa,ua,xb,ub,t) pa=[0;ua(2)]; qa=[1;0]; pb=[ub(1)-1;0]; qb=[0;1]; end(3)初值条件改写为:1210u u ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦%初值条件函数 function u0=pdeic(x) u0=[1;0]; end(4)编写主调函数 clc x=0:0.05:1; t=0:0.05:2; m=0;sol=pdepe(m,@pdefun,@pdeic,@pdebc,x,t); subplot(2,1,1) surf(x,t,sol(:,:,1)) subplot(2,1,2) surf(x,t,sol(:,:,2))练习与思考: This example illustrates the straightforward formulation, computation, and plotting of the solution of a single PDE.2()u u t x xπ∂∂∂=∂∂∂ This equation holds on an interval 01x ≤≤ for times 0t ≥. The PDE satisfies the initial condition (,0)sin u x x π= and boundary conditions(0,)0;(1,)0t uu t e t xπ-∂=+=∂ 2.PDEtool 求解偏微分方程(1)PDEtool (GUI )求解偏微分方程的一般步骤在Matlab 命令窗口输入pdetool ,回车,PDE 工具箱的图形用户界面(GUI)系统就启动了.从定义一个偏微分方程问题到完成解偏微分方程的定解,整个过程大致可以分为六个阶段Step 1 “Draw 模式”绘制平面有界区域Ω,通过公式把Matlab 系统提供的实体模型:矩形、圆、椭圆和多边形,组合起来,生成需要的平面区域.Step 2 “Boundary 模式”定义边界,声明不同边界段的边界条件.Step 3 “PDE 模式”定义偏微分方程,确定方程类型和方程系数c,a,f,d ,根据具体情况,还可以在不同子区域声明不同系数.Step 4 “Mesh 模式”网格化区域Ω,可以控制自动生成网格的参数,对生成的网格进行多次细化,使网格分割更细更合理.Step 5 “Solve 模式”解偏微分方程,对于椭圆型方程可以激活并控制非线性自适应解题器来处理非线性方程;对于抛物线型方程和双曲型方程,设置初始边界条件后可以求出给定时刻t 的解;对于特征值问题,可以求出给定区间上的特征值.求解完成后,可以返回到Step 4,对网格进一步细化,进行再次求解.Step 6 “View 模式”计算结果的可视化,可以通过设置系统提供的对话框,显示所求的解的表面图、网格图、等高线图和箭头梯形图.对于抛物线型和双曲线型问题的解还可以进行动画演示.(2)实例说明用法求解一个正方形区域上的特征值问题:12|0u u u u λ∂Ω⎧-∆-=⎪⎨⎪=⎩ 正方形区域为:11,1 1.x x -≤≤-≤≤(1)使用PDE 工具箱打开GUI 求解方程(2)进入Draw 模式,绘制一个矩形,然后双击矩形,在弹出的对话框中设置Left=-1,Bottom=-1,Width=2,Height=2,确认并关闭对话框(3)进入Boundary 模式,边界条件采用Dirichlet 条件的默认值(4)进入PDE 模式,单击工具栏PDE 按钮,在弹出的对话框中方程类型选择Eigenmodes,参数设置c=1,a=-1/2,d=1,确认后关闭对话框(5)单击工具栏的 按钮,对正方形区域进行初始网格剖分,然后再对网格进一步细化剖分一次(6)点开solve菜单,单击Parameters选项,在弹出的对话框中设置特征值区域为[-20,20](7)单击Plot菜单的Parameters项,在弹出的对话框中选中Color、Height(3-D plot)和show mesh项,然后单击Done确认(8)单击工具栏的“=”按钮,开始求解。

matlab解微分方程组

matlab解微分方程组

matlab解微分方程组
MATLAB是一种强大的计算工具,能够以高效的方式处理复杂的数学问题。

由于其灵活的编程接口和拥有大量可用的函数,MATLAB可以被用于解决各种不同类型的微分方程组。

本文将介绍如何使用MATLAB 解微分方程组。

MATLAB可以利用拟牛顿发展算法,利用函数ode45来解决常微分方程组(Ordinary Differential Equations,简称ODEs)。

生成积分函数,与函数ode45耦合在一起,可以用ode45函数解ODE。

第一步,将微分方程组写成一阶形式,即:dy/dx=f(x,y),其中y为未知变量,x为变量,f(x,y) 为表达式。

第二步,使用MATLAB编程生成函数解微分方程组。

函数ode45是MATLAB中用于解ODE的函数,它使用拟牛顿发展算法,可以得到非线性ODE的数值解。

首先写出解ODE的函数,接受自变量x和因变量y 做参数,并返回相应的函数值;然后,可以调用函数ode45来解这些ODE,函数将接受积分端点、积分步长和积分函数作为参数,并返回结果。

最后,将结果可视化展示出来。

使用数据可视化函数,如plot,可以将结果以曲线的形式展示出来,方便对结果进行后续处理。

总结起来,通过使用MATLAB的ode45函数,配合编写的解ODE 函数,可以快捷高效地解决一般微分方程组问题。

通过可视化函数,还可以将解决出的结果展示出来,为数据分析提供便利。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验2 利用matlab解(非)线性、微分方程(组)-答案1、对于下列线性方程组:
(1)请用直接法求解;
(2)请用LU分解方法求解;
(3)请用QR分解方法求解;
(4)请用Cholesky分解方法求解。

(1)
>> A=[2 9 0;3 4 11;2 2 6]
A =
2 9 0
3 4 11
2 2 6
>> B=[13 6 6]'
B =
13
6
6
>> x=inv(A)*B
x =
7.4000
-0.2000
-1.4000
或:
>> X=A\B
X =
7.4000
-0.2000
-1.4000
(2)
>> [L,U]=lu(A);
>> x=U\(L\B)
x =
7.4000
-0.2000
-1.4000
(3)
>> [Q,R]=qr(A);
>> x=R\(Q\B)
x =
7.4000
-0.2000
-1.4000
(4)
>> chol(A)
??? Error using ==> chol
Matrix must be positive definite.
2、设迭代精度为10-6,分别用Jacobi 迭代法、Gauss-Serdel 迭代法求解下列线性方程组,并比较此两种迭代法的收敛速度。

Jacobi 迭代法:
>> A=[10 -1 0;-1 10 -2;0 -2 10];
>> B=[9 7 5]';
>> [x,n]=jacobi(A,B,[0,0,0]',1e-6)
x =
0.9937
0.9368
0.6874
n =
11
Gauss-Serdel 迭代法:
>> A=[10 -1 0;-1 10 -2;0 -2 10];
>> B=[9 7 5]';
>> [x,n]=gauseidel(A,B,[0,0,0]',1e-6)
x =
0.9937
0.9368
0.6874
n =
7
3、求解非线性方程010=-+x xe x 在2附近的根。

首先建立M 文件f.m
function f=f(x)
f=x+x*exp(x)-10;
然后在主窗口调用:
>> x=fzero('f',2)
x =
1.6335
或直接采取以下方法:
x=solve('x+x*exp(x)-10')
x =
1.6335
4、求下列非线性方程组在(0.5,0.5) 附近的数值解。

(1) 建立函数文件f.m 。

function q=f(p)
x=p(1);
y=p(2);
q(1)=cos(x)+y*exp(x)-2;
q(2)=sin(y)+x*exp(y)-2;
(2) 在给定的初值x0=0.5,y0=0.5下,调用fsolve 函数求方程的根。

x=fsolve('f',[0.5,0.5]',optimset('Display','off'))
x =
0.8087
0.5833
或采取以下方法:
>> [x,y]=solve('cos(x)+y*exp(x)-2','sin(y)+x*exp(y)-2')
x =
.
y =
.668096
5、通过画图方法描述某非刚性体的运动方程的微分方程⎪⎩⎪⎨⎧=-==2
1331232151.0y y y y y y
y y y ,其初始条件为⎪⎩⎪⎨⎧===1)0(1)0(0)0(3
21y y y 。

建立ff.m 函数
function dy=ff(t,y)
dy=[y(2)*y(3);-y(1)*y(3);0.51*y(1)*y(2)];
建立调用函数
y0=[0 1 1];
[t,y]=ode45('ff',[0,15],y0)
plot(t,y(:,1),'r-o',t,y(:,2),'b-*',t,y(:,3),'g-v')
legend('y1','y2','y3')
运行结果:
6、求二阶微分方程)2sin(3t y e y t y t =-'+'', 1)0(=y ,1)0(-='y 在20≤≤t 时的数值图解。

令x 1=y , x 2=y'时有
x 1'=x 2,x 2'=3sin(t)-tx 2+e t x 1
建立ff.m 函数
function dx=ff(t,x)
dx=[x(2);3*sin(2*t)-t*x(2)+exp(t)*x(1)];
建立调用函数
x0=[1 -1];
[t,x]=ode45('ff',[0,2],x0)
plot(t,x(:,1),'r-o',t,x(:,2),'b-.*')
legend('x1','x2')。

相关文档
最新文档