利用matlab编写S函数求解微分方程.docx
《利用matlab编写S函数求解微分方程.docx》由会员分享,可在线阅读,更多相关《利用matlab编写S函数求解微分方程.docx(11页珍藏版)》请在冰豆网上搜索。
利用matlab编写S函数求解微分方程
利用matlab编写S函数求解微分方程
自动化专业综合设计报告
设计题目:
利用matlab编写S函数求解微分方程
所在实验室:
自动化系统仿真实验室
指导教师:
郭卫平
学生姓名律迪迪
班级文自0921学号200990519114
成绩评定:
一、设计目的
了解使用simulink的扩展工具——S-函数,s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windowsAPI等的,它的魅力在于完美结合了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)
%SFUNTMPLGeneralM-fileS-functiontemplate
%WithM-fileS-functions,youcandefineyouownordinarydifferential
%equations(ODEs),discretesystemequations,and/orjustabout
%anytypeofalgorithmtobeusedwithinaSimulinkblockdiagram.
%
%ThegeneralformofanM-FileS-functionsyntaxis:
%[SYS,X0,STR,TS]=SFUNC(T,X,U,FLAG,P1,...,Pn)
%
%WhatisreturnedbySFUNCatagivenpointintime,T,dependsonthe
%valueoftheFLAG,thecurrentstatevector,X,andthecurrent
%inputvector,U.
%
%FLAGRESULTDESCRIPTION
%-------------------------------------------------------
%0[SIZES,X0,STR,TS]Initialization,returnsystemsizesinSYS,
%initialstateinX0,stateorderingstrings
%inSTR,andsampletimesinTS.
%1DXReturncontinuousstatederivativesinSYS.
%2DSUpdatediscretestatesSYS=X(n+1)
%3YReturnoutputsinSYS.
%4TNEXTReturnnexttimehitforvariablestepsample
%timeinSYS.
%5Reservedforfuture(rootfinding).
%9[]Termination,performanycleanupSYS=[].
%
%
%Thestatevectors,XandX0consistsofcontinuousstatesfollowed
%bydiscretestates.
%
%Optionalparameters,P1,...,PncanbeprovidedtotheS-functionand
%usedduringanyFLAGoperation.
%
%WhenSFUNCiscalledwithFLAG=0,thefollowinginformation
%shouldbereturned:
%
%SYS
(1)=Numberofcontinuousstates.
%SYS
(2)=Numberofdiscretestates.
%SYS(3)=Numberofoutputs.
%SYS(4)=Numberofinputs.
%AnyofthefirstfourelementsinSYScanbespecified
%as-1indicatingthattheyaredynamicallysized.The
%actuallengthforallotherflagswillbeequaltothe
%lengthoftheinput,U.
%SYS(5)=Reservedforrootfinding.Mustbezero.
%SYS(6)=Directfeedthroughflag(1=yes,0=no).Thes-function
%hasdirectfeedthroughifUisusedduringtheFLAG=3
%call.Settingthisto0isakintomakingapromisethat
%UwillnotbeusedduringFLAG=3.Ifyoubreakthepromise
%thenunpredictableresultswilloccur.
%SYS(7)=Numberofsampletimes.ThisisthenumberofrowsinTS.
%
%
%X0=Initialstateconditionsor[]ifnostates.
%
%STR=Stateorderingstringswhichisgenerallyspecifiedas[].
%
%TS=Anm-by-2matrixcontainingthesampletime
%(period,offset)information.Wherem=numberofsample
%times.Theorderingofthesampletimesmustbe:
%
%TS=[00,:
Continuoussampletime.
%01,:
Continuous,butfixedinminorstep
%sampletime.
%PERIODOFFSET,:
Discretesampletimewhere
%PERIOD>0&OFFSET%-20];:
Variablestepdiscretesampletime
%whereFLAG=4isusedtogettimeof
%nexthit.
%
%Therecanbemorethanonesampletimeproviding
%theyareorderedsuchthattheyaremonotonically
%increasing.Onlytheneededsampletimesshouldbe
%specifiedinTS.Whenspecifyingthanone
%sampletime,youmustcheckforsamplehitsexplicitlyby
%seeingif
%abs(round((T-OFFSET)/PERIOD)-(T-OFFSET)/PERIOD)
%iswithinaspecifiedtolerance,generally1e-8.This
%toleranceisdependentuponyourmodel'ssamplingtimes
%andsimulationtime.
%
%YoucanalsospecifythatthesampletimeoftheS-function
%isinheritedfromthedrivingblock.Forfunctionswhich
%changeduringminorsteps,thisisdoneby
%specifyingSYS(7)=1andTS=[-10].Forfunctionswhich
%areheldduringminorsteps,thisisdonebyspecifying
%SYS(7)=1andTS=[-11].
%Copyright1990-2002TheMathWorks,Inc.
%$Revision:
1.18$
%
%ThefollowingoutlinesthegeneralstructureofanS-function.
%
switchflag,
%%%%%%%%%%%%%%%%%%
%Initialization%
%%%%%%%%%%%%%%%%%%
case0,
[sys,x0,str,ts]=mdlInitializeSizes;
%%%%%%%%%%%%%%%
%Derivatives%
%%%%%%%%%%%%%%%
case1,
sys=mdlDerivatives(t,x,u);
%%%%%%%%%%
%Update%
%%%%%%%%%%
case{2,3,9},
sys=[];
%%%%%%%%%%%
%Outputs%
%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
%GetTimeOfNextVarHit%
%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
%Terminate%
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%
%Unexpectedflags%
%%%%%%%%%%%%%%%%%%%%
otherwise
error(['Unhandledflag=',num2str(flag)]);
end
%endsfuntmpl
%
%=============================================================================
%mdlInitializeSizes
%Returnthesizes,initialconditions,andsampletimesfortheS-function.
%=============================================================================
%
function[sys,x0,str,ts]=mdlInitializeSizes
%
%callsimsizesforasizesstructure,fillitinandconvertittoa
%sizesarray.
%
%Notethatinthisexample,thevaluesarehardcoded.Thisisnota
%recommendedpracticeasthecharacteristicsoftheblockaretypically
%definedbytheS-functionparameters.
%
sizes=simsizes;
sizes.NumContStates=1;
sizes.NumDiscStates=0;
sizes.NumOutputs=0;
sizes.NumInputs=0;
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;%atleastonesampletimeisneeded
sys=simsizes(sizes);
%
%initializetheinitialconditions
%
x0=[01.0000];
%
%strisalwaysanemptymatrix
%
str=[];
%
%initializethearrayofsampletimes
%
ts=[00];
%endmdlInitializeSizes
%
%=============================================================================
%mdlDerivatives
%Returnthederivativesforthecontinuousstates.
%=============================================================================
%
functionsys=mdlDerivatives(t,x,u)
sys
(1)=(u-2*x/u)*t+u;
【步骤3】利用matlab调用函数得到结果。
利用sys=sfuntmpl([],[x],[],1)调用S函数,
替换x得到不同的结果
四、设计实验结果及分析
替换不同德x得到不同结果。
为检验结果是否正确
在命令窗口运行
x1
(1)=0;y1
(1)=1;h=0.1;
fork=1:
10
x1(k+1)=x1(k)+h;
end
x=0:
0.1:
1;
y=(2*x+1).^(1/2);
x1=x1(1:
11),y=y(1:
11),
与S函数所对应,所以上述实验结果正确。
五、结论
上述为本次解微分方程得到的结果。
六、设计感受
通过本次试验充分理解了S函数的框图简洁明快的特点和编程灵活方便的优点。
同时复习总结了matlab程序的使用。
实验过程遇到得问题通过咨询老师,同学讨论,查阅资料的都得到了解决,充分锻炼了自己认识问题解决问题的能力。
另外,通过本次实验回忆起好多以前学过的知识,不仅在本次实验中得到应用更对以后的学习生活起到了极大的启发。
编译时间总是那么短暂,不知不觉本次课程设计就要结束,严谨的程序语句,适当的编译顺序是我本次课程设计的最大收获,相信这对我以后的课程设计、毕业设计乃至工作生活的影响都是巨大的。
通过分组形式的进行课程设计,加强了同学间的交流与了解,也在不断的培养团队精神,团队意识就体现在组员之间的默契协作.以确保做的项目能够保质保量按期完成,在设计中出现的问题,也不仅限于组员间协商解决,但前提是组员的努力还是没法解决,可以向其他同学或是指导老师寻求帮助,最终将问题解决.