s函数中积分程序更改

本文总字数:2528,阅读预计需要:6分钟

复制代码
  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)初始时刻的值)

图像结果

 

posted @   北极星!  阅读(1175)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2020-03-05 cpu设计过程
2020-03-05 硬件通信协议
2020-03-05 计算机网络概述
>>博客统计:随笔 -615  文章 -0  评论 -50 
点击右上角即可分享
微信分享提示