自适应控制学习——MIT自适应律

MIT自适应律
参考书籍 系统辨识与自适应控制 MATLAB仿真(第三版)
仿真环境 Matlab 2016a
参照书上P59的例题搭建 只放代码和结果
单纯的MIT自适应律代码如下:

%MIT自适应律
%一些量的初始化
clear
clc

r = 0.1;%自适应增益
gain = 0.1;%方波增益
K_c_0 = 0;%可调增益
L = 1000;%迭代次数
h = 0.1;%步长
u = gain*[ones(1,L/4),-ones(1,L/4),ones(1,L/4),ones(1,L/4)];%输入是一个幅值为r的方波
u_0 = 0;x_0 = [0;0];%参考模型的输入和初值
y_p = zeros(L,1);x_p = zeros(2,1);y_p_0 = 0;x_p_0 = zeros(2,1);%被控模型的输入输出序列和初始值
y_m = zeros(L,1);x_m = zeros(2,1);y_m_0 = 0;x_m_0 = zeros(2,1);%参考模型的输入输出序列和初始值
uu = [];uu_0 = 0;%被控模型的输入 其实等于kc*u;
e = zeros(L,1);e_0 = 0;%误差序列和初值
K_c = zeros(L,1);%可变增益序列  放在一个数组中观察变化情况
%参考模型 
num_m = [1];den_m=[1 1 1];
%T2S
[Am,Bm,Cm,Dm] = tf2ss(num_m,den_m);
%稳定被控对象
num_p = [1];den_p = [1 1 1];
%T2S
[Ap,Bp,Cp,Dp] = tf2ss(num_p,den_m);

for i = 1:L
    %参考输出
    x_m = x_m_0 + h*(Am*x_m_0 + Bm*u_0);
    y_m(i) = Cm*x_m + Dm*u_0;
    %被控输出
    x_p = x_p_0 + h*(Ap*x_p_0 + Bp*uu_0);
    y_p(i) = Cp*x_p + Dp*uu_0;
    
    e(i) = y_m(i) - y_p(i);
    K_c(i) = K_c_0 + h*r*e_0*y_m_0;
    uu = K_c(i)*u;
    
    %更新变量
    x_m_0 = x_m;x_p_0 = x_p;u_0 = u(i);uu_0 = uu(i);
    K_c_0 = K_c(i);y_m_0 = y_m(i);
    e_0 = e(i);
end
x = 1:L
plot(x,y_m,x,y_p,'--',x,K_c);






结果:
1.输入信号幅值gain = 0.1;
在这里插入图片描述
2.输入信号幅值gain = 0.6;
在这里插入图片描述
3.输入信号幅值gain = 3.2;
在这里插入图片描述
由此可见参考输入的幅值会影响系统的输出稳定性,因为我们的目标是无穷远处的误差等于0,即两条线重合。但是普通的MIT-MRAC来说,可能对于某一幅值输入信号稳定,但是对于另一信号就不稳定了,为了需进行改进,提出了MIT归一化算法。
直接上代码:

%MIT自适应律——归一化处理
%一些量的初始化
a = 0.01;b = 2;%归一化参数
r = 0.1;%自适应增益
gain = 5;%方波增益
K_c_0 = 0;%可调增益
L = 1000;%迭代次数
h = 0.1;%步长
u = gain*[ones(1,L/4),-ones(1,L/4),ones(1,L/4),ones(1,L/4)];%输入是一个幅值为r的方波
u_0 = 0;x_0 = [0;0];%参考模型的输入和初值
y_p = zeros(L,1);x_p = zeros(2,1);y_p_0 = 0;x_p_0 = zeros(2,1);%被控模型的输入输出序列和初始值
y_m = zeros(L,1);x_m = zeros(2,1);y_m_0 = 0;x_m_0 = zeros(2,1);%参考模型的输入输出序列和初始值
uu = [];uu_0 = 0;%被控模型的输入 其实等于kc*u;
e = zeros(L,1);e_0 = 0;%误差序列和初值
K_c = zeros(L,1);%可变增益序列  放在一个数组中观察变化情况
%参考模型 
num_m = [1];den_m=[1 1 1];
%T2S
[Am,Bm,Cm,Dm] = tf2ss(num_m,den_m);
%稳定被控对象
num_p = [1];den_p = [1 1 1];
%T2S
[Ap,Bp,Cp,Dp] = tf2ss(num_p,den_m);
%开始!
for i = 1:L
    %参考输出
    x_m = x_m_0 + h*(Am*x_m_0 + Bm*u_0);
    y_m(i) = Cm*x_m + Dm*u_0;
    %被控输出
    x_p = x_p_0 + h*(Ap*x_p_0 + Bp*uu_0);
    y_p(i) = Cp*x_p + Dp*uu_0;
    
    e(i) = y_m(i) - y_p(i);
    sat_value = sat([e_0*y_m_0]/[a + y_m_0*y_m_0],b);
    K_c(i) = K_c_0 + h*r*sat_value;
    uu = K_c(i)*u;
    
    %更新变量
    x_m_0 = x_m;x_p_0 = x_p;u_0 = u(i);uu_0 = uu(i);
    K_c_0 = K_c(i);y_m_0 = y_m(i);
    e_0 = e(i);
end
x = 1:L
plot(x,y_m,x,y_p,'--',x,K_c);




1.输入信号幅值gain = 0.6;
在这里插入图片描述
3.输入信号幅值gain = 3.2;
在这里插入图片描述
3.输入信号幅值gain = 10;
在这里插入图片描述
PS:图中的黄线是可变增益,当输出稳定后,这条线应该是一条水平的。
感兴趣的朋友可以直接复制代码到matlab中自己试一下,如果有不当的地方请大家指正!希望可以和大家多多交流学习。
_

  • 4
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值