状态观测器是根据系统的输入输出来确定系统内部状态变量的装置,它的示意图如下:

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_扩张状态观测器


在自抗扰控制器的设计过程中,我们通常把未知的干扰都用写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_自抗扰控制器_02来表示,如果利用状态观测器可以将未知的干扰观测出来,就可以提前在控制器中采取补偿措施,使得控制器的设计更加简单,这也是自抗扰控制器的核心思想。

对一个线性控制系统

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_输入输出_03

来说,以对象的输出量写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_04和输入量写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_05作为其输入,可以构造出如下的新系统

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_06写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_07为要适当选取的矩阵,这是用对象的输出量写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_04和输入量写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_05来设计出的新系统,令这两个系统状态变量的误差记为写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_自抗扰控制器_10,则上面两个方程组相减,得误差变量写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_扩张状态观测器_11所满足的方程组为写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_12,这里只要取矩阵写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_07使得写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_14稳定,就会有写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_15,从而写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_输入输出_16。新设计的系统的状态写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_17就能近似的估计出原系统的所有状态变量写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_输入输出_18,这个状态观测器也可以写成

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_19

下面来看一个具体的例子

设对象为如下有扰动作用的非定常系统

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_20

其中,

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_21

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_方程组_22

取状态观测器为

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_扩张状态观测器_23

其中

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_24

用这个观测器对对象进行状态估计时,可以用简单的欧拉积分法来计算,即令状态观测器的初始值为写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_扩张状态观测器_25写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_26,然后把系统离散化成如下的递推公式来计算

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_扩张状态观测器_27

用这个递推公式,取采样周期写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_输入输出_28,来进行状态估计的结果如下图所示。

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_扩张状态观测器_29


上面那张图实际上有两条曲线,是状态估计的比较好,所以两条曲线基本重合到一起了,下面有一张局部的细节图。

写一个扩张状态观测器eso的fal函数的matlab函数 扩展状态观测器_控制系统_30


以下是实现的代码:

clear all;
h=0.01;
T=0.01;
time = 20;
N = time/T;
n=0:N-1;
% x = sin(n*T);

for k=1:1:N
    %%% original state
    x1(1) = 0;
    x2(1) = 0;
    x1(k+1) = x1(k) + h*x2(k);
    x2(k+1) = x2(k) + h*(-(1+0.5*cos(k*T))*x1(k)-(1+sin(k*T/3))*x2(k)+sign(sin(1.5*k*T)));
    y(k) = x1(k);
    %%%% state observer
    z1(1) = 0;
    z2(1) = 0;
    e(k) = z1(k) - y(k);
    fe = fal(e(k), 0.5, 0.01);
    z1(k+1) = z1(k) + h*(z2(k)-100*e(k));
    z2(k+1) = z2(k) -h*200*fe;
end
plot(n*T,x1(1,1:2000),'b',n*T,z1(1,1:2000),'r');

fal函数如下:

function fe = fal(e,tau1,tau2)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
if abs(e)>tau2
    fe = power(abs(e),tau1)*sign(e);
else
    fe = e/(power(tau2,tau1));
end

end

上面设计过程最关键的一步是状态观测器的设计,韩京清先生的设计过程考虑的参数比较多,这方面可以看一下高志强的线性ADRC的设计过程。