专题九Simulink仿真基础-2

简介: 专题九Simulink仿真基础

三、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)仿真模型

image.png

(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


总结

目录
相关文章
|
算法
专题九Simulink仿真基础-1
专题九Simulink仿真基础
414 1
|
安全 Java
安装burp2022 --illegal-access=permit
安装burp2022 --illegal-access=permit
240 0
[simulink] --- simulink模块(二)
[simulink] --- simulink模块(二)
2236 0
|
12月前
|
大数据 Linux 数据库
openEuler操作系统介绍
openEuler是一款开源免费的操作系统,由openEuler社区运作,支持多种处理器,适用于数据库、大数据、云计算等场景。它源自华为EulerOS,现分为创新版和LTS版,分别每半年和每两年发布一次。本课程以openEuler 20.03 LTS版为例,介绍其安装流程和环境准备。
963 3
|
8月前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
441 12
基于电压矢量变换的锁相环simulink建模与仿真
本课题基于电压矢量变换的锁相环(PLL)在MATLAB2022a中进行Simulink建模与仿真。该模型通过ab坐标变换和低通滤波,实现对三相电网电压的快速准确锁相,尤其在电压不平衡条件下表现优异。系统仿真结果显示,PLL能有效提取基波正序电压分量,适用于负序电压前馈控制及双序电流环控制策略。相比传统单相PLL,该方法更稳健地应对电网不平衡和频率突变,广泛应用于电力质量监测、三相PFC电路控制及分布式发电系统的并网控制等领域。
|
12月前
|
运维 搜索推荐 数据安全/隐私保护
阿里云实时计算Flink版测评报告
阿里云实时计算Flink版在用户行为分析与标签画像场景中表现出色,通过实时处理电商平台用户行为数据,生成用户兴趣偏好和标签,提升推荐系统效率。该服务具备高稳定性、低延迟、高吞吐量,支持按需计费,显著降低运维成本,提高开发效率。
249 1
|
机器学习/深度学习 算法 PyTorch
SGD、Adam
【9月更文挑战第23天】
225 6
[simulink] --- simulink辅助技巧
[simulink] --- simulink辅助技巧
465 1