S函数笔记

1 篇文章 0 订阅
1 篇文章 0 订阅

S函数示例

function [sys, x0, str, ts]=mysin(t,x,u,flag,Amp,Freq,Phase)
switch flag,
    case 0
        [sys, x0,str, ts]=mdlInitializeSizes;
    case 3
        sys = mdlOutputs(t, Amp, Freq, Phase);
    case {1,2,4,9}
        sys=[];
    otherwise
        error(['Unhandle flag=', num2str(flag)]);
end

function [sys, x0, str, ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;  %连续系统的状态数
sizes.NumDiscStates=0;  %离散系统的状态数
sizes.NumOutputs=1;     %输出信号的数目
sizes.NumInputs=0;      %输入信号的数目
sizes.DirFeedthrough=0; %设置系统为直通
sizes.NumSampleTimes=1; %必须为1
sys=simsizes(sizes);
str=[];
x0=[];
ts=[0,0];
function sys=mdlOutputs(t, Amp, Freq, Phase)
sys=Amp*sin(2*pi*Freq*t+Phase);%方程的形式

说明:
1、这里是定义一个S函数mysin,该函数功能是自制的波形发生器;
2、mysin是主函数,其参数有t, x, u, flag与Amp, Freq, Phase;
2.1 参数t为simulink用于仿真的时间变量,t为参数名,不能写成其他的,比如说time,都是错误的,t可以理解成系统定义的关键字;
2.2 参数x是状态向量,不是常规理解的横坐标,也不是函数输入,x为系统定义的关键字;
2.3 参数u是输入向量,也为系统定义的关键字,不能写成其他的,如input之类的;
2.4 Amp, Freq, Phase是自己设定的参数,此处表示振幅、频率和相位;
3、flag表示系统执行的阶段
3.1 flag为0:初试化阶段,调用初始化函数,初始化函数常用mdlInitializeSizes命名,因此该阶段内容一般是

[sys,x0,str,ts]=mdlInitializeSizes;

3.2 flag为1:连续类型函数求导过程,求导函数常用mdlDerivatives命名,该阶段内容一般是

sys=mdlDerivatives(t,x,u);

如果s函数是离散函数,或者不需要用到求导就可以得到结果,则该阶段不用,可以其内容可以为

sys=[];

3.3 flag为2:离散类型函数推演过程,推演函数常用mdlUpdate命名,该阶段内容一般是

sys=mdlUpdate(t,x,u);

如果s函数是连续函数,或者不需要用到推演就可以得到结果,则该阶段不用,可以其内容可以为

sys=[];

3.4 flag为3:计算输出的过程,输出函数常用mdlOutputs命名,该阶段内容一般是

sys=mdlOutputs(t,x,u);

3.5 flag为4:计算下一步采样时间,计算采用时间函数常用mdlGetTimeOfNextVarHit命名,该阶段内容一般是

sys=mdlGetTimeOfNextVarHit(t,x,u);

该阶段一般用在变步长的仿真过程,如果没用到变步长,其内容可为

sys=[];

3.5 flag为9:结束阶段,结束函数常用mdlTerminate命名。该极端内容为

sys=mdlTerminate(t,x,u);

结束函数可能涉及到回收空间,内存释放等操作,如果不涉及这些操作,则该阶段内容可为

sys=[];

3.6 目前flag只限定了为0,1,2,3,4,9这些值,如果为其他值,可能程序跑飞了,那么最好用一个otherwise接住这个程序,并输出响应的错误

error(['Unhandle flag=', num2str(flag)]);

4、初试化函数mdlInitializeSizes,初试化函数主要是告知仿真器该s函数的类型,比如是连续类型还是离散类型,连续类型或离散类型又其输入个数、输出个数多少,状态向量的元素有多少个,输出有多少个等等。这些类型的信息系统用simsizes结构体定义,只要定义该结构体内部的元素的值就可,然后用simsizes()函数执行该类型的定义。

sizes=simsizes;
sizes.NumContStates=0;  %连续系统的状态数
sizes.NumDiscStates=0;  %离散系统的状态数
sizes.NumOutputs=1;     %输出信号的数目
sizes.NumInputs=0;      %输入信号的数目
sizes.DirFeedthrough=0; %设置系统为直通
sizes.NumSampleTimes=1; %必须为1
sys=simsizes(sizes);
str=[];
x0=[];
ts=[0,0];

注:str, x0, ts暂时也不知道含义,后续补充。
5、连续类型状态函数的求导可以视作为与时间、当前状态及输入的函数,即dx/dt=fc(t,x,u),数学上一般这么表示
在这里插入图片描述
求得导数后,新状态值为
在这里插入图片描述
注:本自制的波形发生器示例没用到求导过程。
6、离散类型状态函数的推演过程也可视为与时间、当前状态及输入的函数,即dx/dt=fd(t,x,u),数学上一般这么表示
在这里插入图片描述
k等效为时间,其实质是一段一段的时间单元,每个时间单元时长相同,k就是第k个时间单元。
注:本自制的波形发生器示例没用到推演过程
7、输出可视为与时间、当前状态、当前输入的函数,即 y=fo(t,x,u)。数学上一般这么表示
在这里插入图片描述
该输出计算方式对离散类型和连续类型都一样。如果没用用到连续类型函数的求导,也没用到离散类型函数的推演,那可以直接写出输出。如本自制的波形发生器示例就是直接输出

function sys=mdlOutputs(t, Amp, Freq, Phase)
sys=Amp*sin(2*pi*Freq*t+Phase);%方程的形式

在simulink的操作
1、拖入一个s函数模块。路径为Simulink/User-Defined Functions\S-Function。如图
在这里插入图片描述
2、编辑该模块的属性
在这里插入图片描述
最后的参数对话框为
在这里插入图片描述
此处输入的参数为振幅为2、频率为0.01,偏置为0
3、可拖如一个示波器查看仿真的波形
在这里插入图片描述
如果波形不正常可能是仿真参数的问题,可以按Ctrl+E调出Configuration Parameters对话框,设置仿真时长、步长的最大值最小值等参数。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值