matlab的M-文件 S-函数的标准模板
- 格式:doc
- 大小:31.00 KB
- 文档页数:5
matlab中s函数模板在Matlab中,s函数是一种用于执行数学运算和计算的函数模板,它提供了一种方便快捷的方式来实现各种数学运算和算法。
通过使用s函数模板,您可以轻松地编写自己的自定义函数,并将其集成到Matlab应用程序中。
本文将介绍Matlab中s函数模板的使用方法、示例和注意事项。
一、s函数模板概述Matlab中的s函数模板提供了一种灵活的编程方式,可以方便地实现各种数学运算和算法。
它基于Simulink的s-functionblock,允许您使用Matlab代码编写自定义函数,并将其嵌入到Simulink模型中。
s函数模板支持多种数据类型和运算符,包括矩阵运算、向量运算、三角函数、指数和对数等。
二、使用s函数模板要使用s函数模板,您需要按照以下步骤进行操作:1.编写Matlab代码实现所需的数学运算和算法。
确保代码具有可读性和可维护性,以便于后续的维护和扩展。
2.将Matlab代码保存为.m文件。
确保文件名以s开头,以表示它是s函数的模板。
3.在Simulink模型中添加s-functionblock,并指定要使用的s函数模板文件名。
4.根据需要配置s-functionblock的其他参数,如输入输出端口、数据类型等。
5.运行Simulink模型,即可使用s函数模板执行数学运算和计算。
三、示例以下是一个简单的示例,展示如何使用s函数模板实现矩阵求逆运算:1.编写Matlab代码实现矩阵求逆运算:```matlabfunctiony=inv_matrix(A)%矩阵求逆函数模板%输入:矩阵A(m*n)%输出:矩阵的逆(m*n)[m,n]=size(A);y=eye(m)-A*A';end```2.将上述代码保存为s函数模板文件inv_matrix.m。
3.在Simulink模型中添加s-functionblock,并指定inv_matrix.m为s函数模板文件名。
4.根据需要配置s-functionblock的其他参数,如输入输出端口、数据类型等。
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函数是system Function的简称,用它来写自己的simulink模块.(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较简单)先讲讲为什么要用s函数,我觉得用s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作,还可以操作windows API等的先介绍一下simulink的仿真过程(以便理解s函数),simulink的仿真有两个阶段:1.初始化:这个阶段主要是设置一些参数,像系统的输入输出个数、状态初值、采样时间等;2.运行阶段:这个阶段里要进行计算输出、更新离散状态、计算连续状态等等。
这个阶段需要反复运行,直至结束.在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。
函数是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;其他的可以不变。
function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)
% SFUNTMPL 是M-文件S函数模板
% 通过剪裁,用户可以生成自己的S函数,不过一定要重新命名
% 利用S函数可以生成连续、离散混合系统等,实现任何模块的功能%
% M-文件S函数的语法为:
% [SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn)
%
% 参数含义:
% t是当前时间
% x是S函数相应的状态向量
% u是模块的输入
% flag是所要执行的任务
%
% FLAG 结果功能
% ----- ------ --------------------------------------------
% 0 [SIZES,X0,STR,TS] 模块初始化
% 1 DX 计算模块导数
% 2 DS 更新模块离散状态
% 3 Y 计算模块输出
% 4 TNEXT 计算下一个采样时间点
% 9 [] 结束仿真
%
%
% 用户切勿改动输出参数的顺序、名称和数目
% 输入参数的数目不能小于1,这四个参数的名称和排列顺序不能改动
% 用户可以根据自己的要求添加额外的参数,位置依次为第5,6,7,8,9等。
% S函数的flag参数是一个标记变量,具有6个不同值,分别为0,1,2,3,4,9
% flag的6个值分别指向6个不同的子函数
% flag所指向的子函数也成为回调方法(Callback Methods)
switch flag,
%初始化,调用“模块初始化”子程序%
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%连续状态变量计算,调用“计算模块导数”子函数%
case 1,
sys=mdlDerivatives(t,x,u);
%更新,调用“更新模块离散状态”子函数%
case 2,
sys=mdlUpdate(t,x,u);
%输出,调用“计算模块输出”子函数%
case 3,
sys=mdlOutputs(t,x,u);
%计算下一时刻采样点,调用“计算下一个采样时刻点”子函数%
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
%结束,调用“结束仿真”子函数%
case 9,
sys=mdlTerminate(t,x,u);
%其他的flag%
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
% end sfuntmpl
%============================================================================= % “模块初始化”子函数
% 返回大小、初始条件和样本
function [sys,x0,str,ts]=mdlInitializeSizes
% 调用simsizes函数,返回规范格式的sizes构架
% 这条指令不要修改
sizes = simsizes;
% 模块的连续状态个数,0是默认值
% 用户可以根据自己的要求进行修改
sizes.NumContStates = 0;
% 模块的离散状态个数,0是默认值
% 用户可以根据自己的要求进行修改
sizes.NumDiscStates = 0;
% 模块的输出个数,0是默认值
% 用户可以根据自己的要求进行修改
sizes.NumOutputs = 0;
% 模块的输入个数,0是默认值
% 用户可以根据自己的要求进行修改
sizes.NumInputs = 0;
% 模块中包含的直通前向馈路个数,1是默认值
% 用户可以根据自己的要求进行修改
sizes.DirFeedthrough = 1;
% 模块中采样时间的个数,1是默认值,至少需要一个样本时间
% 用户可以根据自己的要求进行修改
sizes.NumSampleTimes = 1;
% 初始化后的构架sizes经simsizes函数处理后向sys赋值
% 这条指令不要修改
sys = simsizes(sizes);
% 给模块初始值变量赋值,[]是默认值
% 用户可以根据自己的要求进行修改
x0 = [];
% 系统保留变量
% 切勿改动,保持为空
str = [];
% “二元对”描述采样时间及偏移量。
[0 0]是默认值
% [0 0]适用于连续系统
% [-1 0]则表示该模块采样时间继承其前的模块采样时间设置
ts = [0 0];
% end mdlInitializeSizes
%============================================================================= % 计算导数向量
function sys=mdlDerivatives(t,x,u)
% 此处填写计算导数向量的指令
% []是模块的默认值
% 用户必须把算得的离散状态的导数向量赋给sys
sys = [];
% end mdlDerivatives
%============================================================================= % 计算离散状态向量
function sys=mdlUpdate(t,x,u)
% 此处填写计算离散状态向量的指令
% []是模块的默认值
% 用户必须把算得的离散状态向量赋给sys
sys = [];
% end mdlUpdate
%============================================================================= % 计算模块输出向量
function sys=mdlOutputs(t,x,u)
% 此处填写计算模块输出向量的指令
% []是模块的默认值
% 用户必须把算得的模块输出向量赋给sys
sys = [];
% end mdlOutputs
%============================================================================= % 计算下一采样时刻
function sys=mdlGetTimeOfNextVarHit(t,x,u)
% 该子函数仅在“采样时间”情况下使用
% sampleTime = 1 是模块默认设置,表示在当前时间1秒后再调用本模块
% 用户可以根据自己的要求修改
sampleTime = 1;
% 将计算得到的下一采样时刻赋给sys
% 切勿改动
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit
%============================================================================= function sys=mdlTerminate(t,x,u)
% 模板默认设置,一般情况不要改动
sys = [];
% end mdlTerminate。