使用M语言编写S-函数,使用模板来编写。

M文件主函数格式

%[sys,x0,str,ts]=f(t,x,u,flag,p1,p1,...)%f为函数名,与文件名相同

%sys是某个子函数的返回值,取决也flag
%x0为所有状态的初始化向量,只有在flag=0时使用
%str为空矩阵,
%ts为采样时间,采样时间和偏移时间
%   [0 0]每个时间步都运行S-函数
%   [-1 0]使S——函数和被连接的模块一相同时速率运行
%   [0.3 0.5]从0.5s和以0.3s的速度采样
%t为当前时间,
%x为状态向量,
%u为输入,
%flag是运行过程中的标志位,

%p1,p1...为附加值

子函数说明

function [sys,x0,str,ts]=sfun_mix(t,x,u,flag)
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=mdlGetNextTimeVarHit(t,x,u);计算下一采样点
    case 9,
        sys=mdlTerminate(t,x,u);%终止仿真
    otherwise 
        error(['Unhandled flag=',num2str(flag)]);

end

初始化定义说明

sizes.NumContStates=1;%连续变量个数
sizes.NumDiscStates=1;%离散变量个数
sizes.NumOutputs=1;%输出个数
sizes.NumInputs=1;%输入个数
sizes.DirFeedthrough=0;%直接贯通,0或1,当时输出值直接依赖于同一时刻的输入时为1
sizes.NumSampleTimes=2;%采样时间

实例:

1.信号放大两倍

%[sys,x0,str,ts]=f(t,x,u,flag,p1,p1,...)
%sys是某个子函数的返回值,取决也flag
%x0为所有状态的初始化向量,只有在flag=0时使用
%str为空矩阵,
%ts为采样时间,采样时间和偏移时间
%  [0 0]每个时间步都运行S-函数
%  [-1 0]使S——函数和被连接的模块一相同时速率运行
%  [0.25 0.1]从0.1s和以0.25s的速度采样
%t为当前时间,
%x为状态向量,
%u为输入,
%flag是运行过程中的标志位,
%p1,p1...为附加值function [sys,x0,str,ts]=timestwo(t,x,u,flag)
switch flagcase 0[sys,x0,str,ts]=mdlInitializeSizes;case 3sys=mdlOutputs(t,x,u);case{1,2,4,9}sys=[];otherwise error(['Unhandled flag=',num2str(flag)]);
endfunction [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;%返回一个变量,
sizes.NumContStates=0;%连续变量个数
sizes.NumDiscStates=0;%离散变量个数
sizes.NumOutputs=1;%输出个数
sizes.NumInputs=1;%输入个数
sizes.DirFeedthrough=1;%直接贯通,0或1,当时输出值直接依赖于同一时刻的输入时为1
sizes.NumSampleTimes=1;%采样时间
sys=simsizes(sizes);%返回值
x0=[];
str=[];
ts=[-1 0];function sys=mdlOutputs(t,x,u)
sys=2*u;

2.增益可变

%[sys,x0,str,ts]=f(t,x,u,flag,p1,p1,...)
%sys是某个子函数的返回值,取决也flag
%x0为所有状态的初始化向量,只有在flag=0时使用
%str为空矩阵,
%ts为采样时间,采样时间和偏移时间
%  [0 0]每个时间步都运行S-函数
%  [-1 0]使S——函数和被连接的模块一相同时速率运行
%  [0.25 0.1]从0.1s和以0.25s的速度采样
%t为当前时间,
%x为状态向量,
%u为输入,
%flag是运行过程中的标志位,
%p1,p1...为附加值function [sys,x0,str,ts]=sfun_vargain(t,x,u,flag,gain)
switch flagcase 0[sys,x0,str,ts]=mdlInitializeSizes;case 3sys=mdlOutputs(t,x,u,gain);case{1,2,4,9}sys=[];otherwise error(['Unhandled flag=',num2str(flag)]);
endfunction [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;%返回一个变量,
sizes.NumContStates=0;%连续变量个数
sizes.NumDiscStates=0;%离散变量个数
sizes.NumOutputs=1;%输出个数
sizes.NumInputs=1;%输入个数
sizes.DirFeedthrough=1;%直接贯通,0或1,当时输出值直接依赖于同一时刻的输入时为1
sizes.NumSampleTimes=1;%采样时间
sys=simsizes(sizes);%返回值
x0=[];
str=[];
ts=[-1 0];function sys=mdlOutputs(t,x,u,gain)
sys=gain*u;

3.积分器

%[sys,x0,str,ts]=f(t,x,u,flag,p1,p1,...)
%sys是某个子函数的返回值,取决也flag
%x0为所有状态的初始化向量,只有在flag=0时使用
%str为空矩阵,
%ts为采样时间,采样时间和偏移时间
%  [0 0]每个时间步都运行S-函数
%  [-1 0]使S——函数和被连接的模块一相同时速率运行
%  [0.25 0.1]从0.1s和以0.25s的速度采样
%t为当前时间,
%x为状态向量,
%u为输入,
%flag是运行过程中的标志位,
%p1,p1...为附加值%x'=u
%y=x
function [sys,x0,str,ts]=sfun_int(t,x,u,flag,initial_state)
switch flagcase 0[sys,x0,str,ts]=mdlInitializeSizes(initial_state);case 3sys=mdlOutputs(t,x,u);case 1sys=mdlDerivatives(t,x,u);case{2,4,9}sys=[];otherwise error(['Unhandled flag=',num2str(flag)]);
endfunction [sys,x0,str,ts]=mdlInitializeSizes(initial_state)
sizes=simsizes;%返回一个变量,
sizes.NumContStates=1;%连续变量个数
sizes.NumDiscStates=0;%离散变量个数
sizes.NumOutputs=1;%输出个数
sizes.NumInputs=1;%输入个数
sizes.DirFeedthrough=1;%直接贯通,0或1,当时输出值直接依赖于同一时刻的输入时为1
sizes.NumSampleTimes=1;%采样时间
sys=simsizes(sizes);%返回值
x0=[initial_state];
str=[];
ts=[-1 0];function sys=mdlDerivatives(t,x,u)
sys=[u];function sys=mdlOutputs(t,x,u)
sys=x;

4.蹦极系统(多状态)

k=5,a1=1,a2=1,g=10,h为离地面的高度,输入参数为长度、质量、离地面高度

%[sys,x0,str,ts]=f(t,x,u,flag,p1,p1,...)
%sys是某个子函数的返回值,取决也flag
%x0为所有状态的初始化向量,只有在flag=0时使用
%str为空矩阵,
%ts为采样时间,采样时间和偏移时间
%  [0 0]每个时间步都运行S-函数
%  [-1 0]使S——函数和被连接的模块一相同时速率运行
%  [0.25 0.1]从0.1s和以0.25s的速度采样
%t为当前时间,
%x为状态向量,
%u为输入,
%flag是运行过程中的标志位,
%p1,p1...为附加值function [sys,x0,str,ts]=sfun_bungee(t,x,u,flag,len,weight,dist_ground)
k=5;a1=1;a2=1;g=10;
switch flagcase 0,[sys,x0,str,ts]=mdlInitializeSizes(len);case 1,sys=mdlDerivatives(t,x,u,weight,k,a1,a2,g);case 2,sys=mdlUpdate(t,x,u);case 3,sys=mdlOutputs(t,x,u,dist_ground);case 4,sys=mdlGetTimeOfNextVarHit(t,u,x);case 9,sys=mdlTerminate(t,x,u);otherwise error(['Unhandled flag=',num2str(flag)]);
endfunction [sys,x0,str,ts]=mdlInitializeSizes(len)
sizes=simsizes;%返回一个变量,
sizes.NumContStates=2;%连续变量个数
sizes.NumDiscStates=0;%离散变量个数
sizes.NumOutputs=1;%输出个数
sizes.NumInputs=0;%输入个数
sizes.DirFeedthrough=0;%直接贯通,0或1,当时输出值直接依赖于同一时刻的输入时为1
sizes.NumSampleTimes=1;%采样时间
sys=simsizes(sizes);%返回值
x0=[-len;1];
str=[];
ts=[0 0];function sys=mdlDerivatives(t,x,u,weight,k,a1,a2,g)
if x(1)<0b=0;
else b=-k*x(1);
end
x1dot=x(2);
x2dot=1/weight*(weight*g+b-a1*x(2)-a2*abs(x(2))*x(2));
sys=[x1dot;x2dot];function sys=mdlUpdate(t,x,u)
sys=[];function sys=mdlOutputs(t,x,u,dist_ground)
sys=dist_ground-x(1);function sys=mdlGetTimeOfNextVarHit(t,x,u)
%sampleTime=10;
%sys=t+sampleTime;
sys=[];function sys=mdlTerminate(t,x,u)
sys=[];

5.离散状态

%[sys,x0,str,ts]=f(t,x,u,flag,p1,p1,...)
%sys是某个子函数的返回值,取决也flag
%x0为所有状态的初始化向量,只有在flag=0时使用
%str为空矩阵,
%ts为采样时间,采样时间和偏移时间
%  [0 0]每个时间步都运行S-函数
%  [-1 0]使S——函数和被连接的模块一相同时速率运行
%  [0.25 0.1]从0.1s和以0.25s的速度采样
%t为当前时间,
%x为状态向量,
%u为输入,
%flag是运行过程中的标志位,
%p1,p1...为附加值function [sys,x0,str,ts]=sfun_und(t,x,u,flag)
switch flagcase 0,[sys,x0,str,ts]=mdlInitializeSizes;case 2,sys=mdlUpdate(t,x,u);case 3,sys=mdlOutputs(t,x,u);case 9,sys=[];otherwise error(['Unhandled flag=',num2str(flag)]);
endfunction [sys,x0,str,ts]=mdlInitializeSizes(len)
sizes=simsizes;%返回一个变量,
sizes.NumContStates=0;%连续变量个数
sizes.NumDiscStates=1;%离散变量个数
sizes.NumOutputs=1;%输出个数
sizes.NumInputs=1;%输入个数
sizes.DirFeedthrough=0;%直接贯通,0或1,当时输出值直接依赖于同一时刻的输入时为1
sizes.NumSampleTimes=1;%采样时间
sys=simsizes(sizes);%返回值
x0=0;
str=[];
ts=[0.1 0];function sys=mdlUpdate(t,x,u)
sys=u;function sys=mdlOutputs(t,x,u)
sys=x;

参考资料:

simulink动态系统建模与仿真

[MATLAB]S函数相关推荐

  1. matlab matlabpool,Matlab matlabpool函数undefined

    我尝试使用matlab并行计算功能. 我先输入"版本"来检查,如果我已经安装了并行计算工具箱,它确实Matlab matlabpool函数undefined >> ve ...

  2. MATLAB常用函数, 常见问题

    MATLAB常用函数 1.常用取整函数 round(x):四舍五入函数 floor(x) : 向下取整, 即 floor(1.2)=1,  floor(1.8) = 1 ceil(x) : 向上取整, ...

  3. matlab doc函数,matlab常用函数.doc

    matlab常用函数.doc MatLab 常用函数 1. 特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 name ...

  4. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同

    为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...

  5. matlab 数学库,matlab数学函数库

    (n) 求 n 的阶乘 如何用 matlab 配方 没有发现 matlab 有这一命令,不过我们可以调用 maple 的命令,调用方法如下: 首先加载 maple 中的 student 函数库,加载. ...

  6. matlab freqz函数使用

    Matlab freqz函数使用 (2012-10-22 13:42:03) 转载▼ 标签: 杂谈 freqz函数计算线性系统的频率响应,包括幅频响应和相频响应,基本输入为线性系统的AMMA模型系数向 ...

  7. Matlab参考函数

    附录1 常用命令 附录1.1 管理用命令 函数名 功能描述 函数名 功能描述 addpath 增加一条搜索路径 rmpath 删除一条搜索路径 demo 运行Matlab演示程序 type 列出.M文 ...

  8. matlab rbf函数_基于径向基函数(RBF)的无网格伪谱法与程序实现(2)——微分矩阵...

    参考资料 Gregory E. Fasshauer. Meshfree Approximation Methods with MATLAB. P.387 P401 数值实现 Matlab 2019a ...

  9. Matlab自定义函数的几种方法

    Matlab自定义函数的几种方法_czw-CSDN博客_matlab自定义函数 Matlab 定义函数的几种方法_海底小星星的博客-CSDN博客_matlab定义函数

  10. matlab私有函数,MATLAB 嵌套函数,子函数,私有函数,重载函数

    MATLAB函数嵌套 MATLAB中M文件有两种类型,脚本M文件和函数M文件.脚本M文件是将可执行程序语句放入M文件中,就像在命令窗口那样,按其语句顺序及逻辑关系执行,可以理解为一般的顺序执行程序语句 ...

最新文章

  1. leetcode算法题--两句话中的不常见单词
  2. 用位运算实现四则运算之加减乘除
  3. 简明 Git 命令速查表
  4. 《研磨设计模式》chap21 解释器模式Interpreter(1)模式介绍
  5. 枚举的使用(限foton)
  6. 【STM32】ESP8266模块简介
  7. BZOJ 3224: Tyvj 1728 普通平衡树【Treap】
  8. Kubeflow使用Kubernetes进行机器学习GPU分布式训练
  9. 一个hitbernate配置文件,带几个表(注意mapping);如果连接字符串没有设置utf-8,向insert mysql 会产生乱码(utf8 或 utf-8)...
  10. 微信头像测试软件,心理测试:四个微信头像选一个,测试你的真实性格?
  11. 通过51单片机开发板USB转TTL模块烧录ESP8266-01固件
  12. kali:hydra破解ssh密码
  13. Java基础之成员变量与局部变量
  14. 学习笔记-Matlab二维绘图
  15. alios是安卓吗_阿里云OS到底是国产系统还是安卓系统?
  16. python实现离散沃尔什变换_快速沃尔什变换(示例代码)
  17. win10 C盘右边是OEM分区扩容的解决办法
  18. 如何在面试中回答 “你最大的缺点是什么?”
  19. 黄柳青:中国软件的致命缺陷是什么!
  20. 一张图片怎么旋转90度。利用ps

热门文章

  1. 教你把多个视频合并成一个视频的方法
  2. 绿色软件的“绿化”方法
  3. 最新Win10离线安装.NET Framework 3.5的方法(不需要离线包,只需原版系统安装包,亲测完美快捷有效)
  4. 树莓派4B最新系统bullseye更换国内源方法
  5. 我同学——应聘阿里巴巴之经过
  6. oracle表空间 online,表空间的ONLINE和OFFLINE状态
  7. 做事的常识 书籍梗概 小仓广
  8. R语言27-Prosper 贷款数据分析3
  9. MarkDown 基础教程
  10. js返回上一页,下一页