1.非线性跟踪微分器
function [sys,x0,str,ts]=TD(t,x,u,flag)
%输出变量的名称数目排列次序等用户切勿修改。
%前4个输入变量的名称排列次序用户切勿修改。
%缺省设置为4个输入变量,用户可以根据需要添加输入变量。
%--------------
%--------------
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%调用初始化子函数。缺省设置没有输入变量,用户可以根据需要添加输入变量。
%--------------------------
case 1,
sys=mdlDerivatives(t,x,u);
%调用计算连续状态时间微分子函数。缺省设置只有3个输入变量,用户可以根据需要添加输入变量。
%-------------------------
case 2,
sys=mdlUpdate(t,x,u);
%调用计算离散状态更新子函数。缺省设置只有3个输入变量,用户可以根据需要添加输入变量。
%---------------------------
case 3,
sys=mdlOutputs(t,x,u);
%调用计算输出变量子函数。缺省设置只有3个输入变量,用户可以根据需要添加输入变量。
%-------------------------
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
%调用计算下一个采样时间点子函数。
%------------------------
case 9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
%调用结束仿真子函数。
%--------------------------
end
%---------------------
%------------------------
function [sys,x0,str,ts]=mdlInitializeSizes
%初始化子函数。缺省设置没有输入变量,用户可以根据需要添加输入变量。
sizes=simsizes;
%调用simesizes函数,返回规范格式的sizes构架,这条指令用户切勿修改!!!
%----------------------
sizes.NumContStates=2;
%连续状态的数目,缺省值是0,用户可以根据需要修改。
%----------------------
sizes.NumDiscStates=0;
%离散状态的数目,缺省值是0,用户可以根据需要修改。
%-----------------
sizes.NumOutputs=2;
%输出变量的数目,缺省值是0,用户可以根据需要修改。
%---------------------
sizes.NumInputs=1;
%输入变量的数目,缺省值是0,用户可以根据需要修改。
%-----------------
sizes.DirFeedthrough=1;
%从输入变量到输出变量的直馈通道数目,缺省值是1,用户可以根据需要修改。
%-------------------------
sizes.NumSampleTimes=1;
%采样时间的数目,缺省值是1,用户可以根据需要修改。
%--------------
sys =simsizes(sizes);
%初始化后的构架sizes经simesizes函数处理后赋给sys,这条指令用户切勿修改!!!
%-----------------
x0=[0;0];
%给系统状态变量赋初值,缺省值是[ ],用户可以根据需要修改。
%---------------
str=[];
%特殊变量保留,这条指令用户切勿修改!!!
%---------------
ts=[0 0];
%“二元对”,描写采样时间及偏移量,[0 0]是缺省值,适用于连续系统。
%---------------
%---------------
function sys=mdlDerivatives(t,x,u)
%计算连续状态对时间的微分子函数。缺省设置只有3个输入变量,用户可以根据需要修改。
%----------------
r = 20;
x1dot = x(2);
x2dot = -r*sign(x(1)-u+x(2)*abs(x(2))/(2*r));
sys=[x1dot;x2dot];
%连续状态对时间的微分表达式,赋给sys,缺省值是[ ],用户可以根据需要修改。
%----------------
%-----------------
function sys=mdlUpdate(t,x,u)
%计算离散状态更新子函数。缺省值只有3个输入变量,用户可以根据需要修改。
%---------------
sys=[];
%离散状态更新子函数,赋给sys. 缺省值是[ ],用户可以根据需要修改。
%-------------
%---------------
function sys=mdlOutputs(t,x,u)
%计算输出变量子函数。缺省值设置只有3个输入变量,永和可以根据需要修改。
%-----------
sys=[x(1);x(2)];
%输出变量表达式,赋给sys. 缺省值是[ ],用户可以根据需要修改。
%----------------------
%---------------------
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime=1;
sys=t+sampleTime;
%这两条指令用户不必修改。
%--------------
function sys=mdlTerminate(t,x,u)
sys=[];
%这条指令用户不必修改。
%-----------------------------
2.快速跟踪微分器的离散形式
当输入为 v(t)=sin(t)+0.01*n(t),取r=30;h=0.001;h0 = h时;
取h0=20*h时;
可以看出,h0的扩大可以起到很好的滤波作用,因此将h0乘坐跟踪微分器的滤波因子,因此当积分步长确定时可以增大h0来增强滤波效果。
3 跟踪微分器的作用
(1) PID是以误差的比例、积分、微分的加权和来形成反馈控制量的。然儿实际情况中常常由于没有适合的微分器,只能采用PI控制率,限制了PID的控制能力。
(2)PID是基于误差反馈来消除误差,但是直接取目标与实际行为之间的误差的话,常常会造成初始控制力太大从而造成超调。为了解决PID控制中快速性和超调之间的矛盾,可以事先安排一个过渡过程,让实际系统跟踪这个安排的过渡过程来达到控制目标。跟踪微分器可以用来安排过渡过程。
(3)可以用两个跟踪微分器来实现非线性PID控制。