-
S
函数用于自定义实现特定的算法,然后嵌入到
simulink
模块“
S-Function
”中用于仿真。
一、主函数
1
、函数头:
function
[sys,x0,
str,ts]=functionname(t,x,u,flag,
p1,p2,p
3...
)
①
sys,x0,str,ts
为系统默认输出变量;
②
t,x,u,flag
为系统默认输入参数;
③
p1,p2,p3...
为用户可选输入变量;
(如果定义函数时列表
中有可选输入参数,在
S-Function
模块中要设置参数
的值)
④
s
函数文件名要与函数名一致。
2
、函数体
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes;
case 1
sys =
mdlDerivatives(t,x,u);
case 2
sys = mdlUpdates(t,x,u);
case 3
sys =
mdlOutputs(t,x,u);
case 4
sys = mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlGetTimeOfNextVarHit(t,x,u);
3
、说明
对
于特定的算法可能只用到某些
flag
状态的操作,对于不需要
操作的
flag
状态,有两
种处理方式
,一种是在主函数中处理,另一种是在定义子函数时处理。以不需要进行
flag
为
1
、
4
和
9
状态时的操作为例分别进行说明。
①
在主函数中处理
在主函数中编写为:
case
{1,2,9}
sys = [];
这样处理就不需要再编写对应状态的子函数。
②
在子函数中处理
在主函数中编写为:
case 1
sys = mdlDerivatives(t,x,u);
case 4
sys =
mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlGetTimeOfNextVarHit(t,x,u);
在子函数中编写为:
function sys = mdlUpdates(t,x,u)
sys = [];
function sys =
mdlGetTimeOfNextVarHit(t,x,u)
sys = [];
function sys=mdlTerminate(t,x,u)
sys = [];
二、子函数
<
/p>
算法的设计可能会用到状态变量
x
,那么
根据
x
的性质可以将算法分为三大类:基于连续状
态变量的算法、
基于离散状态变量的算法和不基于状态变量的算法。
接下来分别介绍这三种
类型的算法设计。
1
、基于连续状态变量的算法
算法的整体设计思想是:
?
=f1(t,x,
u)
y=f2(t,x,u)
①
初始化
(flag=0)
设置使用的连续状态变量的个数:
tStates =
□
设置不使用离散状态变量:
cStates = 0
设置输出变量的个数:
puts =
□
设置输入变量的个数:
uts =
□
设置输出变量与输入变量是否相关:
dthrough =
1
或
0
设置采样时间的个数:
pleTimes =
□
用系统变量
sys
记录并返回上述设置:
sys=simsize(si
zes)
设置状态变量的初始值:
x0 =
[
□
□
□
...]
设置保留变量
str
为空:
str = []
设置采样时间类型:
ts =
[
□
□
...]
示例:
/************
***************************************/
function [sys,x0,str,ts] =
mdlInitializeSizes
sizes =
simsizes;
tStates = 2;
cStates = 0;
puts = 2;
uts = 2;
dthrough = 1;
pleTimes = 1;
sys = simsizes(sizes);
x0 = zeros(2,1);
str = [];
ts = [0 0];
/***************
************************************/
②
状态变量求导
(flag=1)
子函
数
mdlDerivatives
实现连续状态变量
x
导数的表达式:
f1(t,x,u)
,用系统变量
sys
记录并传递给
?
。在函数体中也可以编写其它操作,但是
sys
p>
只返回给
?
。
示例:
/************
***************************************/
function sys =
mdlDerivatives(t,x,u,A,B,C,D)
-
-
-
-
-
-
-
-
-
上一篇:语48个音标怎么读
下一篇:耳鼻喉科要求掌握的英文词汇