Goodwin模型参考自适应控制方案

本篇博客简要介绍Goodwin控制方案,并进行了Matlab实现。

      博主在完成自适应控制小课程设计时需要用到Goodwin MRAC控制方案,但是在国内外网站上均没有找到简单易懂的参考资料,而学校用到的教材中也只是简要介绍甚至还有错误。因此,仔细拜读了Goodwin大牛编写的教材《自适应滤波预测与控制》明白了一二,故写下本篇博客进行记录。

      首先,先介绍我们需要完成的控制任务

        在Goodwin教授的书上模型参考控制的结构图如下,我们这里只要求跟踪输入信号,故G=H/E为1.

        系统对象参数未知,因此要用到自适应预测器估计参数值。Goodwin教授介绍了两种估计方法,直接估计和间接估计,而博主课上只提到了直接估计,因此选择直接估计法里不受限的情况。

        直接算法构建自适应预测器,当预测输出是参数θ的线性函数时,对于不受限的情况,预测器的输出可描述为:

        这个式子是通过离散系统推导定义出来的,具体过程参见《自适应技术的理论及应用(第二版)》3.5节离散时域模型参考自适应控制系统。

        此处注意:在本书此节有一处错误和一处未点清的地方

        ①下图中a0的位置应该是a1

         ②在求gi时,如果i+d-j>n,ai+d-j认为是零

        其中信号向量:

         基于投影算法自适应d步超前预测器为:

        对于给定的参考序列,要求

        定义输出误差为:

        控制规律如下,可导致输出误差为零:

        完整代码如下:

        (可任意更改参考模型阶数及延迟时间)

Author:GBH
Date:2022.5.8
clear;clc;
%仿真步长及仿真次数
h=0.1; L=100/h;
m=4; n=4; d=2;
%测试信号-参考输出
r=1;     %幅值为r
t=1:1000+d;
%y_ref=r*square(t/250*pi);  %周期为250 4pi/(pi/125)
y_ref=sin(t/250*pi);  %周期为250 2pi/(pi/125)
%初始化,移迟部分设置为0
for i=1:d
    u(i)=0;
    y(i)=0;
    Ceta(:,i)=zeros(m+n+d,1);
    Fai_turn(i,:)=zeros(1,m+n+d);
end
%求解Fai(k)的转置
%Fai_turn(k)=[y(k),y(k-1),```,y(k-n+1),u(k),u(k-1),```,u(k-m-d+1)]
for k=d+1:L
    %Fain_turn(k);
    for i=1:n
        if((k-i+1<1)||(i==1))   %k-i+1<0即y(k)中k<0;i==1即y(k).两者分别为不存在或未知的因此设为零
             Fai_turn(k,i)=0;
        else
            Fai_turn(k,i)=y(k-i+1);
        end
    end
    for i=1:m+d
         if((k-i+1<1)||(i==1))
            Fai_turn(k,n+i)=0;
         else
            Fai_turn(k,n+i)=u(k-i+1);
         end
    end
    %根据Fai_turn(k)、Ceta(k)、y(k)求解Ceta(k),设a(k)=1,c=1
    Ceta(:,k)=Ceta(:,k-1)+Fai_turn(k-d,:)'*(y_ref(k)-Fai_turn(k-d,:)*Ceta(:,k-1))/(1+Fai_turn(k-d,:)*Fai_turn(k-d,:)');
    %输入差值为:参考数值-预测输出,设Beta(k)=1
    u(k)=y_ref(k+d)-[Fai_turn(k,1:n-1),Fai_turn(k,n+1:m+n+d)]*[Ceta(1:n-1,k);Ceta(n+1:m+n+d,k)];
    %将缺失的beta0填上
    Fai_turn(k,n)=u(k);
    y(k+d)=Fai_turn(k,:)*Ceta(:,k);    %预测器
end
%图像显示
%合并显示
figure(1);
plot(t,y_ref,'b',t,y,'r');set(gca,'YLim',[-1.5 1.5]);
%分开显示
figure(2);
subplot(2,1,1);
plot(t,y_ref,'b');set(gca,'YLim',[-1.5 1.5]);
subplot(2,1,2);
plot(t,y,'r');set(gca,'YLim',[-1.5 1.5]);

结果(蓝色的为输入信号,红色的为跟踪信号):

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值