matlab_迭代学习控制_论文例子1_开环 三种方法

 

方法一、利用simulink的 from to workspace

clc;
clear;
K=50;  % 每次迭代的时间
J=180;  %总迭代次数
ts=0.001;  %采样时间
t=[0:ts:K*ts]';%仿真时间
yd=sin(2*pi*50*t);            %跟踪轨迹/期望输出
u(1:0.050/ts+1,1)=1; %第一次迭代输入
y_all=[];   %记录所有迭代所有时刻输出
e_all=[];   %记录所有迭代的所有时刻误差
u_all=[];    %记录所有迭代所有时刻输入

for j=1:J
    
simin=[t,u];
simout=sim('lunwenlizi1_diedai');
y_all=[y_all,yout];
e=yd-yout;
e_all=[e_all,e];

for k=1:K-1
u(k)=u(k)+0.5*e(k+1);   %迭代学习函数
end

u_all=[u_all,u];
end

%绘图观察实验效果
subplot(2,1,1)
plot(1:J,log(e_all(15,:)));   %第十五时刻误差随迭代的变换
subplot(2,1,2)
plot(1:18,y_all(1:18,50),'+');     %第五十次迭代前十八时刻的输出
hold on
plot(1:18,yd(1:18));

simulink文件:

matlab迭代学习控制论文中的例子三种方法-机器学习文档类资源-CSDN下载

方法二、给定传函转为状态方程

%%迭代学习控制论文中的例子一。给定离散传函转为状态方程。
%% P型学习算法
clc;
%求离散传函的状态空间表达式
num=[1 0];
den=conv([1 -0.9],[1 -0.9]);
P=tf(num,den,1)  %离散传递函数,设采样时间为1
[A,B,C,D]=tf2ss(num,den);

x1=[];   %两个状态变量
x2=[];
u=[];
e=[];
yd=[];
y=[];
%初始化
T=50;   %时间
J=100;  %迭代次数
x1(1:J,1)=[0];
x2(1:J,1)=[0];
u(1,1:T+1)=1;
yd=[];
lp=0.5;     %迭代学习控制渐进稳定判别准则一:q0*(1-l0*p1)=1*(1-0.5*1)=0.5<1

for j = 1:J
for k=1:T+1
    %状态空间
    x = A*[x1(j,k);x2(j,k)]+B*u(j,k);  %%!一个式子左边不可以同时赋两个变量
    x1(j,k+1)=x(1,:);
    x2(j,k+1)=x(2,:);
    y(j,k)=C*[x1(j,k);x2(j,k)]+D*u(j,k);    
    yd(j,k)=1-exp(-k);  %跟踪轨迹
end
for k=1:T     
    %迭代学习
    e(j,k+1)=yd(j,k+1)-y(j,k+1);
    u(j+1,k)=u(j,k) + lp * e(j,k+1);    
end
end

subplot(2,2,1)
plot(1:J,log10(abs(e(1:J,30))));    %观察第30s误差随迭代次数的变化
xlabel('j');ylabel('abs(e)');
subplot(2,2,2)
plot(1:0.6*T,y(80,1:0.6*T));   %观察第80次迭代,前30s内的输出
hold on
plot(1:0.6*T,yd(80,1:0.6*T),'r*');
xlabel('k');ylabel('y,yd');


% %%迭代学习控制论文中的例子一  给离散传函转为状态方程
% %% P型
% clc;
% N=100;
% x1=ones(N,N);   %%状态 x是二维的,得设两个变量
% x2=ones(N,N);
% u=ones(N,N);
% e=ones(N,N);
% yd=ones(N,N);
% y=ones(N,N);
% 
% A = [0,1;
%     -0.81,1.8];
% B = [0;
%     1];
% C = [0,1];
% D = 0;         %%%??????D若有值就发散了。。。。。
% [num,den]=ss2tf(A,B,C,D)
% p1=tf(num,den);   % 连续传函
% P2=tf(num,den,1)  % 离散传函  p0=0.6 p1=0.51
% 
% x1(:,1)=[0];
% x2(:,1)=[0];
%   u(:,1)=1;
%  lp=0.5;     %迭代学习控制判别准则 q0*(1-l0p1)=1*(1-1.25*0.51)=0.3625
% 
% 
% for j = 1:N-1
% for k=1:30
%     x = A*[x1(j,k);x2(j,k)]+B*u(j,k);  %%!一个式子左边不可以同时赋两个变量
%     x1(j,k+1)=x(1,:);
%     x2(j,k+1)=x(2,:);
%     y(j,k)=C*[x1(j,k);x2(j,k)]+D*u(j,k);     
%     yd(j,k)=0.5.*sin(0.06.*(k))+1.2.*sin(0.09.*(k));
% end
% for k=1:30
%     e(j,k+1)=yd(j,k+1)-y(j,k+1);
%     u(j+1,k)=u(j,k) + lp * e(j,k+1);    
% end
% end
% 
% k=1:30;
% subplot(2,2,1)
% plot(1:N,e(1:N,5));
% subplot(2,2,2)
% plot(k,y(99,1:30));
% hold on
% plot(k,yd(99,1:30),'r*');

num =

     0     1     0


den =

    1.0000   -1.8000    0.8100


P2 =
 
          z
  ------------------
  z^2 - 1.8 z + 0.81
 
Sample time: 1 seconds
Discrete-time transfer function.

方法三、 给定传函转为差分方程

 不如转为状态方程

% 迭代学习控制
%论文中的例子,系统为离散传递函数,有两个疑问。

%初值
u=ones(181,100);
e=ones(181,100);
yd=ones(181,100);
y=ones(181,100);
y(:,1)=1;
y(:,2)=2.8;%%????初始值通过传递函数算出来的,为什么差分方程算出来不一致?


% 系统
for j=1:180
for k=1:90

y(j,k+2)=1.8*(y(j,k+1))-0.81*y(j,k)+u(j,k+1);
end
for k=1:90
e(j,k+1)=yd(j,k+1)-y(j,k+1);
u(j+1,k)=u(j,k)+0.5*e(j,k+1);
end
end
j=1:181;k=1:100;
subplot(2,2,1)
stairs(k,y(30,:))
subplot(2,2,2)
stairs(j,log10(e(:,30)))

uu=ones(181,100);
num=[1,0];
den=[1 -1.8 0.81];
yy=filter(num,den,uu(1,:));
subplot(2,2,3)
stairs(k,yy)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_45111955

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

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

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

打赏作者

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

抵扣说明:

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

余额充值