【Matlab】简单的滑模控制程序及Simulink仿真
文章:
这篇文章仿真和输出U的推到有些问题,博主根据此篇文章进行修改进行对sin(t)曲线的追踪(使用滑模控制)
1.前言
最近开始了对滑模控制的学习,使用的书籍为刘金琨的《滑膜变结构控制MATLAB仿真》,今天是按照书上的例程做了一个简单的自适应控制系统。
2.程序解析
此程序中,电机控制系统的动态模型为:
,其中,θ为电机的角位置,J为转动惯量,d(t)为干扰且满足
,η为干扰上界,
为角位置跟踪误差
定义跟踪误差函数,也就是滑模面函数s为:,当s=0时,有e和edot都为0,且是按照指数收敛:
也就是说当时间趋于∞时,误差将指数收敛到0,收敛速度取决于c,所以误差函数s的收敛性意味着位置跟踪误差e和速度跟踪误差e'的收敛性,也就是说:s为滑膜函数。
2.1.控制器代码
首先是控制器的S函数。控制器就是系统的输入控制量u:
- function [sys,x0,str,ts] = simple_adaptive_controller(t, x, u, flag)
- switch flag,
- case 0,
- [sys,x0,str,ts]=mdlInitializeSizes; % 调用初始化子函数
- case 1,
- sys=[];
- case 2,
- sys=[];
- case 3,
- sys=mdlOutputs(t,x,u); %计算输出子函数
- case 4,
- sys=[]; %计算下一仿真时刻子函数
- case 9,
- sys=[]; %终止仿真子函数
- otherwise
- DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
- end
- function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化子函数
- sizes = simsizes;
- sizes.NumContStates = 0; %连续状态变量个数
- sizes.NumDiscStates = 0; %离散状态变量个数
- sizes.NumOutputs = 1; %输出变量个数
- sizes.NumInputs = 3; %输入变量个数
- sizes.DirFeedthrough = 1; %输入信号是否在输出端出现
- sizes.NumSampleTimes = 0; % at least one sample time is needed
- sys = simsizes(sizes);
- x0 = []; %初始值
- str = [];
- ts = []; %[0 0]用于连续系统,[-1 0]表示继承其前的采样时间设置
- simStateCompliance = 'UnknownSimState';
- function sys=mdlOutputs(t,x,u) %计算输出子函数
- J = 2;
- thd = u(1);
- th = u(2);
- dth = u(3);
- e = th - thd;
- de = dth;
- c = 10;
- s = c*e + de;
- xite = 1.1;
- k = 0;
- ut = J*(-c*dth-1/J*(k*s+xite*sign(s)));
- sys(1) = ut;
因为控制器不涉及到复杂的微分运算,故只用在mdlOutputs中写控制输入u的代码
2.2.受控对象代码
本例中,受控对象为电机控制系统,,需要对这个微分方程进行描述,因为要用到θ、θ',虽然方程中有θ'',但是可以通过除以J得到θ''的表达式,故代码如下:
- function [sys,x0,str,ts] = plant(t, x, u, flag)
- switch flag,
- case 0,
- [sys,x0,str,ts]=mdlInitializeSizes; % 调用初始化子函数
- case 1,
- sys=mdlDerivatives(t,x,u); %调用计算微分子函数
- case 2,
- sys=[];
- case 3,
- sys=mdlOutputs(t,x,u); %计算输出子函数
- case 4,
- sys=[]; %计算下一仿真时刻子函数
- case 9,
- sys=[]; %终止仿真子函数
- otherwise
- DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
- end
- function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化子函数
- sizes = simsizes;
- sizes.NumContStates = 2; %连续状态变量个数
- sizes.NumDiscStates = 0; %离散状态变量个数
- sizes.NumOutputs = 2; %输出变量个数
- sizes.NumInputs = 1; %输入变量个数
- sizes.DirFeedthrough = 0; %输入信号是否在输出端出现
- sizes.NumSampleTimes = 1; % at least one sample time is needed
- sys = simsizes(sizes);
- x0 = [0, 0]; %初始值
- str = [];
- ts = [0 0]; %[0 0]用于连续系统,[-1 0]表示继承其前的采样时间设置
- simStateCompliance = 'UnknownSimState';
- function sys = mdlDerivatives(t, x, u) %计算微分子函数
- J = 2;
- dt = sin(t);
- ut = u(1);
- sys(1) = x(2);
- sys(2) = 1/J*(ut+dt);
- function sys=mdlOutputs(t,x,u) %计算输出子函数
- sys(1) = x(1);
- sys(2) = x(2);
3.仿真结果和Simulink注意事项
Simulink建立如下模型:
将微分方程算法换为定步长fixed step中的ode4!不然仿真超级慢!
具体分析可见:https://www.ilovematlab.cn/thread-260054-1-1.html
最后结果为:
系统最终能够跟踪阶跃信号
————————————————
版权声明:本文为CSDN博主「PriscillaSCU」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_38887014/article/details/103115218
【Matlab】简单的滑模控制程序及Simulink仿真的更多相关文章
- 使用滑模控制对sin(t)曲线追踪
结合:[Matlab]简单的滑模控制程序及Simulink仿真本片文章观看,此篇文章是在这篇文章的基础上进行修改的 输出u的推导过程 如果不明白控制量输出u的推到过成请看:[控制理论]滑模控制最强解析 ...
- 非刚性图像配准 matlab简单示例 demons算法
2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...
- matlab 调用C程序进行simulink仿真
文章目录 simulink仿真 创建C程序 编译C程序 运行结果 simulink仿真 simulink仿真中需要使用S-Function模块,可以实现调用C程序进行仿真,下面先建立一个简单的仿真: ...
- MATLAB 右键该文件不存在或者SIMULINK打开后仿真器件报错
错误示例: 提示是否创建文件 并且会提示某某模块或者某某文件未找到not found 原因: .m文件不存在,是因为所打开的文件还并没有添加进matlab的搜索目录,或者是需要.m文件运行后生成的 某 ...
- MATLAB设计模糊控制器并用simulink仿真
一.设计模糊控制器1.1 创建项目文件夹在此路径如图 1.2 打开MATLAB打开MATLAB R2012a切换当前目录为上一步路径,如图 1.3 设计模糊控制器打开模糊控制器设计对话框 根据模糊控制 ...
- 车辆跟随滑模控制的python实现
上一篇文章一个汽车跟踪问题的滑模控制实例,已经从理论上证明了可以使用滑模变结构控制策略来解决汽车跟踪问题. 下面分别采用指数趋近律.等速趋近律.准滑模控制的方法完成车辆跟随问题的仿真 import m ...
- Simulink仿真入门到精通(二) Simulink模块
2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...
- Simulink仿真入门到精通(十九) 总结回顾&自我练习
从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...
- 震荡信号Simulink仿真
1. simulink仿真设计 震荡信号本质是调制信号,可以表示为: u(t)=A*(1+m*cos(Ωt+θ))*cos(ωt+φ)=A*cos (ωt+φ)+ A*m*cos(Ωt+θ)*cos( ...
随机推荐
- 判断访问类型是pc端还是移动端
/** * 判断访问类型是电脑还是手机 */ $(function(){ var mobile_flag = isMobile(); // true为PC端 ...
- Qt:QWebChannel
0.说明 QWebChannel的作用是将QObject展示给的HTML客户. QWebChannel是连接C++应用和HTML/JS应用的桥梁.通过把一个QObject传入QWebChannel并在 ...
- 函数式编程 高阶函数 map&reduce filter sorted
函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...
- 利用while循环写的简单小游戏猜数字
猜数字的大小游戏 C:\Users\Administrator>python Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 23 2018, 23:31:1 ...
- 让Node.js支持ES6的语法
使用命令,全局安装es-checker: cnpm install -g es-checker 安装好之后,执行以下命令来查看Node.js对ES6的支持情况. es-checker 可以从输出中查看 ...
- selenium+python自动化-元素定位
自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 本篇主要讲几种基本的元素定位方法元素定位在这四个环节中是至关重要的,如果说按学习精力 ...
- K3客户端远程组件注册“组件kdsvrmgr无法正常工作”解决办法
K3最近出现的了远程注册不通过,我们公司购买的是正版的软件.联系当地的技术人员搞了一周也没有处理掉,最后联系官方技术支持人员,3分钟不到解决此问题.
- 程序语言与编程实践2-> 蓝桥杯C/C++备赛记录1 | 入门了解与首周训练
寒假前班主任帮我们报了名,是得好好准备准备.作为一个CSer,coding能力一定不能太弱.我反思,好久没写C/C++代码了,净是些随手写的python脚本,刚开始上手题目bug一大堆. 由于也不是啥 ...
- 面向对象编程(C++篇3)——析构
目录 1. 概述 2. 详论 2.1. 对象生命周期 2.2. 不一定需要显式析构 2.3. 析构的必要性 3. 总结 1. 概述 类的析构函数执行与构造函数相反的操作,当对象结束其生命周期,程序就会 ...
- LGP4714题解
没意思啊 题意:求 \(1^{k+2}(n)\),其中规定 \(1^k\) 在 \(k=1\) 时为 \(1\),在 \(2 \leq k\) 时为 \(1 * 1^{k-1}\)(* 为狄利克雷卷积 ...