示例:

dx1/dt=-0.5572x1-0.7814x2+u1-u2;

dx2/dt=0.7814x1+2u2;

y=1.9691x1+6.4493x2;

simulink模型的建立

s函数程序

 A=[-0.5572,-0.7814;0.7814,0];
B=[1,-1;0,2];
C=[1.9691,6.4493];

程序与之前修改的部分使用红色标出

  function [sys,x0,str,ts,simStateCompliance] = sfun_state01(t,x,u,flag,A,B,C)
switch flag,
case 0,
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 2,
sys=mdlUpdate(t,x,u,A,B);
case 3,
sys=mdlOutputs(t,x,u,C);
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 = 0;
sizes.NumDiscStates = 2;
sizes.NumOutputs = 1;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0 0]';
str = [];
ts = [0.02,0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u) sys = [];
function sys=mdlUpdate(t,x,u,A,B)
% update state variable
Ts = 0.02;
sys = x + (A * x + B * u) *
Ts; function sys=mdlOutputs(t,x,u,C)
% update output
sys = C * x; function sys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1;
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u) sys = [];

图像结果

function sys = mlupdate(t, x, u)的功能是对离散状态量的跟新,即更新下一采样时刻的状态变量,并在之后的mdloutputs中处理;这是s函数文章中程序错误的原因,但为什么会写成上面的形式呢?离散变量的跟新是什么意思,在这里给大家推导一遍帮助大家的理解

这个式子就是malupdate中需要编写的式子,离散变量的更新就是更新下一个采样时刻的状态变量,在outputs函数中对下一采样时刻处理得到下一采样时刻的输出结果。

有同学会问程序中写的式sys = x + (A * x + B * u) * Ts呢?x代表的x(k)应该好理解,但是左边为什么是sys而不是x(k + 1),首先malupdate函数的输出只有一个sys,其次sys会通过中间变量x传输到Output的x里面,所以这里的sys可以代表x(k + 1)。

到这里小伙伴们应该都清楚了,但是我是怎么验证我写的s-function函数是对s函数这一文章中写的式错的呢?很好办直接对状态方程建立simulink模型看图像和自己写的s-function模型的图像是否一致不就完了。

simulink中的模型

为了便于观看左边是状态变量x建立的模型,右边是表示输出y的模型,它们之间是使用goto和from模块结合的和直接连线是一样的

图像结果是

              

为了便于对比这里将s-function中模型的图像也放在这里左边的是状态方程搭建模型的图像,右边是s-function模型的图像,是不是一模一样,显然s函数这篇文章中的图像是有问题的。

s函数中第一个程序修改(介绍function sys = mlupdate(t, x, u)用法)的更多相关文章

  1. PHP函数中默认参数的的写法

    函数可以定义 C++ 风格的标量参数默认值,如下所示: Example #3 在函数中使用默认参数 <?php function makecoffee($type = "cappucc ...

  2. (转)AS3 中,Function.apply、call中第一个参数的作用;与什么时候用

    http://blog.csdn.net/linjf520/article/details/8746064 大家在使用Function.apply或是call时,是否发现,第一个参数不知道怎么用,赋值 ...

  3. php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组)

    php重建二叉树(函数缺省参数相关的都写在后面,比如array_slice函数中的$length属性,故第一个参数是操作的数组) 一.总结 牛客网和洛谷一样,是真的好用 二.php重建二叉树 输入某二 ...

  4. javascript中,一个js中的函数,第一句var _this = this;为什么要这样做?

    javascript中,一个js中的函数,第一句var _this = this;为什么要这样做? 下面是源码: 下面这段代码是常用的网站首页,自动切换span或者tabbar来变更List显示内容的 ...

  5. javascript函数中with的介绍

    /*js函数中with函数的用法分析定义 方便用来引用某个对象中已有的属性但是不能用来给对象添加属性 要给对象创建新的属性 必须明确的引用该对象*/代码格式with(object) statement ...

  6. JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链

    一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...

  7. Unity 脚本中的主要函数的 执行顺序及其介绍

    Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisa ...

  8. lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

  9. Javascript函数中的高级运用

    先介绍一下js中的高阶函数,所谓的高阶函数就是,一个函数中的参数是一个函数或者返回的是一个函数,就称为高阶函数. js中已经提高了一下高阶函数,使用起来非常棒,当然我们也可以自己实现,我介绍几种ES5 ...

随机推荐

  1. 60天shell脚本计划-6/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月21日 --修改时间:2021年2月25日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可 ...

  2. POJ1990 题解

    题目大意:有若干头牛,每个牛有一个音量值,两头牛能互相听见对方说话需要发出两头牛中音量值较大者的音量*两头牛的距离的音量,求使任意两头牛都互相听见对方需要发出的音量总和.每头牛的音量值可以相同,但坐标 ...

  3. QT:中文字符串与“常量中有字符串”报错

    解决方法参照: (10条消息) Qt5.9 win7系统 中文字符串报错:常量中有字符串_Be busy living or busy dying-CSDN博客 主要是用QStringLiteral( ...

  4. Python:PIL(三)——Image

    学习自:PIL官方文档--Image (2条消息) Python图像处理PIL各模块详细介绍_章子雎的博客-CSDN博客 一.Image模块 1.open 用法 open(fp,mode='r',fo ...

  5. c语言刷lleetcode记录

    155. 最小栈 笔记: 在push(压栈)的时候思路: typedef struct MinStack{ int data; struct MinStack *next; } MinStack; / ...

  6. php 和微信小程序 解构赋值

    php 解构赋值只能解构索引数组 js:

  7. laravel 数据验证规则

    return [ 'accepted' => '必须为yes,on,1,true', 'active_url' => '是否是一个合法的url,基于PHP的checkdnsrr函数,因此也 ...

  8. CF258D题解

    太厉害啦 首先做期望题最不能忘记的就是期望的线性性. 所以我们直接将全局逆序对对数拆成两个数其中一个比另一个大的期望(概率),设为 \(f[i][j]\),初值为 \([a_i>b_j]\). ...

  9. python3生成10个成绩列表,求其平均分

    import random alist = [random.randint(45,101) for _ in range(10)] #在[45.101)之间生成10个随机数 print(alist) ...

  10. Anaconda 安装 国内镜像问题解决方案

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 遇到问题:安装2021版本后无法打开Anaconda Navigator 解决方案:使用管理员身份打开Avaconda Prompt,输入conda ...