yoyoo 发表于 2007-6-7 11:15

倒立摆系统的RLS参数辨识程序

对于一个倒立摆系统,其描述为:a'=f(a,a')+g(a,a')u   (1)
其中:f=(9.8*sin(a)-m*l*b^2*cos(a)*sin(a)/(mc+m))/l/(4/3-m*cos(a)^2/(mc+m)); (2)
         g=cos(a)/(mc+m)/l/(4/3-m*cos(a)^2/(mc+m));                                           (3)
         l=0.5;m=0.1;mc=1;
对式(1)进行简单的离散化,可得:
            a(k+1)=a(k)+a'(k);
            a'(k+1)=a'(k)+*h;                                  (4)
            h=0.01s

将式(4)转化为模糊双曲正切模型:
            x1(k+1)=c1*tanh(s1*x1(k))+c2*tanh(s2*x2(k))                                    
            x2(k+1)=d1*tanh(s2*x2(k))+d2*u(k)                                                    (5)
式(5)写为矩阵形式:
             X(k+1)=A*tanh(S*X(k))+B*u(k)                                                         (6)
             X(k+1)=*D(k)                                                                              (7)
其中:D(k)=;
令C‘=;
利用递推最小二乘法辨识参数A,B:
C(k+1)=C(k)+F(k+1)*D(k)*e(k+1)
F(k+1)=(1/m)*{F(k)-[(F(k)*D(k)*D(k)'*F(k))/(m+D(k)'*F(k)*D(k))]}
e(k+1)=x(k+1)-C(k)'*D(k)
其中a(0)=0.3491(近似20度);a(0)'=0;u(k)=-25*a(k)-a(k)'+0.2*cos((2*pi/50)*k);
s1=s1=1; m=0.95; F(0)=1000I ;x1(0)=x2(0)=c1(0)=c2(0)=d1(0)=d2(0)=0;

(C’表示C矩阵的转制,应用MATLAB表示方法,呵呵,这里公式编辑器貌似编不上,只好这样凑数了。D‘亦同)
RLS算法在MATLAB中的实现:
% 主体程序
k=0.95;
F=1000*;
h=0.01;A(1,1)=0.3491;A1(1,1)=0;
c1=0;c2=0;d1=0;d2=0;
C=;C1=;
for(i=1:1500)
   x=A(1,i)+A1(1,i)*h;
   u(i)=-25*A(1,i)-A1(1,i)+0.2*cos((2*pi/50)*i);
   a=A(1,i);
   b=A1(1,i);
   f=yo_11(a,b);
   g=yo_12(a,b);
   y=A1(1,i)+(f+g*u(i))*h;                           
   A=];
   A1=];
end;
for(i=1:1500)
   D(:,i)=;
   F=1/k*(F-F*D(:,i)*D(:,i)'*F/(k+D(:,i)'*F*D(:,i)));
   e=A(1,i+1)-C(:,i)'*D(:,i);
   e1=A1(1,i+1)-C1(:,i)'*D(:,i);
   C(:,i+1)=C(:,i)+F*D(:,i)*e;
   C1(:,i+1)=C1(:,i)+F*D(:,i)*e1;
end;
%
%f函数%
function f=yo_11(a,b)
l=0.5;m=0.1;mc=1;
f=(9.8*sin(a)-m*l*b^2*cos(a)*sin(a)/(mc+m))/l/(4/3-m*cos(a)^2/(mc+m));
%
%g函数%
function g=yo_12(a,b)
l=0.5;m=0.1;mc=1;
g=cos(a)/(mc+m)/l/(4/3-m*cos(a)^2/(mc+m));
%

初次编写,贻笑方家了!

yyfei11 发表于 2008-5-15 10:15

正在做这方面,学习下,谢谢分享!
页: [1]
查看完整版本: 倒立摆系统的RLS参数辨识程序