首页 > 其他分享 >simulink之S函数

simulink之S函数

时间:2023-06-08 16:36:08浏览次数:33  
标签:仿真 状态 simulink 函数 输出 采样 模块

  simulink中用户可以使用已有的模块构建系统模型,如果遇到无法由内建模块构成的模型时,编写S-函数也能完成仿真,不但灵活,而且可以采用C,C++,Fortran或Ada云烟,只要生成dll文件,就可以在simulink中直接调用。S-函数允许用户向模型中添加自己编写的模块,按照简单规则,在S-函数添加算法。将S-函数名称放在S-Function模块中,利用simulink的封装并定义用户接口。

一、Simulink模块的数学模型

  Simulin模块包括输入、输出和状态三个部分,其中输出是输入和状态的函数。状态向量分为连续状态和离散状态。若没有状态的模块,用一个空向量表示即可。因此:

  输出y = f(x, u, t);   x表状态;u表示输入,t表示时间

  根据x状态的不同,连续状态:dx = f(x, u, t);  离散状态: x(i+1) = f(x(i), u, t);x为二者之和

二、Simulink仿真过程

  初始化阶段和仿真运行阶段:前者主要是完成模块参数的确定工作,后者主要是求解器和系统共同作用,求解器实现传递模块的输出工作,完成积分状态导数,采样时间确定等;系统主要是计算模块的输出,更新状态,导数的计算、判断模块的过零事件及其他。计算连续状态包括两步,首先,求解器为待更新的系统提供当前状态、事时间与输出值;接着系统计算状态导数并传递给求解器;然后求解器对状态导数积分,计算新的状态值,更新模块输出,如有模块发出过零警告;最后会触发系统探测过零的准确时间。编程时,求解器和系统是通过不同的标志位实现执行对象的切换的。 

  仿真过程中包括包括初始化阶段和数值积分、更新离散状态、计算输出、计算下一个采样时间点和仿真结束六个部分;

  a、初始化阶段主要是完成结构体SimStruct的初始化;设置S-函数的所有必要信息,主要包括设置输入输出的端口数,设置采样时间、分配存储空间等

  b、更新连续状态,数值积分,完成连续状态的求解和非采样过零点定位。S-函数有连续状态,调用mdlDerivatives和mdlOutput函数,若有非采样过零点,调用mdlOutput和mdlZeroCrossing子函数完成输出和过零点的定位工作。

  c、更新离散状态,该函数在每一步都会执行更新

  d、计算输出,计算所有输出端的输出值

  e、计算下一个采样时间点,若用变步长求解器仿真时,需要不停计算下一步仿真的步长,否则无需多次计算仿真步长

  f、仿真结束,仿真结束是调用 

三、S-函数的工作方式

  S-函数的基本形式: function[sys, x0, str, ts] = functionName(t, x, u, flag, p1,...,pn),说明:赋值好左侧就是定义函数的标准形式,关键字function开始,接着就是 [sys, x0, str, ts]返回参数列表,不能有任何的变化,sys是通用返回参数,返回值的意义与flag参数紧密相关;x0是初始状态值;str保留值,必须设置为空矩阵;ts采样周期变量,两列分别表采样时间间隔与采样时间偏移。右侧的functionName是函数名称,可以按照标识符的要求自定义,(t, x, u, flag, p1,...,pn)作为传入参数列表,t表示时间,x表示状态,u表示输入信号,flag是求解器和系统运行的关键标识符,只有p1,...pn可以改变,其他的都不能变化。

  S-函数的运行流程完全靠flag标识符决定:

  falge = 0时,进入仿真初始阶段,调用mdlInitializeSizes(xInitial);初始化子函数,对参数进行初始化设置;

  falge = 1时,进入仿真,调用子函数mdlDerivatives(t, x, u)更新连续状态变量

  falge = 2时,进入仿真,调用子函数mdlUpdate(t, x, u)更新离散状态变量

  falge = 3时,进入仿真,调用子函数mdlOutputs(t, x, u)计算模块的输出信号

  falge = 4时,进入仿真,调用子函数mdlGetTimeOfNextVarHit(t, x, u)计算下一个采样时间,并提供采样时间

  falge = 9时,进入仿真,调用子函数mdlTerminate(t, x, u),做结束的处理工作,终止仿真的过程

标签:仿真,状态,simulink,函数,输出,采样,模块
From: https://www.cnblogs.com/guochaoxxl/p/17466863.html

相关文章

  • 聚焦 AIGC,函数计算为 AI 应用插上腾飞翅膀
    6月1日,2023阿里云峰会·粤港澳大湾区在广州举办,Serverless加速创新分论坛如约亮相,阿里云函数计算FC聚焦AIGC应用开发,GPU性能体验再升级,让AIGC应用开发更简单。以更少的代码,实现业务创新函数计算FC是一种以事件驱动为核心的全托管计算服务,用户只需编写代码并上传,函数......
  • m基于SVPWM控制器的三轴直交机械臂轨迹控制simulink仿真
    1.算法仿真效果matlab2022a仿真结果如下:      2.算法涉及理论知识概要      对于PMSM,使用MATLAB内部自带的模型进行建模,在simulink中选择PermanentMagnetSynchronousMachine,如图3.1所示。           永磁同步电机模型PMSM如图1所......
  • Python的Lambda函数: 一把极简编程的瑞士军刀
    Python中的lambda函数,或者叫匿名函数,是一个极其强大的工具。它以简洁、优雅的语法提供了创建函数的快速方式。在本篇文章中,我们将全方位地深入研究lambda函数的用法和特点,通过理论和实例相结合的方式,让你的Python编程技巧更上一层楼。Lambda函数基本语法Lambda函数的基本语法形......
  • 【体验有奖】玩转 AIGC,函数计算 x 通义千问预体验,一键部署AI应用赢Airpods
    玩转AIGC,基于函数计算FC部署通义千问预体验从文字生成到图片生成,AIGC的创造力让人惊叹,更多的人开始探索如何使用AI提高生产效率,激发更多创作潜能,然而在实际应用中,AI技术的高门槛让很多人望而却步,普通开发者和零编程经验的人是否也能简单快速地部署一个AI模型应用,享受到......
  • 神经网络:softmax激活函数
    softmax的作用:将多分类的输出值转换为范围在[0,1]和为1的概率分布soft反方词hardhardmax从一组数据中找到最大值softmax为每一个分类提供一个概率值,表示每个分类的可能性。所有分类的概念值之和是1.优点在x轴上一个很小的变化,可以导致y轴上很大的变化,将输出的数值拉开距离。在深......
  • 【Python】类的构造函数
    #在类名中传入参数:构造方法classPerson:name="xxx"def__init__(self,name):self.name=namezhangsan=Person("zhangsan")print(zhangsan.name)lisi=Person("lisi")print(lisi.name)###############################c......
  • C++面试八股文:C++中,函数的参数应该传值还是传引用?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第8面:面试官:C++中,函数的参数应该传值还是传引用?二师兄:要看参数的用途。如果是出参,必须传引用。如果是入参,主要考虑参数类型的大小,来决定传值还是传引用。面试官:为什么不使用指针?二师兄:传指针也称之为传引用(passbyrefereence)。......
  • simulink求微分方程dx =-5x + u
    一、分析题目,对dx积分才能求出x,可以通过引入积分器,其中积分器的输入是dx,输出就是x二、确定需要的模块,存在-5x,需要一个gain模块,有-5x+u需要一个sum模块,加上一步需要的积分器,此处这里的u用正弦信号,需要一个sinewave,查看信号情况,需要一个scope模块,需要观察两信号的叠加输出,输出一个......
  • delphi 回调函数例子 用函数过程作为参数
    转:今天有个朋友问我怎么用函数或者过程作为函数的参数呢,我说网上有挺多的,然而他告诉我很多例子运行不起来,我搜了几个测试了下,不知道是不是我自己的软件版本的问题,运行不了,所以自己研究了下,把自己能运行的贴出来,和大家分享分享。先说说回调函数需要注意的几个步骤吧,首先要声明一......
  • MATLAB中的函数句柄 理解
    #MATLAB中的函数句柄理解https://zhuanlan.zhihu.com/p/266263265##1、何为函数句柄?函数句柄也是MATLAB中的一种常见的数据类型,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++),或者函数引用(Perl)。它的作用是将一个函数封装成一个变量,使其能够像其......