利用matlab编写S函数求解微分方程
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应用无穷级数微分方程求解方程

[例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的编写

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

例 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函数求解微分方程.

%
% 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求简单微分方程的解析解、数值解,加深对微分方程概念和应用的理解;针对一些具体的问题,如追击问题,掌握利用软件求解微分方程的过程;了解微分方程模型解决问题思维方法及技巧;体会微分方程建摸的艺术性.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来推导微分方程。
首先,让我们考虑一个简单的一阶微分方程的例子:
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提供了一系列的函数来支持求解。
常用的函数包括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提供了一系列函数来支持求解微分方程,让我们不再受到繁琐的数学推导的束缚,使用起来方便快捷。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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调用函数得到结果。