引用 s函数
- 格式:docx
- 大小:22.10 KB
- 文档页数:10
simulink的s函数Simulink是一种广泛使用的MATLAB工具箱,用于建模、仿真和分析复杂的系统。
S函数是Simulink中最常用的自定义函数之一,它允许用户使用C或C++编写自己的代码,并将其集成到Simulink模型中。
本文将介绍S函数的基本概念、使用方法和注意事项,并提供一个全面详细的函数示例。
一、S函数概述1.1 S函数定义S函数是一种特殊类型的Simulink块,它允许用户使用C或C++编写自己的代码,并将其嵌入到Simulink模型中。
S函数可以执行各种任务,例如数据处理、控制算法实现、硬件接口等。
1.2 S函数分类根据功能和实现方式,S函数可以分为以下几类:(1)输入输出型:用于处理输入信号并生成输出信号。
(2)状态存储型:用于存储状态变量,并在每个时间步骤更新状态变量。
(3)参数传递型:用于传递参数值给其他块或子系统。
(4)事件触发型:在特定条件下触发某些事件或操作。
1.3 S函数优点相对于其他类型的Simulink块,S函数具有以下优点:(1)可定制性高:用户可以根据需要编写自己的代码,实现各种功能。
(2)计算速度快:由于S函数使用C或C++编写,因此可以利用底层硬件资源,提高计算速度。
(3)适用范围广:S函数可以处理各种类型的数据和信号,并与其他Simulink块无缝集成。
二、S函数使用方法2.1 S函数创建在Simulink中创建S函数的步骤如下:(1)打开Simulink模型(2)从“Simulink库浏览器”中选择“User-Defined Fun ctions”类别(3)选择“S-Function”块并拖动到模型中2.2 S函数参数设置在创建S函数后,用户需要设置一些参数以定义其行为。
常见的参数包括:(1)输入端口数和数据类型(2)输出端口数和数据类型(3)状态变量数和数据类型(4)参数变量数和默认值2.3 S函数代码编写完成参数设置后,用户需要编写自己的代码以实现所需功能。
S函数是system Function的简称,用它来写自己的simulink模块。
(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。
在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。
它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag 的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0;%模块连续状态变量的个数sizes.NumDiscStates = 0;%模块离散状态变量的个数sizes.NumOutputs = 0;%模块输出变量的个数sizes.NumInputs = 0;%模块输入变量的个数sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能直接控制输出)sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*u x(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为:(一般连续状态与离散状态不会一块用,我这儿是为了方便说明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不变。
S函数(system function)是模块的核心,是完成功能实现的关键。
S函数的编写可以使用多种程序语言,其中M语言是最常用的,同时也是最简单的。
在运用M语言进行s函数编写的时候,可以调用MATLAB提供的函数,简化了开发过程。
但是如果要与其他进程通讯或驱动外部硬件接口,则要调用API函数,这样就需要用C语言来开发S函数。
较M语言的开发,C语言开发S函数更具有灵活性,但是相对复杂一些。
C语言写S函数,顾名思义,运用C语言语法,依照S函数格式要求,最后在MATLAB中MEX命令编译,编译成功既得函数。
S函数格式可简单看成:初始化、采样时间设定、系统输出、结束四个部分。
对应的函数分别为mdlInitializeSizes()、mdlInitializeSampleTimes()、mdlOutputs()、mdlTerminate()。
这四个函数是一个S函数必不可少的,缺少任何一个在编译的时候都无法通过,输出信息会提示哪个函数没有写。
一个最基本的C语言S函数模版如下:#define S_FUNCTION_NAME name#define S_FUNCTION_LEVEL 2#include “simstruc.h”Static void mdlInitializeSizes(SimStruct *S){}Static void mdlInitializeSampleTimes(SimStruct *S){}Static void mdlOutputs(SimStruct *S,int_T tid){}Static void mdlTerminate(SimStruct *S){}#ifdef MATLAB_MEX_FILE#include “Simulink.c”#else#include “cg_sfun.h”#endifS函数的运行依托于Simulink,Simulink的运行是采用循环方式,计算各采样时间点的系统状态得到的,由此可理解S函数,在初始化之后,S函数也通过循环完成输出状态计算。
s函数是system Function的简称,用它来写自己的simulink模块。
(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。
在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。
它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag)先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag 是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates = 0;%模块连续状态变量的个数sizes.NumDiscStates = 0;%模块离散状态变量的个数sizes.NumOutputs = 0;%模块输出变量的个数sizes.NumInputs = 0;%模块输入变量的个数sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能%直接控制输出)sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为:(一般连续状态与离散状态不会一块用,我这儿是为了方便说明)sizes.NumContStates=1;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.NumInputs=1;其他的可以不变。
s function c代码标准模板S函数是一种常用的非线性函数,它经常在系统建模、数据拟合和优化等领域中使用。
在C代码中,我们可以通过定义一个函数来实现S函数的功能。
本文将介绍如何使用C语言实现S函数的标准模板。
标准的S函数模板可以通过以下代码实现:```c#include <math.h>double sFunction(double x, double a, double b){return 1 / (1 + exp(-a * (x - b)));}```这段代码定义了一个名为" sFunction "的函数,接受三个参数:x、a和b。
其中,x表示输入变量,而a和b则是S函数的参数。
函数的返回值为S函数的计算结果。
函数的实现主要依赖于C语言的数学库" math.h "中的指数函数" exp "。
在实际应用中,我们可以根据具体需求对S函数的参数进行调整,从而得到不同形状和范围的曲线。
下面是一个简单的示例,演示了如何使用这个S函数来计算给定输入变量x的输出值:```c#include <stdio.h>int main(){double x = 2.0;double a = 1.0;double b = 0.0;double result = sFunction(x, a, b);printf("S function result: %f\n", result);return 0;}```在这个示例中,我们将输入变量x设置为2.0,参数a设置为1.0,参数b设置为0.0。
然后,我们调用sFunction函数来计算S函数的输出值,并通过printf函数将结果打印到屏幕上。
编译并运行上述代码,我们可以得到如下输出:```S function result: 0.880797```这是根据给定的输入变量x和S函数参数计算出的S函数结果。
scanf_s怎么用scanf_s是一个C语言中的输入函数,用于从标准输入流(例如键盘)中读取数据。
它的使用方法如下:包含头文件:在代码中需要包含头文件<stdio.h>或<stdio.h>,以便使用scanf_s函数。
声明变量:在使用scanf_s函数之前,需要先声明一个或多个变量来存储读取的数据。
调用scanf_s函数:使用scanf_s函数来读取用户输入的数据。
函数的语法如下:c复制代码scanf_s(const char*format, ...);其中,format是一个C格式字符串,用于指定如何读取输入数据;省略号(...)表示可以传入任意数量和类型的参数,这些参数会与格式字符串中的占位符一一对应。
4. 指定占位符和变量:在格式字符串中,可以使用占位符来指定要读取的数据类型和格式。
例如,%d表示读取一个整数,%f表示读取一个浮点数,%c表示读取一个字符等。
同时,需要指定相应的变量来存储读取的数据。
5. 读取数据:执行scanf_s函数后,程序将从标准输入流中读取用户输入的数据,并将数据存储在指定的变量中。
6. 处理返回值:scanf_s函数的返回值是成功读取的数据项数量。
如果返回值为0,则表示没有成功读取任何数据项;如果返回值为-1,则表示在读取过程中出现了错误或到达了输入流的结尾。
下面是一个示例代码,演示了如何使用scanf_s函数来读取用户输入的整数和浮点数:c复制代码#include<stdio.h>int main() {int num1, num2;float floatNum;printf("请输入两个整数和一个浮点数:");scanf_s("%d %d %f", &num1, &num2,&floatNum);printf("您输入的整数是:%d 和%d\n", num1, num2);printf("您输入的浮点数是:%f\n", floatNum);return0;}在上面的示例中,我们声明了三个变量num1、num2和floatNum,并使用scanf_s函数来读取用户输入的两个整数和一个浮点数。
Excel中sheets函数的工作表计数技巧Excel中的sheets函数是一种用于计算工作表数量的强大工具。
本文将介绍sheets函数的用法和一些技巧,帮助读者更好地利用Excel进行数据处理和分析。
1. 了解sheets函数在Excel中,sheets函数用于返回工作簿中工作表的数量。
其基本语法为:=sheets(引用)引用可以是一个工作簿名、工作簿路径、文件名,也可以是一个包含工作表的引用。
当引用为空时,函数将返回活动工作簿中的工作表数量。
2. 使用sheets函数计算工作表数量可以通过简单的步骤来使用sheets函数计算工作表数量。
首先,在一个单元格中输入=sheets(),然后输入左右括号之间的引用。
例如,如果要计算工作簿中工作表的数量,可以输入=sheets(),然后在括号中输入工作簿的引用。
如果希望计算当前活动工作簿中的工作表数量,可以直接使用=sheets(),不需要在括号中输入引用。
3. 计算具体工作表范围的数量除了计算整个工作簿中的工作表数量,还可以使用sheets函数计算特定范围内工作表的数量。
例如,如果要计算工作簿中第1个工作表到第5个工作表之间的工作表数量,可以输入=sheets($A$1:$E$1),其中A1是第1个工作表的名称,E1是第5个工作表的名称。
4. 嵌套函数实现更多功能sheets函数还可以与其他函数嵌套使用,实现更多功能。
例如,可以将sheets函数与if函数嵌套,实现根据工作表数量进行条件判断。
=if(sheets()>10,"工作表数量大于10","工作表数量小于等于10")这将根据工作表数量进行判断,如果工作表数量大于10,单元格显示"工作表数量大于10",否则显示"工作表数量小于等于10"。
5. 数字格式化在使用sheets函数时,需要注意数字格式化的问题。
默认情况下,sheets函数返回的结果是一个数字。
s型函数性质
S型函数(Sigmoid function)是BP神经网络中常用的非线性作用函数,即sigmoid函数,公式是f(x)=1/(1+e^-x)(-x是幂数)。
Sigmoid函数又分为Log-Sigmoid函数和Tan-Sigmoid函数。
中文名
S形函数
外文名
Sigmoid function
由于BP神经网络的传递函数必须可微,所以感知器的传递函数--二值函数在这里不可用,故BP神经网络一般使用Sigmoid函数或者线性函数作为传递函数。
而Sigmoid函数又分为Log-Sigmoid函数(一般所说的S型函数就是这个的简称)和Tan-Sigmoid函数(又称为双曲正切S型函数),前者的值域为(0,1),后者的值域为(-1,1)。
Log-Sigmoid函数的表达式:
Log-Sigmoid函数的导数:
Tan-Sigmoid函数的表达式:
Tan-Sigmoid函数的导数:
这两个函数都是连续的、单调递增的数值函数,常被应用于基于BP(误差反向传播)算法的神经网络中。
一般情况下,BP神经网络隐含层的传递函数是S形函数,输出层是线性函数。
当然,输出层也可采用S型函数,若输出层为S型函数,则输出值的范围为该S型函数的值域。
利用S形函数或其导数可以求得BP神经网络里某个神经元的总和、目标值和误差值等。
S函数的简介及编写摘自恒润科技S-function的编写1. S函数模板编辑环境进入:在MATLAB主界面中直接输入:edit sfuntmpl即可弹出S函数模板编辑的M文件环境,修改即可。
在MATLAB主界面中直接输入:sfundemos,即可调出S 函数的许多编程例子。
2. S函数模板的相关基础:1)M文件S函数的引导语句为:xtflagfuFunction[psysxstrtsp,,12,...),,,0,],(,S函数默认的四个输入参数:t ,x ,u ,flagS函数默认的四个输出函数:sys ,x0 ,str ,ts各个参数的含义如下:T :代表当前的仿真时间,该输入决定了下一个采样时间;X :表示状态向量,行向量,引用格式:X(1),X(2)U :表示输入向量;Flag :控制在每一个仿真阶段调用哪一个子函数的参数,由SIMULINK在调用时自动取值;Sys :通用的返回变量,返回的数值决定Flag值,mdlUpdates里:列向量,引用格式:Sys(1,1),Sys(2,1);mdlOutputs里:行向量,引用格式:Sys =x、X0 :初始的状态值;列向量,引用格式:X0=[ 0;0;0 ]Str :空矩阵,无具体含义;Ts :包含模块采样时间与偏差的矩阵。
[period, offset]当Ts为-1时,表示与输入信号同采样周期。
2)S函数工作方式:Flag = 0时,调用mdlInitializeSizes函数,定义S函数的基本特性,包括采样时间,连续或者离散状态的初始条件与Sizes数组;Flag = 1时,调用mdlDerivatives函数,计算连续状态变量的微分方程;求所给表达式的等号左边状态变量的积分值的过程。
Flag = 2时,调用mdlUpdate函数,用于更新离散状态,采样时间与主时间步的要求;Flag = 3时,调用mdlOutputs函数,计算S函数的输出;Flag = 4时,调用mdlGetTimeOfNextVarHit函数,计算下一个采样点的绝对时间,这个方法仅仅就是使用户在mdlInitializeSize 里说明一个可变的离散采样时间;Flag = 9时,调用mdlTerminate函数,实现仿真任务的结束。
引用s函数MATLAB 2010-09-25 20:22:07 阅读52 评论0 字号:大中小订阅引用lb2782791 的 s函数s函数是system Function的简称,用它来写自己的simulink模块。
(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab 语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API 等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:第一个为初始化,这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;第二个阶段就是运行阶段,这个阶段里要进行计算输出、更新离散状态、计算连续状态等等,这个阶段需要反复运行,直至结束。
在matlab的workspace里打edit sfuntmpl(这是matlab自己提供的s函数模板),我们看它来具体分析s函数的结构。
它的第一行是这样的:function [sys,x0,str,ts]=sfuntmpl(t,x,u,flag) 先讲输入与输出变量的含义:t是采样时间,x是状态变量,u是输入(是做成simulink模块的输入),flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义),x0是状态变量的初始值,str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
下面结合sfuntmpl.m中的代码来讲具体的结构:switch flag, %判断flag,看当前处于哪个状态case 0,[sys,x0,str,ts]=mdlInitializeSizes;flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化,此函数在sfuntmpl.m的149行我们找到他,在初始化状态下,sys是一个结构体,用它来设置模块的一些参数,各个参数详细说明如下size = simsizes;%用于设置模块参数的结构体用simsizes来生成 sizes.NumContStates = 0;%模块连续状态变量的个数sizes.NumDiscStates = 0;%模块离散状态变量的个数sizes.NumOutputs = 0;%模块输出变量的个数sizes.NumInputs = 0;%模块输入变量的个数sizes.DirFeedthrough = 1;%模块是否存在直接贯通(直接贯通我的理解是输入能直接控制输出)sizes.NumSampleTimes = 1;%模块的采样时间个数,至少是一个 sys = simsizes(sizes); %设置完后赋给sys输出举个例子,考虑如下模型:dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*ux(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为:(一般连续状态与离散状态不会一块用,我这儿是为了方便说明)sizes.NumC;sizes.NumDiscStates=1;sizes.NumOutputs=1;sizes.N umInputs=1;其他的可以不变。
继续在mdlInitializeSizes函数中往下看:x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=[0,0](离散和连续的状态%变量我们都设它初值为0str = []; %这个就不用说了,保留参数嘛,置[]就可以了,反正没什么用,可能7.0会给它一些意义ts = [0 0]; %采样周期设为0表示是连续系统,如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍嘻嘻,总算讲完了初始化,后面的应该快了在sfuntmpl的106行继续往下看:case 1,sys=mdlDerivatives(t,x,u);flag=1表示此时要计算连续状态的微分,即上面提到的dx/dt=fc(t,x,u)中的dx/dt,找到mdlDerivatives函数(在193行)如果设置连续状态变量个数为0,此处只需sys=[];就可以了(如sfuntmpl中一样),按我们上述讨论的那个模型,此处改成sys=fc(t,x(1),u)或sys=A*x(1)+B*u %我们这儿x(1)是连续状态变量,而x(2)是离散的,这儿只用到连续的,此时的输出sys就是微分继续,在sfuntmpl的112行:case 2,sys=mdlUpdate(t,x,u);flag=2表示此时要计算下一个离散状态,即上面提到的x(k+1)=fd(t,x,u),找到mdlUpdate函数(在206行)它这儿sys=[];表示没有离散状态,我们这而可以改成sys=fd(t,x(2),u)或sys=H*x(2)+G*u;%sys即为x(k+1)看来后面几个一两句话就可了,呵呵,在sfuntmpl的118行case 3,sys=mdlOutputs(t,x,u);flag=3表示此时要计算输出,即y=fo(t,x,u),找到mdlOutputs函数(在218行),如上,如果sys=[]表示没有输出,我们改成sys=fo(t,x,u)或sys=C*x+D*u %sys此时为输出y好像快完了,嘻嘻,在sfuntmpl的124行case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);flag=4表示此时要计算下一次采样的时间,只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0)连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[];这个函数主要用于变步长的设置,具体实现大家可以用edit vsfunc看vsfunc.m这个例子最后一个,在sfuntmpl的130行case 9,sys=mdlTerminate(t,x,u);flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可,如果你在结束时还要设置什么,就在此函数中写^_^,可以松一口气了,关于sfuntmpl这个s函数的模板讲完了。
s函数还可以带用户参数,下面给个例子,和simulink下的gain模块功能一样,大伙自己看吧,我睡觉去了,累了function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)switch flag,case 0,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=[];ts=[0,0];case 3,sys=gain*u;case {1,2,4,9},sys = [];end做好了s函数后,simulink--user-defined function下拖一个S-Function到你的模型,就可以用了在simulink----user-defined function还有个s-Function Builder,他可以生成用c语言写的s函数在matlab的workspace下打sfundemos,可以看到很多演示s函数的程序。
SIMULINK s-的设计Simulink为用户提供了许多内置的基本库模块,通过这些模块进行连接而构成系统的模型。
对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块,但它依然是基于Simulink原来提供的内置模块。
而Simulink s-是一种强大的对模块库进行扩展的新工具。
(一)、s-的概念s-是一个动态系统的计算机语言描述,在MATLAB里,用户可以选择用m文件编写,也可以用c 或mex文件编写,在这里只给大家介绍如何用m文件编写s-。
S-提供了扩展Simulink模块库的有力工具,它采用一种特定的调用语法,使函数和Simulink解法器进行交互。
S-最广泛的用途是定制用户自己的Simulink模块。
它的形式十分通用,能够支持连续系统、离散系统和混合系统。
(二)、建立m文件s-1、使用模板文件:sfuntmp1. m 格式: [sys,x0]=(t,x,u,flag)该模板文件位于MATLAB根目录下toolbox/simulink/blocks目录下。
模板文件里s-的结构十分简单,它只为不同的flag的值指定要相应调用的m文件子函数。
比如当flag=3时,即模块处于计算输出这个仿真阶段时,相应调用的子函数为sys=mdloutputs(t,x,u)。
模板文件使用switch语句来完成这种指定,当然这种结构并不唯一,用户也可以使用if语句来完成同样的功能。
而且在实际运用时,可以根据实际需要来去掉某些值,因为并不是每个模块都需要经过所有的子函数调用。
模板文件只是Simulink 为方便用户而提供的一种参考格式,并不是编写s-的语法要求,用户完全可以改变子函数的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方便,而且条理清晰。
使用模板编写s-,用户只需把s-函数名换成期望的函数名称,如果需要额外的输入参量,还需在输入参数列表的后面增加这些参数,因为前面的4个参数是simulink调用s-时自动传入的。
对于输出参数,最好不做修改。
接下去的工作就是根据所编s-要完成的任务,用相应的代码去替代模板里各个子函数的代码即可。
Simulink在每个仿真阶段都会对s-进行调用,在调用时,Simulink会根据所处的仿真阶段为flag传入不同的值,而且还会为sys这个返回参数指定不同的角色,也就是说尽管是相同的sys变量,但在不同的仿真阶段其意义却不相同,这种变化由simulink 自动完成。