资源描述:
《S函数学习笔记》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、S函数用于自定义实现特定的算法,然后嵌入到simulink模块“S-Function”中用于仿真。一、主函数1、函数头:function[sys,x0,str,ts]=functionname(t,x,u,flag,p1,p2,p3...)① sys,x0,str,ts为系统默认输出变量;② t,x,u,flag为系统默认输入参数;③ p1,p2,p3...为用户可选输入变量;(如果定义函数时列表中有可选输入参数,在S-Function模块中要设置参数的值)④ s函数文件名要与函数名一致。2、函数体switchflagcase0[sys,
2、x0,str,ts]=mdlInitializeSizes;case1sys=mdlDerivatives(t,x,u);case2sys=mdlUpdates(t,x,u);case3sys=mdlOutputs(t,x,u);case4sys=mdlGetTimeOfNextVarHit(t,x,u);case9sys=mdlGetTimeOfNextVarHit(t,x,u);3、说明对于特定的算法可能只用到某些flag状态的操作,对于不需要操作的flag状态,有两种处理方式,一种是在主函数中处理,另一种是在定义子函数时处理。以不需
3、要进行flag为1、4和9状态时的操作为例分别进行说明。① 在主函数中处理在主函数中编写为:case{1,2,9}sys=[];这样处理就不需要再编写对应状态的子函数。② 在子函数中处理在主函数中编写为:case1sys=mdlDerivatives(t,x,u);case4sys=mdlGetTimeOfNextVarHit(t,x,u);case9sys=mdlGetTimeOfNextVarHit(t,x,u);在子函数中编写为:functionsys=mdlUpdates(t,x,u)sys=[];functionsys=mdlG
4、etTimeOfNextVarHit(t,x,u)sys=[];functionsys=mdlTerminate(t,x,u)sys=[];二、子函数算法的设计可能会用到状态变量x,那么根据x的性质可以将算法分为三大类:基于连续状态变量的算法、基于离散状态变量的算法和不基于状态变量的算法。接下来分别介绍这三种类型的算法设计。1、基于连续状态变量的算法算法的整体设计思想是:ẋ=f1(t,x,u)y=f2(t,x,u)① 初始化(flag=0)设置使用的连续状态变量的个数:size.NumContStates=□设置不使用离散状态变量:siz
5、e.NumDiscStates=0设置输出变量的个数:size.NumOutputs=□设置输入变量的个数:size.NumInputs=□设置输出变量与输入变量是否相关:size.DirFeedthrough=1或0设置采样时间的个数:size.NumSampleTimes=□用系统变量sys记录并返回上述设置:sys=simsize(sizes)设置状态变量的初始值:x0=[□□□...]设置保留变量str为空:str=[]设置采样时间类型:ts=[□□...]示例:/*********************************
6、******************/function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;sizes.NumContStates=2;sizes.NumDiscStates=0;sizes.NumOutputs=2;sizes.NumInputs=2;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;sys=simsizes(sizes);x0=zeros(2,1);str=[];ts=[00];/*******************
7、********************************/② 状态变量求导(flag=1)子函数mdlDerivatives实现连续状态变量x导数的表达式:f1(t,x,u),用系统变量sys记录并传递给ẋ。在函数体中也可以编写其它操作,但是sys只返回给ẋ。示例:/***************************************************/functionsys=mdlDerivatives(t,x,u,A,B,C,D)sys=A*x+B*u;/****************************
8、***********************/① 状态变量更新(flag=2)子函数mdlUpdates实现离散状态变量x的更新,因此在基于连续状态变量的算法中不需要这一步运算。② 输出变量