@[简单的滑模控制案例与matlab实现]
来源链接:
该文存在几点问题,某些变量省略,导致学习的人对其模糊不清;对正弦曲线不能很好的跟踪。故修正如下。
function [sys,x0,str,ts] = angle(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 = 4; %输入变量个数
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); %实际角速度
dthd = u(4); %目标角速度
e = th - thd; %角位置跟踪误差 e=θ-θd
de = dth - dthd; %角速度跟踪误差 e'= θ'-θ'd = θ'- 0 = θ'
c = 10; %滑模面函数的系数 c ,决定收敛速度
s = c*e + de;
xite = 1.1; % ε , ( ε>0 )
k = 10; % k , ( k>0 )
ut = J*(-c*de-1/J*(k*s+xite*sign(s)));
sys(1) = ut;
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);