利用matlab编写S函数求解微分方程
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 到ft 用初始条件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()xx 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)编写主调函数 clcx=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 u u 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 dsolve 微分方程组
在MATLAB中,可以使用`dsolve`函数来求解微分方程组。
`dsolve`函数可以求解常微分方程(Ordinary Differential Equations,ODE)和偏微分方程(Partial Differential Equations,PDE)。
下面是一个示例,演示如何使用`dsolve`函数来求解一个简单的微分方程组:
```matlab
syms t x(t) y(t)
eq1 = @(t,x) x(t)/x(t-1) - 2; 第一个方程
eq2 = @(t,x) x(t-1)/x(t) - 3; 第二个方程
sol = dsolve({eq1, eq2}, x(t), t); 求解微分方程组
disp(sol); 显示解
```
在这个示例中,我们定义了两个方程`eq1`和`eq2`,然后使用`dsolve`函数来求解这两个方程组成的微分方程组。
注意,我们需要将方程以函数的形式传递给`dsolve`函数。
在`dsolve`函数中,第一个参数是一个包含所有方程的向量,第二个参数是要求解的未知函数。
`dsolve`函数将返回一个包含所有解的表达式。
在本例中,我们将解存储在`sol`变量中,并使用`disp`函数显示解。
请注意,在使用`dsolve`函数时,需要确保输入的方程是正确的,并且与所求解的问题相对应。
此外,还需要注意符号和函数的定义和使用方式。
(整理)利用matlab编写S函数求解微分方程.
%
% FLAG RESULT DESCRIPTION
% ----- ------ --------------------------------------------
% 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS,
%
%
% The state vectors, X and X0 consists of continuous states followed
% by discrete states.
%
% Optional parameters, P1,...,Pn can be provided to the S-function and
二、
求解解微分方程
y’=y-2ห้องสมุดไป่ตู้/y
y(0)=1
要求利用matlab编写S函数求解
三、
【步骤1】获取状态空间表达式。
在matlab中输入
dsolve(‘Dy=y-2*x/y’,’y(0)=1’,’x’)
得到
y=(2*x+1).^(1/2);
【步骤2】建立s函数的m文件。
利用21·用S函数模板文件。
以下是修改之后的模板文件sfuntmpl.m的内容。
% 3 Y Return outputs in SYS.
% 4 TNEXT Return next time hit for variable step sample
% time in SYS.
% 5 Reserved for future (root finding).
% 9 [] Termination, perform any cleanup SYS=[].
matlab(Simulink)中S-function函数编写规则
matlab(Simulink)中S-function函数编写规则s函数是system Function的简称,用它来写自己的simulink模块。
(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。
在matlab的workspace里打edit sf untmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。
它的第一行是这样的:f unction[sys,x0,str,ts]=sf untmpl(t,x,u,f lag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),f lag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据f lag的不同而不同(下面将结合f l ag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sf untmpl.m中的代码来讲具体的结构:switch f lag, %判断f lag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;f l ag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sf untmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0;%模块连续状态变量的个数sizes.NumDiscStates = 0;%模块离散状态变量的个数sizes.NumOutputs = 0;%模块输出变量的个数sizes.NumInputs = 0;%模块输入变量的个数sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能%直接控制输出)sizes.NumSample Times = 1;%模块的采样时间个数,至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=f c(t,x,u)也可以用连续状态方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u)也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u)也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为:(一般连续状态与离散状态不会一块用,我这儿是为了方便说明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不变。
用Matlab求解微分方程
解微分⽅程有两种解,⼀种是解析解,⼀种是数值解,这两种分别对应不同的解法利⽤dsolve 函数进⾏求解syms x;s = dsolve('eq1,eq2,...', ’cond1,cond2,...', 'v');%eq :微分⽅程%cond :条件%v :独⽴变量%形如:⽅程:y'= f(t,y),初值:y(t0) = y0dsolve('Du = 1+ u^2','t')ans =tan(C2 + t)1i-1i求的解析解s = dsolve('D2y=3*y+2*x','x');% D2y ⽤以表⽰y 的⼆阶导数,默认是以t 为⾃变量的,所以最好指明⾃变量为x.syms y(x);s = dsolve([diff(y,x,2) == 3*y+2*x], [y(0) == 5])% diff 内依次是函数、⾃变量、微分阶数,⽅程⽤==表⽰相等⽽不是赋值求初值问题s = dsolve('Dy = y - 2*t / y','y(0) =1');求边界问题s = dsolve('x*D2y - 3*Dy =x^2','y(1)=0','y(5) = 0','x');求解⽅程s=dsolve('D2y =cos(2*x) - y','y(0) =1','Dy(0) = 0','x');simplify(s);(eqn,cond,‘IgnoreAnalyticConstraints’,false) %设置不化简结果求解⽅程组[f,g]= dsolve('Df = f + g','Dg = -f + g','f(0)=1','g(0) = 2','x');⽤Matlab 求解微分⽅程⽤Matlab 求解微分⽅程解析解1.求解析解2.初值问题3.边界问题4.⾼阶⽅程5.⽅程组问题⼀些例⼦dsolve('D2y+4*Dy+29*y = 0','y(0) = 0','Dy(0)= 15 ','x')ans =3*sin(5*x)*exp(-2*x)[x y z] = dsolve('Dx = 2*x-3*y+3*z','Dy = 4*x-5*y+3*z','Dz = 4*x-4*y+2*z')x =C7*exp(2*t) + C8*exp(-t)y =C7*exp(2*t) + C8*exp(-t) + C9*exp(-2*t)z =C7*exp(2*t) + C9*exp(-2*t)%可以对其进⾏简化操作x = simplify(x)x = C7*exp(2*t) + C8*exp(-t)y = simplify(y)y =exp(-2*t)*(C9 + C8*exp(t) + C7*exp(4*t))%龙格库塔法(Runge-Kutta 法)xfun=@(t,x)0.3.*x.*(1-x/8); %定义赋值函数r=0.3,k=8[tout,xout]=ode45(fun,[0,40],0.1) %⽅程数值解,四五阶RK 法[tout,xout]=ode23(xfun,[t0,tfinal],x0) %⼆三阶RK 法%%ode 系列数值求解形如 / = ( , )的微分⽅程组, 并绘图。
实验二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))。
matlab求解微分方程解析解
matlab求解微分方程解析解在数学和工程学科中,微分方程是一种重要的数学工具,它涉及到很多实际问题的模型和解决方法。
而Matlab作为一款强大的数学软件,可以方便地求解微分方程的解析解。
Matlab中求解微分方程的一种常见方法是使用符号计算工具箱(Symbolic Math Toolbox),它可以处理符号表达式和符号函数,包括微积分、代数、矩阵、符号等数学操作。
首先,我们需要定义微分方程的符号变量和初值条件。
例如,我们假设要求解的微分方程为dy/dx = x^2,初值条件为y(0)=1,则可以使用如下代码:syms x yode = diff(y,x) == x^2;cond = y(0) == 1;然后,我们可以将微分方程和初值条件作为参数传递给dsolve函数来求解微分方程的解析解。
例如:sol = dsolve(ode, cond);其中,sol为求解得到的符号表达式,可以使用vpa函数将其转换为数值解。
例如:sol_num = vpa(sol, 5);这样,我们就得到了微分方程的解析解,并将其转换为5位有效数字的数值解。
除了使用符号计算工具箱,Matlab还提供了许多数值方法来求解微分方程的数值解。
例如,可以使用ode45函数来求解微分方程的数值解。
例如,求解dy/dx = x^2,y(0)=1的数值解可以使用如下代码:fun = @(x,y) x^2;[t,y] = ode45(fun, [0,1], 1);其中,fun为微分方程的函数句柄,[0,1]为求解区间,1为初值条件。
t和y分别为求解得到的时间序列和解向量。
总之,Matlab提供了多种方法来求解微分方程的解析解和数值解,可以根据实际问题的需要选择不同的方法来求解。
利用matlab编写S函数求解微分方程
自动化专业综合设计报告设计题目:利用matlab编写S函数求解微分方程所在实验室:自动化系统仿真实验室指导教师:郭卫平学生姓名律迪迪班级文自0921 学号200990519114成绩评定:一、设计目的了解使用simulink的扩展工具——S-函数,s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的,它的魅力在于完美结合了simulink框图简洁明快的特点和编程灵活方便的优点,提供了增强和扩展sinulink能力的强大机制,同时也是使用RTW实现实时仿真的关键。
二、设计要求求解解微分方程y’=y-2x/yy(0)=1要求利用matlab编写S函数求解三、设计内容(可加附页)【步骤1】获取状态空间表达式。
在matlab中输入dsolve(‘Dy=y-2*x/y’,’y(0)=1’,’x’)得到y=(2*x+1).^(1/2);【步骤2】建立s函数的m文件。
利用21·用S函数模板文件。
以下是修改之后的模板文件sfuntmpl.m的内容。
function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)%SFUNTMPL General M-file S-function template% With M-file S-functions, you can define you own ordinary differential% equations (ODEs), discrete system equations, and/or just about% any type of algorithm to be used within a Simulink block diagram.%% The general form of an M-File S-function syntax is:% [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn)%% What is returned by SFUNC at a given point in time, T, depends on the% value of the FLAG, the current state vector, X, and the current% input vector, U.%% FLAG RESULT DESCRIPTION% ----- ------ --------------------------------------------% 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS,% initial state in X0, state ordering strings% in STR, and sample times in TS.% 1 DX Return continuous state derivatives in SYS. % 2 DS Update discrete states SYS = X(n+1)% 3 Y Return outputs in SYS.% 4 TNEXT Return next time hit for variable step sample % time in SYS.% 5 Reserved for future (root finding).% 9 [] Termination, perform any cleanup SYS=[].%%% The state vectors, X and X0 consists of continuous states followed% by discrete states.%% Optional parameters, P1,...,Pn can be provided to the S-function and% used during any FLAG operation.%% When SFUNC is called with FLAG = 0, the following information% should be returned:%% SYS(1) = Number of continuous states.% SYS(2) = Number of discrete states.% SYS(3) = Number of outputs.% SYS(4) = Number of inputs.% Any of the first four elements in SYS can be specified% as -1 indicating that they are dynamically sized. The% actual length for all other flags will be equal to the% length of the input, U.% SYS(5) = Reserved for root finding. Must be zero.% SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function% has direct feedthrough if U is used during the FLAG=3% call. Setting this to 0 is akin to making a promise that% U will not be used during FLAG=3. If you break the promise % then unpredictable results will occur.% SYS(7) = Number of sample times. This is the number of rows in TS.%%% X0 = Initial state conditions or [] if no states.%% STR = State ordering strings which is generally specified as [].%% TS = An m-by-2 matrix containing the sample time% (period, offset) information. Where m = number of sample% times. The ordering of the sample times must be:%% TS = [0 0, : Continuous sample time.% 0 1, : Continuous, but fixed in minor step% sample time.% PERIOD OFFSET, : Discrete sample time where% PERIOD > 0 & OFFSET < PERIOD. % -2 0]; : Variable step discrete sample time% where FLAG=4 is used to get time of % next hit.%% There can be more than one sample time providing% they are ordered such that they are monotonically% increasing. Only the needed sample times should be% specified in TS. When specifying than one% sample time, you must check for sample hits explicitly by% seeing if% abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD) % is within a specified tolerance, generally 1e-8. This% tolerance is dependent upon your model's sampling times% and simulation time.%% You can also specify that the sample time of the S-function% is inherited from the driving block. For functions which% change during minor steps, this is done by% specifying SYS(7) = 1 and TS = [-1 0]. For functions which% are held during minor steps, this is done by specifying% SYS(7) = 1 and TS = [-1 1].% Copyright 1990-2002 The MathWorks, Inc.% $Revision: 1.18 $%% The following outlines the general structure of an S-function.%switch flag,%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%case 0,[sys,x0,str,ts]=mdlInitializeSizes;%%%%%%%%%%%%%%%% Derivatives %%%%%%%%%%%%%%%%case 1,sys=mdlDerivatives(t,x,u);%%%%%%%%%%% Update %%%%%%%%%%%case {2,3,9},sys=[];%%%%%%%%%%%% Outputs %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GetTimeOfNextVarHit %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Terminate %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Unexpected flags %%%%%%%%%%%%%%%%%%%%%otherwiseerror(['Unhandled flag = ',num2str(flag)]);end% end sfuntmpl%%==================================================================== =========% mdlInitializeSizes% Return the sizes, initial conditions, and sample times for the S-function.%==================================================================== =========%function [sys,x0,str,ts]=mdlInitializeSizes%% call simsizes for a sizes structure, fill it in and convert it to a% sizes array.%% Note that in this example, the values are hard coded. This is not a% recommended practice as the characteristics of the block are typically% defined by the S-function parameters.%sizes = simsizes;sizes.NumContStates = 1;sizes.NumDiscStates = 0;sizes.NumOutputs = 0;sizes.NumInputs = 0;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; % at least one sample time is neededsys = simsizes(sizes);%% initialize the initial conditions%x0 = [0 1.0000];%% str is always an empty matrix%str = [];%% initialize the array of sample times%ts = [0 0];% end mdlInitializeSizes%%==================================================================== =========% mdlDerivatives% Return the derivatives for the continuous states.%==================================================================== =========%function sys=mdlDerivatives(t,x,u)sys(1)=(u-2*x/u)*t+u;【步骤3】利用matlab调用函数得到结果。
matlab中s-function的编写【范本模板】
s函数是system Function的简称,用它来写自己的simulink模块.(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:1.初始化:这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;2.运行阶段:这个阶段里要进行计算输出、更新离散状态、计算连续状态等等。
这个阶段需要反复运行,直至结束.在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。
它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量.下面结合sfuntmpl。
m中的代码来讲具体的结构:switch flag,%判断flag,看当前处于哪个状态case 0, [sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下:size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes。
matlab求解微分方程
matlab求解微分方程Matlab作为一款多功能的计算机科学软件,具有强大的功能,能够有效地解决复杂数学问题。
其中,Matlab特别擅长求解微分方程。
微分方程是一类重要的数学方程,能够解释物体随时间变化的现象,广泛应用于科学领域,如力学、热力学等领域。
下面,将介绍如何使用Matlab来求解微分方程。
对于微分方程,Matlab提供了一系列的函数来支持求解。
常用的函数包括ODE45、ODE23、ODE113,用于解决传递微分方程,以及dsolve用于解决非传递微分方程。
首先,对于传递微分方程,我们可以使用ODE45、ODE23或ODE113函数求解。
其中,ODE45函数是Matlab中一种常用的函数,它可以求解线性和非线性微分方程,而ODE23和ODE113则只能求解线性方程。
要使用这些函数,首先需要准备解决微分方程的参数,包括:要求解的函数、初始条件和积分区间等,可以使用如下Matlab代码实现:%求解的函数f = @(t,y) y+t^2-1;%始条件t0 = 0;y0 = 1;%分区间tspan = [t0,2];%用函数求解[t,y] = ode45(f,tspan,y0);接着,我们就可以调用ODE45、ODE23或ODE113函数求解传递微分方程,代码如下:%用函数求解[t,y] = ode45(f,tspan,y0);%于求解非线性方程[t,y] = ode23(f,tspan,y0);%于求解精确的线性方程[t,y] = ode113(f,tspan,y0);另外,Matlab也提供了一个dsolve函数,用于求解非传递微分方程。
它可以解决一元微分方程、偏微分方程以及系统微分方程等问题。
要使用dsolve函数,可以这样写:%求解的函数f =D2y+4*Dy+3*y = 0’;%解方程y = dsolve(f);以上,就是Matlab中求解微分方程的基本步骤。
可以看到,Matlab提供了一系列函数来支持求解微分方程,让我们不再受到繁琐的数学推导的束缚,使用起来方便快捷。
用MATLAB函数编写并求解微分方程
机方针本质上解释微分方程的数值求解问题。
二、实验步骤
1. 建立数学模型,利用电路的拓扑元件的属性,列出网孔方程或节点方程,并简化为
标准形式的计算机可求解的一组微分方程组的过程。
2. 选择适合的计算机求解方法求解仿真模型。
3. 编写 MATLAB 仿真程序式建立 Simulink 模块方块图,调试并运行程序。
1.8 1.6 1.4 1.2
1 0.8 0.6 0.4 0.2
0 -0.2
-2
uC(t)
0
2
4
6
time sec
8
10
0.3 0.25
0.2 0.150.Fra bibliotek 0.050 -0.05
-0.1 -0.15
-0.2 -2
iL(t)
0
2
4
6
time sec
1.求解程序:零状态响应 %filename ex123.m L=1;c=0.1;for R=[1.5 3 5] [t,x]=ode 45(‘funcforex123’,[-1,10],[0;0],[],R,L,C); Figure(1);plot(t,x(:,1));hold onl xlibel(‘time sec’); Text(0.9,0.17,’\leftarrow i_L(t)’);grid; Figure(2);plot(t,x(:,2));hold on; xlabel(‘time sec’); Text(0.5,0.3,’\leftarrow u_C(t)’);grid;
用matlab函数编写并求解微分方程一实验原理为了对连续系统进行方针首先需要建立其数学模型然后利用计算机求这些数学模型从而得出数学模型的数值解
MATLAB方法实现信号波形和微分方程的建立与求解实验报告
MATLAB方法实现信号波形和微分方程的建立与求解实验报告实验目的:1.熟悉MATLAB软件的基本使用方法;2.掌握信号波形的绘制;3.掌握微分方程的建立与求解。
实验仪器:-计算机-MATLAB软件实验原理:1.信号波形的绘制信号波形是指随时间变化的量的图示。
可以使用MATLAB软件实现信号波形的绘制。
MATLAB软件提供了丰富的绘图函数,如plot函数、stem 函数等,可以根据需要选择合适的函数进行波形绘制。
2.微分方程的建立与求解微分方程是描述自然现象中变化的数学模型。
可以通过MATLAB软件进行微分方程的建立与求解。
MATLAB提供了ode45函数等函数用于求解常微分方程。
实验步骤:1.信号波形的绘制首先,打开MATLAB软件,并创建一个新的脚本文件。
然后,在脚本文件中使用plot函数绘制一个正弦信号的波形。
代码示例如下:```t=0:0.1:10;%时间范围为0到10,步长为0.1y = sin(t); % 正弦信号plot(t, y); % 绘制波形图```保存脚本文件,点击“运行”按钮即可显示出正弦信号的波形图。
2.微分方程的建立与求解在同一个脚本文件中,可以进行微分方程的建立与求解。
首先,使用syms命令定义微分方程中的未知函数和其导数。
然后,使用dsolve命令求解微分方程。
最后,通过plot函数绘制微分方程的解的波形。
代码示例如下:```syms y(t)ode = diff(y, t) == y; % 定义微分方程ySol(t) = dsolve(ode); % 求解微分方程t=0:0.1:10;%时间范围为0到10,步长为0.1y = ySol(t); % 微分方程的解plot(t, y); % 绘制波形图```保存脚本文件,点击“运行”按钮即可显示出微分方程的解的波形图。
实验结果:根据实验步骤,在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求解微分方程(组)
5
10
15
20
25
t/d
其 他 组 织 内 有 机 碘 浓 度 C3(t)
5
10
15
20
25
t/d
30
30
30
14
Examples
E.g.4 求解方程y''+1000(y2-1)y'+y=0。已知初值y(0)=2,y'=0,自变量0<t<3000。 该方程为刚性方程,在使用Simulink模块求解时通过设置Configuration中solver 选项为ode15s来求解方程,并设置仿真时间为0到3000。
果有初始条件,则求出特解。 用字符串表示常微分方程,自变量缺省时为t,导数用
D表示微分。y的2阶导数用D2y表示,依此类推。
8
如何调用?
[T,Y,TE,YE,IE]=solver('odefun',tspan,y0,options)
其中solver为ode23、ode45、ode113、ode15s、ode23s、
Topic: 如何使用MATLAB求 解常微分方程(组)
TMU_BME_2013
1
a.What ?
微分方程指描述未知函数的导数与自变 量之间的关系的方程。未知函数是一元函 数的微分方程称作常微分方程。未知函数 是多元函数的微分方程称作偏微分方程。
MATLAB(matrix&laboratory)意为矩 阵工厂(矩阵实验室).MATLAB是美国 MathWorks公司出品的商业数学软件,提 供高级技术计算语言和交互式环境,主要 包括MATLAB和Simulink两大部分。
利用Matlab求解微分方程
利⽤Matlab求解微分⽅程实验三利⽤Matlab 进⾏计算机模拟及求解微分⽅程班级:姓名:学号:实验⽬的:1、掌握利⽤Matlab 求解微分⽅程的解析解; 2、掌握利⽤Matlab 求解微分⽅程的数值解;3、利⽤Matlab 进⾏计算机模拟法的实现。
实验内容及要求:1、求如下微分⽅程的解:212(0)2y y y ?-'==?;>> y=dsolve('Dy=(y*y-1)/2','y(0)=2','x') y =-tanh(x/2 - atanh(2))2、求⽅程230y y y'''+-=的通解;>> y=dsolve('D2y+2*Dy-3*y=0','x') y =C10*exp(x) + C11*exp(-3*x)3、⽤ode15s 求下列⽅程组在[0,1.2]的解,并绘出精确解和数值解的图形。
22sin 998999999(cos sin )(0)2(0)3dy y z x dxdz y z x x dxy z ?=-++??=-+-=?=精确解:[y,z]=dsolve('Dy=-2*y+z+2*sin(x),Dz=998*y-999*z+999*(cos(x)-sin(x))','y(0)=2,z(0)=3','x') y=2*exp(-x)+sin(x) z=2*exp(-x)+cos(x)x=linspace(0,1.2,30); y=2*exp(-x)+sin(x); z=2*exp(-x)+cos(x); figure(1)plot(x,y,'r',x,z,'k')数值解:function dy=vdp1000(x,y) dy=zeros(2,1);dy(1)=(-2)*y(1)+y(2)+2*sin(x);dy(2)=998*y(1)-999*y(2)+999*(cos(x)-sin(x));option=odeset('reltol',0.1,'abstol',0.001);[X,Y]=ode15s('vdp1000',[0,1.2],[2,3],option) plot(X,Y(:,1),'-',X,Y(:,2),'k')精确解图:数值解图:>> y=dsolve('DH=(-k)*H+k*20','H(0)=37','t')>> k=solve('y=17*exp(-k*t) + 20','k')>> y=35;t=2;k=eval(k)>> t=solve('y=17*exp(-k*t) + 20','t')>> y=30;t=eval(t)>> T=16-t5教材第94页库存问题中的数据取成尽量与实际情况相符的数据,相关参变量的赋值每个同学都按⾃⼰的想法来取,尽量不要出现完全相同的情况。
matlab求解常微分方程的准确解
matlab求解常微分方程的准确解使用Matlab求解常微分方程的准确解一、引言常微分方程是研究自然界现象和工程实际问题中常见的数学工具之一。
求解常微分方程的准确解对于理解问题的本质和性质具有重要意义。
本文将介绍如何使用Matlab来求解常微分方程的准确解,并通过具体的例子进行演示。
二、常微分方程的基本概念常微分方程是指包含未知函数及其导数的方程。
一般形式为:dy/dx = f(x,y)其中,y是未知函数,x是自变量,f(x,y)是已知函数。
常微分方程的解是指能够满足方程的函数y(x)。
三、Matlab的符号计算工具箱Matlab提供了符号计算工具箱,可以对方程进行符号计算。
通过符号计算工具箱,我们可以求解常微分方程的准确解。
四、使用Matlab求解常微分方程的步骤1. 定义未知函数和自变量。
在Matlab中,可以使用符号变量来定义未知函数和自变量。
2. 定义常微分方程。
使用符号变量来定义常微分方程。
3. 求解常微分方程。
使用dsolve函数来求解常微分方程的准确解。
4. 绘制准确解的图像。
使用ezplot函数来绘制准确解的图像。
五、具体例子假设我们要求解一阶线性常微分方程:dy/dx + y = x其中,y是未知函数,x是自变量。
1. 定义未知函数和自变量。
在Matlab中,可以使用符号变量来定义未知函数和自变量。
syms y(x)2. 定义常微分方程。
使用符号变量来定义常微分方程。
eqn = diff(y,x) + y == x3. 求解常微分方程。
使用dsolve函数来求解常微分方程的准确解。
sol = dsolve(eqn)4. 绘制准确解的图像。
使用ezplot函数来绘制准确解的图像。
ezplot(sol)六、总结本文介绍了如何使用Matlab求解常微分方程的准确解。
通过符号计算工具箱,我们可以方便地求解常微分方程,并得到准确解的图像。
使用Matlab求解常微分方程的准确解可以帮助我们更好地理解问题的本质和性质,并为进一步的分析和应用提供基础。
实验七用matlab求解常微分方程(最新整理)
实验七 用matlab 求解常微分方程一、实验目的:1、熟悉常微分方程的求解方法,了解状态方程的概念;2、能熟练使用dsolve 函数求常微分方程(组)的解析解;3、能熟练应用ode45\ode15s 函数分别求常微分方程的非刚性、刚性的数值解;4、掌握绘制相图的方法二、预备知识:1.微分方程的概念未知的函数以及它的某些阶的导数连同自变量都由一已知方程联系在一起的方程称为微分方程。
如果未知函数是一元函数,称为常微分方程。
常微分方程的一般形式为),,",',,()(=n y y y y t F 如果未知函数是多元函数,成为偏微分方程。
联系一些未知函数的一组微分方程组称为微分方程组。
微分方程中出现的未知函数的导数的最高阶解数称为微分方程的阶。
若方程中未知函数及其各阶导数都是一次的,称为线性常微分方程,一般表示为)()(')()(1)1(1)(t b y t a y t a y t a y n n n n =++++-- 若上式中的系数ni t a i ,,2,1),( =均与t 无关,称之为常系数。
2.常微分方程的解析解有些微分方程可直接通过积分求解.例如,一解常系数常微分方程1+=y dt dy可化为dt y dy=+1,两边积分可得通解为1-=tce y .其中c 为任意常数.有些常微分方程可用一些技巧,如分离变量法,积分因子法,常数变异法,降阶法等可化为可积分的方程而求得解析解.线性常微分方程的解满足叠加原理,从而他们的求解可归结为求一个特解和相应齐次微分方程的通解.一阶变系数线性微分方程总可用这一思路求得显式解。
高阶线性常系数微分方程可用特征根法求得相应齐次微分方程的基本解,再用常数变异法求特解。
一阶常微分方程与高阶微分方程可以互化,已给一个n 阶方程),,",',()1()(-=n n y y y t f y 设)1(21,,',-===n n y y y y y y ,可将上式化为一阶方程组⎪⎪⎪⎩⎪⎪⎪⎨⎧====-),,,,(''''2113221n n nn y y y t f y yy y y y y反过来,在许多情况下,一阶微分方程组也可化为高阶方程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用matlab编写S函数求解微分方程自动化专业综合设计报告设计题目:利用matlab编写S函数求解微分方程所在实验室:自动化系统仿真实验室指导教师:郭卫平学生姓名律迪迪班级文自0921 学号200990519114成绩评定:一、设计目的了解使用simulink的扩展工具——S-函数,s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的,它的魅力在于完美结合了simulink框图简洁明快的特点和编程灵活方便的优点,提供了增强和扩展sinulink能力的强大机制,同时也是使用RTW实现实时仿真的关键。
二、设计要求求解解微分方程y’=y-2x/yy(0)=1要求利用matlab编写S函数求解三、设计内容(可加附页)【步骤1】获取状态空间表达式。
在matlab中输入dsolve(‘Dy=y-2*x/y’,’y(0)=1’,’x’)得到y=(2*x+1).^(1/2);【步骤2】建立s函数的m文件。
利用21·用S函数模板文件。
以下是修改之后的模板文件sfuntmpl.m的内容。
function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)%SFUNTMPL General M-file S-function template% With M-file S-functions, you can define you own ordinary differential% equations (ODEs), discrete system equations, and/or just about% any type of algorithm to be used within a Simulink block diagram.%% The general form of an M-File S-function syntax is:% [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn)%% What is returned by SFUNC at a given point in time, T, depends on the% value of the FLAG, the current state vector, X, and the current% input vector, U.%% FLAG RESULT DESCRIPTION% ----- ------ --------------------------------------------% 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS,% initial state in X0, state ordering strings% in STR, and sample times in TS.% 1 DX Returncontinuous state derivatives in SYS.% 2 DS Update discrete states SYS = X(n+1)% 3 Y Return outputs in SYS.% 4 TNEXT Return next time hit for variable step sample% time in SYS.% 5 Reserved for future (root finding).% 9 [] Termination, perform any cleanup SYS=[].%%% The state vectors, X and X0 consists of continuous states followed% by discrete states.%% Optional parameters, P1,...,Pn can be provided to the S-function and% used during any FLAG operation.%% When SFUNC is called with FLAG = 0, the following information% should be returned:%% SYS(1) = Number of continuous states. % SYS(2) = Number of discrete states.% SYS(3) = Number of outputs.% SYS(4) = Number of inputs.% Any of the first four elements in SYS can be specified% as -1 indicating that they are dynamically sized. The% actual length for all other flags will be equal to the% length of the input, U.% SYS(5) = Reserved for root finding. Must be zero.% SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function% has direct feedthrough if U is used during the FLAG=3% call. Setting this to 0 is akin to making a promise that% U will not be used during FLAG=3. If you break the promise% then unpredictable results will occur.% SYS(7) = Number of sample times. This is the number of rows in TS.%%% X0 = Initial state conditions or [] if no states.%% STR = State ordering strings which is generally specified as [].%% TS = An m-by-2 matrix containing the sample time% (period, offset) information. Where m = number of sample% times. The ordering of the sample times must be:%% TS = [0 0, : Continuous sample time.% 0 1, : Continuous, but fixed in minor step%sample time.% PERIOD OFFSET, : Discrete sample time where%PERIOD > 0 & OFFSET < PERIOD.% -2 0]; : Variable step discrete sample time%where FLAG=4 is used to get time of%next hit.%% There can be more than one sample time providing% they are ordered such that they are monotonically% increasing. Only the needed sample times should be% specified in TS. When specifying than one% sample time, you must check for sample hits explicitly by% seeing if%abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)% is within a specified tolerance, generally 1e-8. This% tolerance is dependent upon your model's sampling times% and simulation time.%% You can also specify that the sample time of the S-function% is inherited from the driving block. For functions which% change during minor steps, this is done by% specifying SYS(7) = 1 and TS = [-1 0]. For functions which% are held during minor steps, this is done by specifying% SYS(7) = 1 and TS = [-1 1].% Copyright 1990-2002 The MathWorks, Inc.% $Revision: 1.18 $%% The following outlines the general structure of an S-function.%switch flag,%%%%%%%%%%%%%%%%%%% Initialization % %%%%%%%%%%%%%%%%%% case 0,[sys,x0,str,ts]=mdlInitializeSizes;%%%%%%%%%%%%%%%% Derivatives % %%%%%%%%%%%%%%%case 1,sys=mdlDerivatives(t,x,u);%%%%%%%%%%% Update %%%%%%%%%%%case {2,3,9},sys=[];%%%%%%%%%%%% Outputs %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% GetTimeOfNextVarHit % %%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%% Terminate % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Unexpected flags % %%%%%%%%%%%%%%%%%%% %otherwiseerror(['Unhandled flag = ',num2str(flag)]); end% end sfuntmpl%%================================== ==================================== =======% mdlInitializeSizes% Return the sizes, initial conditions, and sample times for the S-function.%================================== ==================================== =======%function [sys,x0,str,ts]=mdlInitializeSizes%% call simsizes for a sizes structure, fill it in and convert it to a% sizes array.%% Note that in this example, the values are hard coded. This is not a% recommended practice as the characteristics of the block are typically% defined by the S-function parameters.%sizes = simsizes;sizes.NumContStates = 1;sizes.NumDiscStates = 0;sizes.NumOutputs = 0;sizes.NumInputs = 0;sizes.DirFeedthrough = 1;sizes.NumSampleTimes = 1; % at least one sample time is neededsys = simsizes(sizes);%% initialize the initial conditions%x0 = [0 1.0000];%% str is always an empty matrix%str = [];%% initialize the array of sample times%ts = [0 0];% end mdlInitializeSizes%%================================== ==================================== =======% mdlDerivatives% Return the derivatives for the continuous states.%================================== ==================================== =======%function sys=mdlDerivatives(t,x,u)sys(1)=(u-2*x/u)*t+u;【步骤3】利用matlab调用函数得到结果。