利用matlab编写S函数求解微分方程

合集下载

matlab function求解微分方程

matlab function求解微分方程

Matlab Function求解微分方程引言微分方程是描述自然和社会现象中的变化规律的数学工具,它在许多领域中都具有重要的应用价值。

在数值计算中,利用计算机求解微分方程成为一种常用的方法。

Matlab是一款强大的科学计算软件,它提供了丰富的函数库和工具箱,可以方便地求解各种类型的微分方程。

本文将介绍如何使用Matlab Function来求解微分方程,并通过实例说明其具体应用。

Matlab Function概述Matlab Function是Matlab中用于定义函数的关键字。

函数是一段完成特定任务的代码,可以接受输入参数并返回输出结果。

在求解微分方程中,可以通过定义一个函数来描述微分方程的数学形式,并使用Matlab内置的数值求解器来求解该微分方程。

通过封装微分方程的求解过程为一个函数,可以提高代码的复用性和可读性。

求解一阶微分方程定义微分方程函数首先需要定义微分方程的函数形式。

以一阶常微分方程dy/dx=f(x, y)为例,其中f(x, y)为已知函数。

在Matlab中,可以通过以下方式定义函数:function dy = f(x, y)dy = % 根据微分方程形式计算dy/dx的表达式end在函数中,输入参数 x 和 y 表示自变量和因变量,输出参数 dy 表示微分方程的导数值。

实际使用时,需要根据具体问题自行定义 f(x, y) 的表达式。

求解微分方程定义好微分方程函数后,可以使用Matlab内置的数值求解器来求解微分方程。

以求解某一点上的导数为例,可以使用以下代码:y0 = % 指定求解点的因变量值dydx = f(x0, y0); % 调用微分方程函数求解导数值通过以上代码,可以获得求解点上的导数值。

需要注意的是,求解点的自变量值和因变量值需要根据具体问题进行设定。

求解二阶微分方程转化为一阶微分方程组对于二阶常微分方程d2y/dx2=f(x, y, dy/dx),可以通过引入新的变量z=dy/dx,将其转化为一阶微分方程组。

matlab应用无穷级数微分方程求解方程

matlab应用无穷级数微分方程求解方程

[例7-1]求∑-==11n k knS ,∑==1012k kn S 。

【求解】编写myssum01.m 文件,内容如下: clear clcsyms n ks1=simple(symsum(n/k))%级数求和后化简 s2=simple(symsum(n/k,k,1,10)) %前1-10项求和后化简保存后,执行myssum01命令。

查看结果如下命令窗口显示的结果为: s1 =1/2*n*(n-1)/k s2 =7381/2520*n 结果:n S k k n S 25207381,2)1(21=-=[例7-2]对-p 级数∑∞=11n p n,求(1)和S ;(2)求部分和n S ;(3)作图并观察部分和序列的变化趋势。

【求解】建立-p 级数的和与部分和及其绘图文件。

编写p_sum.m 文件,内容如下: clearclcp=input('p='); syms ks=symsum(1/k^p,1,inf) %级数求和sn=[];%定义空向量for n=20:10:200s1=eval(symsum(1/k^p,1,n)); %级数求和,并求值 sn=[sn,s1];%写和值到空向量中endn=20:10:200;plot(n,sn,'m*') %作图if s~=infhold onn1=20:0.2:200; s=eval(s);plot(n1,s,'r-')hold off endlegend('部分和sn','和s',0)%图例xlabel('n') %坐标轴ylabel('sn')title('p-级数部分和散点图') %标题保存后,在命令窗口下调用该文件。

>>p_sump=1s =inf图7-1 p=1时级数散点图>>p_sump=2s =1/6*pi^2图7-2 p=2时级数散点图>>p_sump=3s =zeta(3)>> ss =1.2021图7-3 p=3时级数散点图结果分析:p=1时,调和级数∑∞=11n n发散,2≥p时p级数∑∞=11npn收敛,观察图形得知p越大,收敛速度越快。

matlab中s-function的编写

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求解微分方程及微分方程组
解 输入命令: 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编写S函数求解微分方程.

(整理)利用matlab编写S函数求解微分方程.
% input vector, U.
%
% 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求解微分方程

matlab求解微分方程

Matlab求解微分方程教学目的:学会用MATLAB求简单微分方程的解析解、数值解,加深对微分方程概念和应用的理解;针对一些具体的问题,如追击问题,掌握利用软件求解微分方程的过程;了解微分方程模型解决问题思维方法及技巧;体会微分方程建摸的艺术性.1微分方程相关函数(命令)及简介因为没有一种算法可以有效地解决所有的ODE 问题,为此,Matlab 提供了多种求解器Solver,对于不同的ODE 问题,采用不同的Solver.阶常微分方程(组)的初值问题的解的 Matlab 的常用程序,其中:ode23 采用龙格-库塔2 阶算法,用3 阶公式作误差估计来调节步长,具有低等的精度.ode45 则采用龙格-库塔4 阶算法,用5 阶公式作误差估计来调节步长,具有中等的精度.2 求解微分方程的一些例子2.1 几个可以直接用 Matlab 求微分方程精确解的例子:例1:求解微分方程22x xe xy dxdy -=+,并加以验证. 求解本问题的Matlab 程序为:syms x y %line1y=dsolve('Dy+2*x*y=x*exp(-x^2)','x') %line2diff(y ,x)+2 *x*y-x*exp(-x^2) %line3simplify(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 格式),即x e e y x+=,此函数的图形如图 1:图1 y 关于x 的函数图象2.2 用ode23、ode45等求解非刚性的标准形式的一阶常微分方程(组)的初值问题的数值解(近似解).例3:求解微分方程初值问题⎪⎩⎪⎨⎧=++-=1)0(2222y x x y dx dy 的数值解,求解范围为区间[0, 0.5].fun=inline('-2*y+2*x^2+2*x','x','y');[x,y]=ode23(fun,[0,0.5],1); x; yplot(x,y ,'o-')>> x'ans =0.0000 0.0400 0.0900 0.1400 0.1900 0.24000.2900 0.3400 0.3900 0.4400 0.4900 0.5000>> y'ans =1.0000 0.9247 0.8434 0.7754 0.7199 0.67640.6440 0.6222 0.6105 0.6084 0.6154 0.6179图形结果为图2.图2 y关于x的函数图像3 常微分在实际中的应用3.1 导弹追踪问题设位于坐标原点的甲舰向位于x轴上点A(1,0)处的乙舰发射导弹,导弹v沿平行于y轴的直线行驶,导弹的速度始终对准乙舰。

matlab推导微分方程

matlab推导微分方程

matlab推导微分方程
标题,使用MATLAB推导微分方程。

在科学和工程领域中,微分方程是描述自然现象和工程问题的
重要数学工具。

MATLAB是一种强大的数学软件,可以用来解决微分
方程和进行数值模拟。

本文将介绍如何使用MATLAB来推导微分方程。

首先,让我们考虑一个简单的一阶微分方程的例子:
dy/dx = -2x.
我们将使用MATLAB来推导这个微分方程。

在MATLAB中,我们
可以使用符号计算工具箱来进行符号计算。

首先,我们需要定义变
量和函数:
syms y(x)。

eqn = diff(y,x) == -2x;
在这里,我们定义了一个符号变量y(x),并且定义了微分方程。

接下来,我们可以使用dsolve函数来解微分方程:
sol = dsolve(eqn)。

MATLAB将会给出微分方程的解:
sol =。

C2 x^2。

这里,C2是一个任意常数。

这样,我们就使用MATLAB成功地推导出了微分方程的解。

除了一阶微分方程,MATLAB也可以用来推导高阶微分方程。

例如,考虑一个二阶微分方程:
d^2y/dx^2 + 2dy/dx + 2y = 0。

我们可以用类似的方法来推导这个微分方程,并用MATLAB来求解。

总之,MATLAB是一个强大的工具,可以用来推导和求解微分方
程。

它为工程师和科学家提供了一个方便而有效的方式来处理微分方程,从而更好地理解和解决实际问题。

希望本文能够帮助读者更好地了解如何使用MATLAB进行微分方程的推导和求解。

matlab求解微分方程

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求解微分方程及偏微分方程

Matlab求解微分方程及偏微分方程

第四讲Matlab求解微分方程(组)理论介绍:Matlab求解微分方程(组)命令求解实例:Matlab求解微分方程(组)实例实际应用问题通过数学建模所归纳得到的方程,绝大多数都是微分方程,真正能得到代数方程的机会很少.另一方面,能够求解的微分方程也是十分有限的, 特别是高阶方程和偏微分方程(组).这就要求我们必须研究微分方程(组)的解法:解析解法和数值解法.一.相关函数、命令及简介1.在Matlab中,用大写字母D表示导数,Dy表示y关于自变量的一阶导数, D2y表示y关于自变量的二阶导数,依此类推.函数dsolve用来解决常微分方程(组)的求解问题,调用格式为:X=dsolve(<eqnl,,,eqn2函数dsolve用来解符号常微分方程、方程组,如果没有初始条件,则求出通解,如果有初始条件,则求出特解.注意,系统缺省的自变量为t2.函数dsolve求解的是常微分方程的精确解法,也称为常微分方程的符号解. 但是,有大量的常微分方程虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解,在求常微分方程数值解方面,MATLAB具有丰富的函数,我们将其统称为solver,其一般格式为:[T,Y]=solver(odefun,tspan,yO)说明:(1 )solver 为命令ode45、ode23、odel 13、odel5s、ode23s、ode23t、ode23tb、odel5i 之一.(2)odefun是显示微分方程),=f (t,y)在积分区间tspan =[心心]上从心到“用初始条件儿求解.(3)如果要获得微分方程问题在其他指定时间点bG©…心上的解,则令(span = 『“,•••『/■](要单调的).(4)因为没有一种算法可以有效的解决所有的ODE问题,为此,Matlab提供T多种求解器solver,对于不同的ODE问题,采用不同的solver.程(组)的初值问题的解的Matlab常用程序,其中:ode23采用龙格-库塔2阶算法,用3阶公式作误差估计来调节步长,具有低等的精度.。

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函数编写并求解微分方程

0.4 0.3 0.2 0.1
0 -0.1 -0.2 -0.3
-2
1
iL(t)
0
2
4
6
time sec
8
10
0.5 0
uC(t)
-0.5
-2
0
2
4
6
8
time sec
3.全响应 保持 funcforex123.m 不变(in= (t..0)*1),将系统状态改为[0,1]
0.4 0.3 0.2 0.1
实验八:用 MATLAB 函数编写并求解微分方程
一、实验原理
为了对连续系统进行方针,首先需要建立其数学模型,然后利用计算机求这些数学模型,
从而得出数学模型的数值解。由于连续系统是通过微分方程老建模的,因此对此的计算
机方针本质上解释微分方程的数值求解问题。
二、实验步骤
1. 建立数学模型,利用电路的拓扑元件的属性,列出网孔方程或节点方程,并简化为
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 求解常微分方程在MATLAB 中,由函数dsolve ()解决常微分方程(组)的求解问题,其具体格式如下:r = dsolve('eq1,eq2,...', 'cond1,cond2,...', 'v')'eq1,eq2,...'为微分方程或微分方程组,'cond1,cond2,...',是初始条件或边界条件,'v'是独立变量,默认的独立变量是't'。

函数dsolve 用来解符号常微分方程、方程组,如果没有初始条件,则求出通解,如果有初始条件,则求出特解。

例1:求解常微分方程1dy dx x y =+的MATLAB 程序为:dsolve('Dy=1/(x+y)','x'),注意,系统缺省的自变量为t ,因此这里要把自变量写明。

其中:Y=lambertw(X)表示函数关系Y*exp(Y)=X 。

例2:求解常微分方程的MATLAB 程序为:2'''0yy y −=Y2=dsolve('y*D2y-Dy^2=0','x')Y2=dsolve('D2y*y-Dy^2=0','x')我们看到有两个解,其中一个是常数0。

例3:求常微分方程组253ttdxx y edtdyx y edt⎧++=⎪⎪⎨⎪−−=⎪⎩通解的MATLAB程序为:[X,Y]=dsolve('Dx+5*x+y=exp(t),Dy-x-3*y=exp(2*t)','t')例4:求常微分方程组2210cos,24,tttdx dyx t xdt dtdx dyy e ydt dt=−=⎧+−==⎪⎪⎨⎪++==⎪⎩2通解的MATLAB程序为:[X,Y]=dsolve('Dx+2*x-Dy=10*cos(t),Dx+Dy+2*y=4*exp(-2*t)','x(0)=2,y(0)=0','t')以上这些都是常微分方程的精确解法,也称为常微分方程的符号解。

利用Matlab求解微分方程

利用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求解常微分方程的准确解一、引言常微分方程是研究自然界现象和工程实际问题中常见的数学工具之一。

求解常微分方程的准确解对于理解问题的本质和性质具有重要意义。

本文将介绍如何使用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求解微分方程(实验6)微分方程求解-文档资料

MATLAB求解微分方程(实验6)微分方程求解-文档资料

dx
输入:y=dsolve ('Dy=1+y^2') y1=dsolve('Dy=1+y^2','y(0)=1','x')
输出:y= tan(t-C1)
(通解)
y1= tan(x+1/4*pi) (特解)
例2 常系数的二阶微分方程
y' '2 y'3y 0, y(0) 1, y' (0) 0
ode23:组合的2/3阶龙格-库塔-芬尔格算法 ode45:运用组合的4/5阶龙格-库塔-芬尔格算法
用于设定误差限(缺省时设定相对误差10-3, 绝对误差10-6), 命令为:options=odeset(’reltol’,rt,’abstol’,at), rt,at:分别为设定的相对误差和绝对误差.
14
注意: 1、在解n个未知函数的方程组时,x0和x均为n维向量,
m-文件中的待解方程组应以x的分量形式写成。
2、使用Matlab软件求数值解时,高阶微分方程必须 等价地变换成一阶微分方程组。
y(n) f (t, y, y, , y(n1) ) y(0), y(0), , y(n1) (0)
选择一组状态变量
x1 y, x2 y, , xn y(n1)
x1 x2 , x2 x3,
xn f (t, x1, x2 , , xn )
15
注意
x1 x2 , x2 x3,
xn f (t, x1, x2 , , xn )
1、建立M文件函数
function xdot = fun(t,x,y) xdot = [x2(t);x3(t);…;f(t, x1(t), x2(t),…xn(t))];

matlab中的S函数

matlab中的S函数

S函数的简介及编写摘自恒润科技S-function的编写1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。

在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。

2. S函数模板的相关基础:1)M文件S函数的引导语句为:xtflagfuFunction[psysxstrtsp,,12,...),,,0,],(,S函数默认的四个输入参数:t ,x ,u ,flagS函数默认的四个输出函数:sys ,x0 ,str ,ts各个参数的含义如下:T :代表当前的仿真时间,该输入决定了下一个采样时间;X :表示状态向量,行向量,引用格式:X(1),X(2)U :表示输入向量;Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值;Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x.X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ]Str :空矩阵,无具体含义;Ts :包含模块采样时间和偏差的矩阵。

[period, offset]当Ts为-1时,表示与输入信号同采样周期。

2)S函数工作方式:Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件和Sizes数组;Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。

Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间和主时间步的要求;Flag = 3时,调用mdlOutputs函数,计算S函数的输出;Flag = 4时,调用mdlGetTimeOfNextVarHit函数,计算下一个采样点的绝对时间,这个方法仅仅是使用户在mdlInitializeSize 里说明一个可变的离散采样时间;Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。

利用matlab编写S函数求解微分方程

利用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求解方程微分法

matlab求解方程微分法

matlab求解方程微分法
在MATLAB中,可以使用`dsolve`函数来求解方程微分法。

`dsolve`函数的输入是一个符号表达式,表示待求解的方程,输出是其解的符号表达式。

以下是使用`dsolve`函数求解方程微分法的示例:
```matlab
syms y(t)
% 定义待求解的方程
eqn = diff(y, t) == 2 * y + 1;
% 求解方程
sol = dsolve(eqn);
% 显示方程的解
disp(sol);
```
该代码定义了一个待求解的方程 `diff(y,t) == 2*y + 1`,其中 `y(t)` 表示未知函数,`diff` 函数表示对 `y` 对 `t` 求导。

然后使用 `dsolve` 函数求解方程,并将其结果存储在 `sol` 变量中。

最后使用 `disp` 函数显示方程的解。

请根据需要调整方程和变量的定义,以满足特定问题的求解需求。

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

利用matlab编写S函数求解微分方程自动化专业综合设计报告自动化专业综合设计报告函数求解微S编写设计题目:利用matlab分方程自动化系统仿真实验室所在实验室:郭卫平指导教师:律迪迪学生姓名200990519114 班级文自0921 学号成绩评定:自动化专业综合设计报告一、设计目的了解使用simulink的扩展工具——S-函数,s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API 等的,它的魅力在于完美结合了simulink 框图简洁明快的特点和编程灵活方便的优点,提供了增强和扩展sinulink能力的强大机制,同时也是使用RTW实现实时仿真的关键。

二、设计要求求解解微分方程y'=y-2x/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的内容。

function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)%SFUNTMPL S-functionM-file Generaltemplatedefine you can With % M-fileS-functions,you own ordinary differential system equations (ODEs),discrete %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-functionsyntax is:% [SYS,X0,STR,TS] =SFUNC(T,X,U,FLAG,P1,...,Pn)%given is % What returned by SFUNC at apoint in time, T, depends on the value of the FLAG, the current state vector, %X, and the currentinput vector, U. %%% FLAG RESULT DESCRIPTION----------- %--------------------------------------------[SIZES,X0,STR,TS] % 0 Initialization, return systemsizes in SYS,state initial % in X0, state ordering stringsin STR,and %sample times in TS.Return% 1 DX自动化专业综合设计报告continuous state derivatives inSYS.% 2 DSUpdatediscrete states SYS = X(n+1)% 3 YReturnoutputs in SYS.% 4 TNEXTReturnnext time hit for variable step sample% timeinSYS.% 5 Reservedfor future (root finding).% 9 [] Termination,perform any cleanup SYS=[].%%% The state vectors, X and X0 consists ofcontinuous states followed% by discrete states.%% Optional parameters,P1,...,Pn can beprovided 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 fourelements in SYS can be specified % as -1 indicating that they aredynamically sized. The% actual length forall otherflags 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 Uis used during the FLAG=3自动化专业综合设计报告% call. Setting this to 0 is akinto making a promise that% U will not be used duringFLAG=3. If you break the promise % then unpredictable resultswill 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 stringswhich 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 thesample times must be:自动化专业综合设计报告%% TS = [00, :Continuous sample time.% 01, :Continuous, but fixed in minor step% sample time.% PERIOD OFFSET, :Discrete sample time where% PERIOD > 0 & OFFSET < PERIOD.% -20]; :Variable step discrete sample time%where FLAG=4 is used to get time of% next hit.%% There can be more than onesample time providing% they are ordered such thatthey are monotonically自动化专业综合设计报告% increasing. Onlythe neededsample times should be% specified in TS. Whenspecifying than one% sample time, you mustcheck for sample hits explicitly by% seeing if%abs(round((T-OFFSET)/PERIOD) -(T-OFFSET)/PERIOD)specified a is within % tolerance, generally 1e-8. This tolerance is dependentupon %your model's sampling timesand simulation time. % %You can also specify thatthe %sample time of the S-functionis inherited from thedriving %block. For functions whichsteps, minor change % duringthis is done by自动化专业综合设计报告% specifying SYS(7) =1 andTS = [-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 structureof an S-function.%switch flag,%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%case 0,[sys,x0,str,ts]=mdlInitializeSi zes;自动化专业综合设计报告%%%%%%%%%%%%%%%% 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, andsample times for the S-function. %=============================================================================%function[sys,x0,str,ts]=mdlInitializeSi zes%% call simsizes for a sizes structure, fill it in andconvert it to a% sizes array.%% Note that in this example, the values are hardcoded. This is not a% recommended practice as the characteristicsof 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 onesample time is neededsys = simsizes(sizes);%% initialize the initial conditions%= [0 1.0000]; x0%% str is always an empty matrix %str = [];%% initialize the array of sample times自动化专业综合设计报告%ts = [0 0];% end mdlInitializeSizes%%============================== =============================== ================% mdlDerivatives% Return the derivatives for the continuousstates.%============================== =============================== ================%functionsys=mdlDerivatives(t,x,u)sys(1)=(u-2*x/u)*t+u;【步骤3】利用matlab调用函数得到结果。

相关文档
最新文档