function [sys,x0,str,ts,simStateCompliance] = int_hyo(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts,simStateCompliance]=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);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 1;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [-1]; %之前这里是0,改为1,应为x0代表-cos(t)在0初始时刻应该为-1
str = [];
ts = [0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = u;
function sys=mdlUpdate(t,x,u)
sys=[];
function sys=mdlOutputs(t,x,u)
sys=x ;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];

simulink模型为

图像为

上面的x0 = [-1]; %之前这里是0,改为1,应为x0代表-cos(t)在0初始时刻应该为-1为什么这么改?
这是关于状态变量是什么的问题(x0表示状态变量,赋值是表示初始时刻状态变量的值),如果状态变量表示x = sin(t)时,这里为0,但是根据程序来看这里的状态变量选择的并不是x = sin(t),而是x = -cos(t),为什么这么说呢?

因为程序中调用了

 function sys=mdlDerivatives(t,x,u)
sys = u;
 function sys=mdlOutputs(t,x,u)
sys=x ; 

输入(即sint(t))积分结果通过sys间接给了x状态变量,x是一个表示sin(t)积分后的变量,你想想这个状态变量到底是什么,不就是x = -cos(t)吗?如果不明白为什么积分后间接给x状态变量这句话,不要着急下面一篇文章能够让你清楚mdlDerivatives函数内部的原理


之前看到s函数那篇文章中积分这一节程序时,看到最后的图像感觉有问题,但是不知道程序中哪个地方出错了,主要还是不是很理解function sys=mdlDerivatives(t,x,u)的用法。看了一个博主的文章瞬间对这个子函数理解了,在这里将此博主的文章搬运过来便于阅读

原文链接:https://blog.csdn.net/qq_43159983/article/details/104644017

Matlab S函数 function sys=mdlDerivatives(t,x,u)
设函数为 h’’ = 1/J*(ut+dt)

1 s函数里 的x状态含义:
状态1: x(1) —表示状态值h
状态2: x(2) —表示状态值的导数(或称速度)h’

2 function sys=mdlDerivatives(t,x,u)
在控制系统中,该函数可用于描述微分方程,例如描述被控对象和自适应率等,并采用数值分析方法(如ODE方法)实现模型的自动求解。如下:

function sys=mdlDerivatives(t,x,u)
J=2;
dt=sin(t);
ut=u(1);
sys(1)=x(2);
sys(2)=1/J*(ut+dt); //注: 1/J*(ut+dt)为一个二阶导函数
function sys=mdlOutputs(t,x,u)
sys(1)=x(1);
sys(2)=x(2);

sys(1)根据x(2) 解出 函数里变量值 h ——状态1,即x(2)积分后赋给sys(1)。
sys(2)根据二阶导函数’1/J*(ut+dt)‘解出一阶导数 h’ ——状态2,即1/J*(ut+dt)积分后赋给sys(2)。

最后,sys通过中间变量x传输到Output的x里面。

这里和simulink中的积分模块做下对比

simulink中的模型

这里1/s模块内需要设置初始状态为-1(也是表示的-cos(t)初始时刻的值)

图像结果

最新文章

  1. 关于安装安卓SDK出现无法更新问题时的解决办法
  2. Ecshop 后台增加一个左侧列表菜单menu菜单的方法
  3. Activity的四种启动模式详解
  4. 当插入数据失败时,防止mysql自增长字段的自增长的方法
  5. Spring MVC防御CSRF、XSS和SQL注入攻击
  6. Northwind数据库表字段介绍
  7. 查看sid
  8. 神经网络的学习 Neural Networks learing
  9. 什么是xsi:type ???
  10. 安全性测试入门:DVWA系列研究(二):Command Injection命令行注入攻击和防御
  11. ActiveMQ嵌入Tomcat
  12. 【转】WEB服务器与应用服务器的区别
  13. LeetCode(78):子集
  14. webpack.optimize.UglifyJsPlugin配置说明
  15. 根据设备宽高设置View的大小
  16. python2.7与3.5版本中:编码格式及编码转换
  17. Unix操作系统监控详解(一)
  18. rac安装_grid安装校验报错之grid未建立信任关系
  19. DBUtils查找最大的ID总是返回0
  20. Unity 如何在打包的时候执行一些逻辑

热门文章

  1. 一张图看懂IaaS, PaaS和SaaS的区别
  2. AHUACM寒假集训II(线段树)
  3. VT 入门篇——最小 VT 实现(上)
  4. 超简单的集成表达式树查询组件,Sy.ExpressionBuilder 使用说明
  5. iframe和伪造ajax
  6. 反压缩 js ,我的万花筒写轮眼开了,CV 能力大幅提升
  7. JZ-007-斐波那契数列
  8. 【故障公告】龙卷风来袭:突增的并发请求,撑不住的CPU
  9. Android 应用框架层 SQLite 源码分析
  10. CSS样式下划线