参考文献:《基于无模型自适应控制的反馈-前馈迭代学习控制系统收敛性研究》
其中控制律的设计分为两部分:前馈部分和反馈部分。系统采用伪偏导进行估计,其中算法针对的系统为:
整个控制律的设计如下:
仿真系统函数为:
期望曲线为:
根据控制律编写matlab代码如下(可以复制,但是还是建议自己照着控制律敲一下,可以加深对控制律的理解和代码编写能力):
% 期望轨迹
for k = 1:1:500
if k < 250
yd(k+1) = 0.5*(-1).^(round(k/100));
else
yd(k+1) = 0.5*sin((k*pi)/100) + 0.3*cos((k*pi)/50);
end
end
% 参数设置
epsilon = 0.01;
eta = 1;
rho = 0.2;
lamda = 1;
mu = 2;
% 控制过程
i_n = 60; %迭代次数
y(1:i_n,1:500) = 0;
for i = 1:1:i_n
for k = 1:1:500
if k == 1
phi(i,k) = 0.4;
elseif k == 2
phi(i,k) = phi(i,k-1) + (eta*(ub(i,k-1) - 0)/(mu + norm(ub(i,k-1) - 0)^2))*(y(i,k) - 0 - phi(i,k-1)*(ub(i,k-1) - 0));
else
phi(i,k) = phi(i,k-1) + (eta*(ub(i,k-1) - ub(i,k-2))/(mu + norm(ub(i,k-1) - ub(i,k-2))^2))*(y(i,k) - y(i,k-1) - phi(i,k-1)*(ub(i,k-1) - ub(i,k-2)));
end
if i == 1
uf(i,k) = 0;
else
uf(i,k) = uf(i-1,k) + 0.4*e(i-1,k+1);
end
if k == 1
ub(i,k) = 0;
else
ub(i,k) = ub(i,k-1) + (rho*phi(i,k)/(lamda + norm(phi(i,k))^2))*(yd(k+1) - y(i,k));
end
if k>2 && (phi(i,k) <= epsilon || (abs(ub(i,k-1) - ub(i,k-2)) <= epsilon))
phi(i,k) = phi(i,1);
end
u(i,k) = uf(i,k) + ub(i,k);
%系统函数
if k <250
y(i,k+1) = y(i,k)*u(i,k)/(1 + norm(y(i,k))^2) + (u(i,k) + 0.1*round(k/500)*sin(y(i,k)))^3;
else
y(i,k+1) = y(i,k)*u(i,k)^3/(1 + norm(y(i,k))^2) + u(i,k)^3;
end
e(i,k+1) = yd(k+1) - y(i,k+1);
end
end
%误差
for i =1:1:i_n
e_min(i) = max(abs(e(i,:)));
end
figure(1)
plot(yd,'r'); hold on;
plot(y(i_n,:),'b'); title('µü´ú10´Î');
figure(2)
plot(e_min);title('error of time k');
仿真结果:迭代10次结果:
50次迭代:
50次迭代.jpg
100次迭代:
100迭代.jpg
100次迭代的误差收敛结果:
100_min.jpg
100_max.jpg
github链接地址。
网友评论