无模型自适应控制器的matlab仿真

目录

1.无模型自适应控制器概述

2.MATLAB核心程序

3.仿真结果


       MFAC控制器无需建立被控系统的过程模型即可进行适应性的控制。它通过在线学习和更新系统的模型,利用得到的模型信息调整控制系统,以适应系统的时变、非线性和不确定特性。

       具体来说,MFAC控制器会通过输入和输出数据来推断和更新系统模型,以实现闭环反馈控制。它不需要针对某一特定过程进行控制器设计,也不需要复杂的人工控制器参数整定,因此具有较高的自适应性和灵活性。

MFAC控制器的优点在于它能适应各种复杂的、不确定的、时变的系统,且具有良好的鲁棒性和响应速度。在存在干扰和噪声的情况下,MFAC控制器也能表现出良好的控制性能。

      无模型自适应(MFAC,Model-free adaptive control)控制,顾名思义,是一种无需建立过程模型的自适应控制方法。无模型自适应控制系统应具有如下属性或特征:(1)无需精确的过程定量知识;(2)系统中不含过程辨识机制和辨识器;(3)不需要针对某一过程进行控制器设计;(4)不需要复杂的人工控制器参数整定;(5)具有闭环系统稳定性分析和判据,确保系统的稳定性 。

1.无模型自适应控制器概述

       无模型自适应控制器是一种用于系统控制的算法,其主要特点是无需预先知道被控系统的模型。这种控制器通过观测系统的输入和输出数据,以及系统的响应行为,来推断系统的模型,并以此模型进行控制。无模型自适应控制是一种在线学习控制策略,能够适应系统的时变、非线性和不确定特性。

      无模型自适应控制的基本原理是基于对系统输入和输出数据的观测,通过一定的算法,在线学习和更新系统的模型。控制器通过将系统的实际输出与期望输出进行比较,得到一个误差信号,然后将这个误差信号用于更新系统的模型和控制系统。因此,无模型自适应控制器主要包含两个主要部分:一个用于推断系统模型的算法和一个用于控制系统以最小化系统误差的算法。

无模型自适应控制器的主要数学公式如下:

系统模型推断算法:

H(t+1) = H(t) + α*y(t)*[y(t) - h(H(t), u(t))]

       其中,H(t)是在时刻t的系统模型,y(t)是时刻t的系统输出,h()是期望的系统输出,u(t)是时刻t的系统输入,α是学习率。

控制系统算法:

u(t+1) = u(t) + β*[h(H(t+1), u(t)) - y(t)]

      其中,β是控制率。这个公式表示在时刻t+1的系统输入应该是时刻t的系统输入加上一个修正量,修正量的大小等于根据新的系统模型计算得到的期望输出与实际输出之差乘以控制率。

       以上两个公式结合起来,就构成了无模型自适应控制器的基本框架。这种控制器通过不断地学习和调整系统模型,以及根据模型调整系统输入,来逐渐减小系统的误差,达到理想的控制效果。

       无模型自适应控制器被广泛应用于各种系统控制问题中,如电力系统、化工过程、交通控制等。其优点在于无需精确的系统模型,能够自适应地学习和调整系统模型,适用于各种复杂的、不确定的、时变的系统。同时,无模型自适应控制器也能够在存在干扰和噪声的情况下表现出良好的控制性能。此外,无模型自适应控制器还具有易于实现、响应速度快、鲁棒性强等优点。

       无模型自适应控制器是一种基于数据驱动的控制算法,其基本思想是通过观测系统的输入和输出数据,在线学习和更新系统的模型,并以此模型进行控制。这种控制器在各种系统控制问题中都表现出良好的控制性能和应用前景。由于其无需精确的系统模型,能够自适应地学习和调整系统模型,适用于各种复杂的、不确定的、时变的系统。但是,无模型自适应控制器的设计和实现也有一定的难度和挑战,如学习率和控制率的选取、系统的稳定性和鲁棒性的保证等问题。因此,无模型自适应控制器的研究和应用还需要不断地深入和完善。

2.MATLAB核心程序

.................................................................................
%y(1:nu+1)=0;u(1:nu)=0;du(1:nu,1:nu)=0;
y(1)=-1;y(2)=1;y(3)=0.5;
u(1:2)=0;
du(1:2,1:nu)=0;
%期望值
for k=1:N+1
    if k<=300
        yd(k)=0.5*(-1)^round(k/100);
    else
        if k<=700
            yd(k)=0.5*sin(k*pi/100)+0.3*cos(k*pi/50);
        else
            yd(k)=0.5*(-1)^round(k/100);
        end
     end
end
I=eye(nu);
%控制器伪偏导数初值
% fai(1:nu,1) =2;
% fai(1:nu,2:nu)=0;
fai(1:2,1) =2;
fai(1:2,2:nu)=0;
%程序循环
%for k=nu+1:N
for k=3:N
    a(k)=1+round(k/500);
    fai_act(k - 1) = (y(k)-y(k-1)) / du(k-1,1:nu);
    fai(k,1:nu)=fai_act(k-1)+eita*(y(k)-y(k-1)-fai_act(k-1)*du(k-1,1:nu)')*du(k-1,1:nu)/(miu+du(k-1,1:nu)*du(k-1,1:nu)');
    if (fai(k,1)<10^(-5)) || ((du(k-1,1:nu)*du(k-1,1:nu)')^0.5<10^(-5))
        fai(k,1)=2;
    end
    if nu==1
        u(k) = u(k-1)+rou*fai(k,1)*(yd(k+1)-y(k))/(lamda+fai(k,1).^2);        
    else
        u(k) = u(k-1)+rou*fai(k,1)*(yd(k+1)-y(k)-fai(k,2:nu)*du(k-1,1:nu-1)')/(lamda+fai(k,1).^2); 
    end
    %model
    if k<=500
        y(k+1)=y(k)/(1+y(k).^2)+u(k)^3;
    else
        y(k+1)=(y(k)*y(k-1)*y(k-2)*u(k-1)*(y(k-2)-1)+a(k)*u(k))/(1+y(k-1)^2+y(k-2)^2);    
    end
    y(k+1) = y(k+1) + rand_data(k);
    for i=1:nu
        du(k,i)=u(k-i+1)-u(k-i);
    end
    emax(k+1)=yd(k+1)-y(k+1);
end

%控制器参数
nu=1;
eita =1;
miu =1;
rou=0.6;
lamda =0.1;

%初值
%y(1:nu+1)=0;u(1:nu)=0;du(1:nu,1:nu)=0;
y2(1)=-1;y2(2)=1;y2(3)=0.5;
u2(1:2)=0;
du2(1:2,1:nu)=0;

I=eye(nu);
%控制器伪偏导数初值
% fai(1:nu,1) =2;
% fai(1:nu,2:nu)=0;
fai2(1:2,1) =2;
fai2(1:2,2:nu)=0;
%程序循环
%for k=nu+1:N
for k=3:N
    a(k)=1+round(k/500);
    fai2(k,1:nu)=fai2(k-1,1:nu)+eita*(y2(k)-y2(k-1)-fai2(k-1,1:nu)*du2(k-1,1:nu)')*du2(k-1,1:nu)/(miu+du2(k-1,1:nu)*du2(k-1,1:nu)');
    if (fai2(k,1)<10^(-5)) || ((du2(k-1,1:nu)*du2(k-1,1:nu)')^0.5<10^(-5))
        fai2(k,1)=2;
    end
    if nu==1
        u2(k) = u2(k-1)+rou*fai2(k,1)*(yd(k+1)-y2(k))/(lamda+fai2(k,1).^2);        
    else
        u2(k) = u2(k-1)+rou*fai2(k,1)*(yd(k+1)-y2(k)-fai2(k,2:nu)*du2(k-1,1:nu-1)')/(lamda+fai2(k,1).^2); 
    end
    %model
    if k<=500
        y2(k+1)=y2(k)/(1+y2(k).^2)+u2(k)^3;
    else
        y2(k+1)=(y2(k)*y2(k-1)*y2(k-2)*u2(k-1)*(y2(k-2)-1)+a(k)*u2(k))/(1+y2(k-1)^2+y2(k-2)^2);    
    end
    y2(k+1) = y2(k+1) + rand_data(k);
    for i=1:nu
        du2(k,i)=u2(k-i+1)-u2(k-i);
    end
    emax2(k+1)=yd(k+1)-y2(k+1);
end

% 求方差
var_y = sum((y - yd).^ 2) / N
var_y2 = sum((y2 - yd).^ 2) / N

err_y = cumsum((y - yd).^ 2);
err_y2 = cumsum((y2 - yd).^ 2);

clf;
mark=8;
step=20;
figure(1)
plot(0,'-k','MarkerSize',mark,'LineWidth',2);hold on;
plot(0,'-.bs','MarkerSize',mark,'LineWidth',2);hold on;
plot(0,'--r^','MarkerSize',mark,'LineWidth',2);hold on;

plot(yd,'k-','LineWidth',2);hold on;
plot(0:k,y,'-.b','LineWidth',2);hold on;
plot(1:step:N,y(1:step:N),'bs','MarkerSize',mark,'LineWidth',2);hold on;
plot(0:k,y2,'--r','LineWidth',2);
plot(10:step:N,y2(10:step:N),'r^','MarkerSize',mark,'LineWidth',2);hold on;
grid on;xlabel('时刻');ylabel('跟踪性能');legend({'y^{*}(k)','改进:\lambda=0.1时的输出y(k)','\lambda=0.1时的输出y(k)'},'Interpreter','tex');
xlim([0,1000]);

figure(2)
plot(0,'-.bs','MarkerSize',mark,'LineWidth',2);hold on;
plot(0,'--r^','MarkerSize',mark,'LineWidth',2);hold on;

plot(u,'-.b','LineWidth',2);hold on;
plot(1:step:N,u(1:step:N),'bs','MarkerSize',mark,'LineWidth',2);hold on;
plot(u2,'r--','LineWidth',2);
plot(10:step:N,u2(10:step:N),'r^','MarkerSize',mark,'LineWidth',2);hold on;
grid on;xlabel('时刻');ylabel('控制输入');legend({'改进:\lambda=0.1时的控制输入u(k)','\lambda=0.1时的控制输入u(k)'},'Interpreter','tex');


figure(3)
plot(0,'-.bs','MarkerSize',mark,'LineWidth',2);hold on;
plot(0,'--r^','MarkerSize',mark,'LineWidth',2);hold on;

plot(err_y,'-.b','LineWidth',2);hold on;
plot(1:step:N,err_y(1:step:N),'bs','MarkerSize',mark,'LineWidth',2);hold on;
plot(err_y2,'--r','LineWidth',2);grid on;
plot(10:step:N,err_y2(10:step:N),'r^','MarkerSize',mark,'LineWidth',2);hold on;
xlabel('时刻');ylabel('方差和');legend({'改进方法','原始'},'Interpreter','tex');
3045

3.仿真结果

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值