三、S函数的设计与应用
1、S函数
- S函数是系统函数(System Function)的简称,是指采用一种程序设计语言描述的一个功能模块。
- 用户可以采用MATLAB 语言,也可以采用C、C++或FORTRAN等语言来编写S函数。
- S函数有自己特定的语法构成规则,可以用来描述并实现连续系统、离散系统以及复合系统。
- S函数能够接收来自Simulink求解算法的相关信息,并对求解算法发出的命令做出适当的响应,这种交互作用类似于Simulink系统模块与求解算法的相互作用。
2、用MATLAB语言编写S函数
edit sfuntmpl.m
模板文件sfuntmpl.m包括:1个主函数,6个子函数。
(1)主函数
引导句为:function[sys,x0,str,ts]=fname(t,x,u,flag)
- fname是S函数的函数名。
- 输入形参t,x,u,flag分别为其仿真时间、状态向量、输入向量和子函数调用标志。
- 输出形参sys代表一种返回参数;x0是初始状态值;对于M文件S函数,str将被置为一个空阵;ts是一个两列矩阵。
(2)子函数
S函数有6个子函数,这些子函数的前缀为mdl,由flag的值来控制在仿真的各阶段调用S函数的哪一个子函数。
- flag取0:调用初始化子函数mdlInitializeSizes。
- flag取1:调用子函数mdlDerivatives实现连续状态的更新。
- flag取2:调用子函数mdlUpdate实现离散状态的更新。
- flag取3:调用输出子函数mdlOutputs。
3、S函数的应用
采用S函数实现y=kx+b
(1)定义S函数
①主函数
function [sys,x0,str,ts] = timekb(t,x,u,flag,k,b) switch flag case 0 [sys,x0,str,ts]=mdlInitializeSizes;%初始化 case 3 sys=mdlOutputs(t,x,u,k,b);%计算输出量 case {1,2,4,9} sys=[]; otherwise error(num2str(flag))%出错处理 end
②初始化子函数
function [sys,x0,str,ts]=mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 0;%无连续状态 sizes.NumDiscStates = 0;%无离散状态 sizes.NumOutputs = 1;%有一个输出量 sizes.NumInputs = 1;%有一个输入信号 sizes.DirFeedthrough = 1;%输出量中含有输入量 sizes.NumSampleTimes = 1;%单个采样周期 sys = simsizes(sizes);%给其他返回参数赋值 x0 = [];%设置初始状态为零状态 str = [];%将str变量设置为空字符串 ts = [-1 0];%假定继承输入信号的采样周期
③ 输出子函数
function sys=mdlOutputs(t,x,u,k,b) sys =k*u+b;
(2)在Simulink模型中使用S函数
向模型编辑窗口中添加S函数模块、Sine Wave模块和Scope模块。
双击system模块,编辑参数
在模型编辑窗口选择S函数模块,打开封装编辑器
S函数封装后,双击打开参数对话框
Run运行结果
四、Simulink仿真应用举例
- 建立蹦极跳系统的Simulink仿真模型
- 分析蹦极跳系统的安全性,包括:
– 当弹力绳弹性系数一定时,求蹦极者的安全体重。
– 当蹦极者体重一定时,求弹力绳的最小弹性系数。
1、蹦极跳系统的Simulink仿真模型
(1)系统分析
(2)仿真模型
(3)仿真结果分析
分别设置两个积分模块的初始值
在MATLAB命令行窗口输入参数值
m=75;g=9.8;k=20;a1=1;a2=1;h=100;s=40;
时间设置为100,开始运行
可见,此时蹦极者距离水面的距离存在小于0,说明这种状态下不安全。将m改为65,其他不变,查看此时曲线:
此时是安全的。所以,在其它系统参数确定的情况下,对蹦极者的体重是有要求的。
2、分析蹦极跳系统的安全性
– 当弹力绳弹性系数一定时,求蹦极者的安全体重。
– 当蹦极者体重一定时,求弹力绳的最小弹性系数。
(1)假设人与水面的最小距离是1.5m,系统其他参数不变,求蹦极者的安全体重。
在MATLAB 输入
for m=100:-0.5:20 set_param('f1','ReturnWorkspaceOutputs','off'); [t,x,y_w]=sim('f1',0:0.01:100);%f1是Simulink模型的文件名,t是仿真时间向量,x是状态矩阵,y_w是对应Out模块的输出矩阵 if min(y_w)>1.5 break; end end disp(['最大安全体重是',num2str(m)]) dis=min(y_w); disp(['最小的安全距离是',num2str(dis)]) plot(t,y_w) grid on
结果是
最大安全体重是67.5
最小的安全距离是1.6803
(2)假设人与水面的最小距离是1.5m,求蹦极者的体重是65kg,系统其他参数不变,求最小弹性系数。
代码
m=65; for k=10:0.1:50 set_param('f1','ReturnWorkspaceOutputs','off'); [t,x,y_w]=sim('f1',0:0.01:100); if min(y_w)>1.5 break; end end disp(['最小弹性系数k是',num2str(k)]) dis=min(y_w); disp(['最小的安全距离是',num2str(dis)]) plot(t,y_w) grid on
运行结果
最小弹性系数k是18.9
最小的安全距离是1.5521
总结