zoukankan      html  css  js  c++  java
  • Matlab中S函数建立与应用

    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

  • 相关阅读:
    超多sql分步骤类型题解
    sql 高级函数
    sql 每天下单的老客数量
    sql
    面试-JAVA常见回答
    查询员工的累计薪水
    背包问题模板
    动态规划理解合集
    SQL语句统计每天、每月、每年的 数据
    机考刷机-树相关
  • 原文地址:https://www.cnblogs.com/zhurun/p/4590558.html
Copyright © 2011-2022 走看看