【MFAC】基于偏格式动态线性化的无模型自适应控制(Matlab代码)

例题来源:侯忠生教授的《无模型自适应控制:理论与应用》(2013年科学出版社)。

👉对应书本 4.3 单输入单输出系统(SISO)偏格式动态线性化(PFDL)的无模型自适应控制(MFAC)

上一篇博客介绍了基于紧格式动态线性化的无模型自适应控制。
【Matlab】基于紧格式动态线性化的无模型自适应控制
紧格式动态线性化(CFDL)与偏格式动态线性化(PFDL)的格式类似,但偏格式动态线性化(PFDL)多了一个控制变量,线性化长度由1变成L.

例题4.4

1.题目要求

在这里插入图片描述

在CFDL中,线性化长度常数 L=1,步长因子仅有1个( ρ \rho ρ),伪偏导数(PPD) ϕ c \phi_c ϕc 是一个数,而在PFDL中,PPD ϕ p , L \phi_{p,L} ϕp,L 是一个 L 维的向量,步长因子增多( ρ 1 , ρ 2 , . . . , ρ L y \rho_1,\rho_2,...,\rho_{L_y} ρ1,ρ2,...,ρLy)。

在这里插入图片描述

2.matlab代码

clear all; clc;

%% 控制器参数
L=3; % 输入阶数
eta=0.5; % 伪偏导步长
miu=1; % 伪偏导权重
rho=0.5; % 控制律步长 rho1=rho2=rho3=0.5
lamda=0.01; % 控制律权重
epsilon=1e-5; % 伪偏导重置阈值
N=400; %采样时间

%% 初值
y(1:6)=0; y(4)=1;
u(1:5)=0;
du(1:5,1:L)=0;

%% 期望值
for k=1:N+1
    yd(k)=5*(-1)^round(k/80);
end
figure(1)
plot(yd,'k');
hold on;

%% 控制器伪偏导数初值
% phi_{p,L}(k) = [phi_1(k), phi_2(k),...,phi_L(k)]^T
% phi(k,i):第1个参数是k(1~N),第2个参数是i(1~L)
phi(1:5,1)=1;
phi(1:5,2:L)=0;

for k=6:N
    %% 伪偏导更新
    % Delta{U_L(k)} = [Delta{u(k)}, Delta{u(k-1)},...,Delta{u(k-(L-1))}]^T
    % du(k,i):第1个参数是k(1~N),第2个参数是i(1~L)
    phi(k,1:L)=phi(k-1,1:L)+eta*(y(k)-y(k-1)-phi(k-1,1:L)*du(k-1,1:L)')*du(k-1,1:L)/(miu+du(k-1,1:L)*du(k-1,1:L)');
    % 伪偏导重置
    if abs(phi(k,1))<=epsilon | abs(du(k-1, 1:L))<= epsilon | sign(phi(k,1))~=sign(phi(1,1))
        phi(k,1)=0.5;
    end
    
    %% 控制律更新
    if L==1
        u(k) = u(k-1)+rho*phi(k,1)*(yd(k+1)-y(k))/(lamda+phi(k,1).^2);       
    else
        u(k) = u(k-1)+rho*phi(k,1)*(yd(k+1)-y(k)-phi(k,2:L)*du(k-1,1:L-1)')/(lamda+phi(k,1).^2); 
    end
    
    %% 系统函数
    if k<=200
        y(k+1)=2.5*y(k)*y(k-1)/(1+y(k).^2+y(k-1).^2)+0.7*sin(0.5*(y(k)+y(k-1)))+1.4*u(k-1)+1.2*u(k);
    else
        y(k+1)=-0.1*y(k)-0.2*y(k-1)-0.3*y(k-2)+0.1*u(k)+0.02*u(k-1)+0.03*u(k-2);    
    end
    
    for i=1:L
        du(k,i)=u(k-i+1)-u(k-i);
    end
    error(k+1)=yd(k+1)-y(k+1);
end

%% 画图
figure(1)
plot(y,'--r');
xlim([0 400]); ylim([-15 15]);
xlabel('time'); ylabel('tracking performance');
legend('y*(k)', 'PFDL-MFAC');
title('PFDL-MFAC tracking performance');

figure(2)
plot(u,'b');
ylim([-60 60]);
xlabel('time'); ylabel('input');
title('PFDL-MFAC input');

figure(3)
plot(phi(:,1),'b--');hold on;
plot(phi(:,2),'r--');hold on;
plot(phi(:,3),'g--');
xlabel('time'); ylabel('PPD');
legend('\phi_1(k)','\phi_2(k)','\phi_3(k)');
title('PFDL-MFAC \phi_{p,L}(k)');

figure(4)
plot(error);
xlabel('time'); ylabel('tracking error');
title('PFDL-MFAC tracking error')

3.运行结果

跟踪性能

跟踪性能

控制输入

控制输入

PPD估计

在这里插入图片描述

跟踪误差

在这里插入图片描述

例题4.5

1.题目要求

在这里插入图片描述

取 a(k)=1

2.matlab代码

clear all; clc;

%% 控制器参数
L=3; % 输入阶数
eta=0.5; % 伪偏导步长
miu=1; % 伪偏导权重
rho=0.5; % 控制律步长 rho1=rho2=rho3=0.5
lamda=0.01; % 控制律权重
epsilon=1e-5; % 伪偏导重置阈值
N=800; %采样时间

%% 初值
y(1:6)=0; y(4)=1;
u(1:5)=0;
du(1:5,1:L)=0;

%% 期望值
for k=1:N+1
    yd(k)=0.5*(-1)^round(k/50);
end
figure(1)
plot(yd,'k');
hold on;

%% 控制器伪偏导数初值
% phi_{p,L}(k) = [phi_1(k), phi_2(k),...,phi_L(k)]^T
% phi(k,i):第1个参数是k(1~N),第2个参数是i(1~L)
phi(1:5,1)=1;
phi(1:5,2:L)=0;

for k=6:N
    %% 伪偏导更新
    % Delta{U_L(k)} = [Delta{u(k)}, Delta{u(k-1)},...,Delta{u(k-(L-1))}]^T
    % du(k,i):第1个参数是k(1~N),第2个参数是i(1~L)
    phi(k,1:L)=phi(k-1,1:L)+eta*(y(k)-y(k-1)-phi(k-1,1:L)*du(k-1,1:L)')*du(k-1,1:L)/(miu+du(k-1,1:L)*du(k-1,1:L)');
    % 伪偏导重置
    if abs(phi(k,1))<=epsilon | abs(du(k-1, 1:L))<= epsilon | sign(phi(k,1))~=sign(phi(1,1))
        phi(k,1)=0.5;
    end
    
    %% 控制律更新
    if L==1
        u(k) = u(k-1)+rho*phi(k,1)*(yd(k+1)-y(k))/(lamda+phi(k,1).^2);       
    else
        u(k) = u(k-1)+rho*phi(k,1)*(yd(k+1)-y(k)-phi(k,2:L)*du(k-1,1:L-1)')/(lamda+phi(k,1).^2); 
    end
    
    %% 系统函数
    y(k+1)=(y(k)*y(k-1)*y(k-2)*u(k-1)*(y(k)-1)+(1+1)*u(k)) / (1+y(k)^2+y(k-1)^2+y(k-2)^2);
    
    for i=1:L
        du(k,i)=u(k-i+1)-u(k-i);
    end
    error(k+1)=yd(k+1)-y(k+1);
end

%% 画图
plot(y,'--r');
xlim([0 800]); 
xlabel('time'); ylabel('tracking performance');
legend('y*(k)', 'PFDL-MFAC');
title('PFDL-MFAC tracking performance');

3.运行结果

在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不雨_亦潇潇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值