SFunction 使用及应用举例.docx

上传人:b****3 文档编号:5404230 上传时间:2022-12-16 格式:DOCX 页数:20 大小:23.88KB
下载 相关 举报
SFunction 使用及应用举例.docx_第1页
第1页 / 共20页
SFunction 使用及应用举例.docx_第2页
第2页 / 共20页
SFunction 使用及应用举例.docx_第3页
第3页 / 共20页
SFunction 使用及应用举例.docx_第4页
第4页 / 共20页
SFunction 使用及应用举例.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

SFunction 使用及应用举例.docx

《SFunction 使用及应用举例.docx》由会员分享,可在线阅读,更多相关《SFunction 使用及应用举例.docx(20页珍藏版)》请在冰豆网上搜索。

SFunction 使用及应用举例.docx

SFunction使用及应用举例

S-Function使用及应用举例

【说明】近来在论坛中很多朋友问及Simulink下的S-函数的编写及使用方法,在西安交大BBS上,hii_yzf网友发表了有关S-函数使用的文章,举例比较详尽,相信对关心S-函数的网友会有很大帮助。

发信人:

hii_yzf(叶子,信区:

MathTools

标题:

S-FUNCTIONS的书写之一

发信站:

交通大学思源BBS站(MonApr1616:

35:

092001,站内信件

S-FUNCTIONS的书写之一

s-function也就是system-function的缩写。

说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。

要了解s-function,必须了解以下知识:

(1directfeedthrough

(2dynamicallysizedinputs

(3settingsampletimesandoffsets

[由于我也不知道怎么把上面三句话精确的翻译成中文,因此在此不加翻译,大家自己理解,也许更好]由于上面三部分的重要性,在此详细进行分析。

一.directfeedthrough

directfeedthrough意思是说系统的输出或可变采样时间是否受到输入的控制。

大家清楚有的系统是受到输入控制如:

y=k*u(u是输入,k是放大因子,y是输出

而有的系统输出是不受到输入影响,如:

输出:

y=x

dx=u

x表示状态

二.dynamicallysizedinputs

主要是给出:

输入连续状态数目(size.NumContStates,离散状态数目(size.NumDiscStates

输出数目(size.NumOutputs,输入数目(size.NumInputs,DirectFeedthrough(size.DirFeedthrough。

三.settingsampletimesandoffsets

settingsmapletimesandoffsets主要设置采样时间MATLAB为了用户方便,已经书写了S-FUNCTIONS模板函数sfuntmpl.m。

为了更好的写S-FUNCTIONS,大家来看一下,该函数sfuntmpl.m内容如下:

(我通过在该内容加注释来说明,以$开头

function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag

$输出变量就此四个,大家必须注意它的顺序。

$输入变量可以为t,x,u,flag,p1,...,pn等,但是前面的四个变量不能变,特此说明。

%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.

$具体怎样实现,大家参看后面的函数mdlInitializeSizes

%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.%

$需要说明的是sys的顺序不能乱

%

%X0=Initialstateconditionsor[]ifnostates.

%

%STR=Stateorderingstringswhichisgenerallyspecifiedas[].

%

%TS=Anm-by-2matrixcontainingthesampletime

%(period,offsetinformation.Wherem=numberofsample

%times.Theorderingofthesampletimesmustbe:

%

%TS=[00,:

Continuoussampletime.

%01,:

Continuous,butfixedinminorstep

%sampletime.

%PERIODOFFSET,:

Discretesampletimewhere

%PERIOD>0&OFFSET〈PERIOD.

%-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=[-1-1].

%Copyright(c1990-1998byTheMathWorks,Inc.AllRightsReserved.

%$Revision:

1.12$

%

%ThefollowingoutlinesthegeneralstructureofanS-function.

%

switchflag,

%%%%%%%%%%%%%%%%%%

%Initialization%

%%%%%%%%%%%%%%%%%%

case0,[sys,x0,str,ts]=mdlInitializeSizes;

$大家是不是觉得此函数名太长,当然可以根据自己的爱好加以改变,不过后面的相应改。

%%%%%%%%%%%%%%%

%Derivatives%

%%%%%%%%%%%%%%%

case1,sys=mdlDerivatives(t,x,u;

%%%%%%%%%%

%Update%

%%%%%%%%%%

case2,sys=mdlUpdate(t,x,u;

%%%%%%%%%%%

%Outputs%

%%%%%%%%%%%

case3,sys=mdlOutputs(t,x,u;

%%%%%%%%%%%%%%%%%%%%%%%

%GetTimeOfNextVarHit%

%%%%%%%%%%%%%%%%%%%%%%%

case4,sys=mdlGetTimeOfNextVarHit(t,x,u;

%%%%%%%%%%%%%

%Terminate%

%%%%%%%%%%%%%

case9,sys=mdlTerminate(t,x,u;

%%%%%%%%%%%%%%%%%%%%

%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.

%

$关于函数simsizes大家必须遵循,因为把是内部函数,不得随便改变,其作用是返回未初始化的size结构。

sizes=simsizes;

$numberofcontinuousstates

sizes.NumContStates=0;

$numberofdiscretestates

sizes.NumDiscStates=0;

$numberofoutputs

sizes.NumOutputs=0;

$numberofinputs

sizes.NumInputs=0;

$Flagfordirectfeedthrough

sizes.DirFeedthrough=1;

$numberofsampletimes

sizes.NumSampleTimes=1;

%atleastonesampletimeisneeded

$

sys=simsizes(sizes;

%

%initializetheinitialconditions

%

x0=[];

%

%strisalwaysanemptymatrix

%

str=[];

%

%initializethearrayofsampletimes

%

ts=[00];

%endmdlInitializeSizes

%

%=============================================================================

%mdlDerivatives

%Returnthederivativesforthecontinuousstates.

%=============================================================================

%

functionsys=mdlDerivatives(t,x,u

sys=[];%endmdlDerivatives

%

%=============================================================================

%mdlUpdate

%Handlediscretestateupdates,sampletimehits,andmajortimestep

%requirements.

%=============================================================================

%

functionsys=mdlUpdate(t,x,u

sys=[];%endmdlUpdate

%

%=============================================================================

%mdlOutputs

%Returntheblockoutputs.

%=============================================================================

%

functionsys=mdlOutputs(t,x,u

sys=[];%endmdlOutputs

%

%=============================================================================

%mdlGetTimeOfNextVarHit

%Returnthetimeofthenexthitforthisblock.Notethattheresultis

%absolutetime.Notethatthisfunctionisonlyusedwhenyouspecifya

%variablediscrete-timesampletime[-20]inthesampletimearrayin

%mdlInitializeSizes.

%=============================================================================

%

functionsys=mdlGetTimeOfNextVarHit(t,x,u

sampleTime=1;%Example,setthenexthittobeonesecondlater.

sys=t+sampleTime;%endmdlGetTimeOfNextVarHit

%

%=============================================================================

%mdlTerminate

%Performanyendofsimulationtasks.

%=============================================================================

%

functionsys=mdlTerminate(t,x,u

sys=[];%endmdlTerminate

在下面我将写几个具体的实例。

之二、连续系统例子:

function[sys,x0,str,ts]=csfunc(t,x,u,flag

%CSFUNCAnexampleM-fileS-functionfordefiningacontinuoussystem.

%ExampleM-fileS-functionimplementingcontinuousequations:

%x'=Ax+Bu

%y=Cx+Du

%

%Seesfuntmpl.mforageneralS-functiontemplate.

%

%SeealsoSFUNTMPL.

%Copyright(c1990-1998byTheMathWorks,Inc.AllRightsReserved.

%$Revision:

1.5$

A=[-0.09-0.01;10];

B=[1-7;0-2];

C=[02;1-5];

D=[-30;10];

switchflag,

%%%%%%%%%%%%%%%%%%

%Initialization%

%%%%%%%%%%%%%%%%%%

case0,[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D;

%%%%%%%%%%%%%%%

%Derivatives%

%%%%%%%%%%%%%%%

case1,sys=mdlDerivatives(t,x,u,A,B,C,D;

%%%%%%%%%%%

%Outputs%

%%%%%%%%%%%

case3,sys=mdlOutputs(t,x,u,A,B,C,D;

%%%%%%%%%%%%%%%%%%%

%Unhandledflags%

%%%%%%%%%%%%%%%%%%%

case{2,4,9},sys=[];

%%%%%%%%%%%%%%%%%%%%

%Unexpectedflags%

%%%%%%%%%%%%%%%%%%%%

otherwise,error(['Unhandledflag=',num2str(flag];

end

%endcsfunc

%

%=============================================================================

%mdlInitializeSizes

%Returnthesizes,initialconditions,andsampletimesfortheS-function.

%=============================================================================

%

function[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D

sizes=simsizes;

sizes.NumContStates=2;sizes.Nu

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1