小言_互联网的博客

多种控制率算法的实现案例(LQR、H无穷和神经网络算法等)(Matlab代码实现)

345人阅读  评论(0)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现

💥1 概述

  环形转子由叶轮 、轴承、永磁体 、导磁环 、衔铁和永磁体保持架组成 ,环形定子由外 筒、内环和线圈组成。其 中,环形转 子的磁极(衔铁 )与环形定子的极靴相对应且 同轴 ,而转子的叶轮暴露在引信体的外表面以将弹丸飞行时所产生 的气动能转换 为转 子转动 的机 械能。这样 ,弹丸飞行时所产生的气动能就驱动发电机转子的叶轮带动发电机的转子转动 ,形成变化的旋转磁场 ,从而导致发电机的电枢中产生感应 电动势 。

📚2 运行结果

2.1 利用PID来控制低压转速回路

2.2 将DRNC用于发动机转子转速的控制:

部分代码:

%将DRNC用于发动机转子转速的控制
%考虑双输入双输出
%Author:Taylon
%------------------------------------------------------------
clearvars;clc;

ALR=readfis('LR_engine2');

A=[-2.01 2.06;-0.0044 -2.92];
B=[0.84 1.2;0.53 0.28];
C=[1 0;-0.86 5.08];
D=[0 0;-0.21 0.56];
engine=ss(A,B,C,D);
Ts=0.04;
engineD=c2d(engine,Ts);
%step(engine,'-',engineD,'--')

%初始化控制对象
%ts=0.001;   %采样步长
L=500;     %仿真时长
r=zeros(L,1);
yr=zeros(L,1);
y=zeros(L,1);
u=zeros(L,1);
ec=zeros(L,1);
em=zeros(L,1);
yu=zeros(L,1);
ym=zeros(L,1);
alpha=0;  %动量系数
etaC=0.2;   %学习率
etaI=0.4;
%maxS=2;     %灵敏度最大值

%初始化DRNC(控制器)
Nc=6;pc=3;qc=1;
wc_in1=zeros(Nc,L);wc_in1(:,1)=0.1*ones(Nc,1);
wc_in2=zeros(Nc,L);wc_in2(:,1)=0.1*ones(Nc,1);
wc_in3=zeros(Nc,L);wc_in3(:,1)=0.1*ones(Nc,1);
wc_r=zeros(Nc,L);wc_r(:,1)=0.1*ones(Nc,1);
wc_out=zeros(Nc,L);wc_out(:,1)=0.1*ones(Nc,1);
Sc=zeros(Nc,L);diffSc=zeros(Nc,L);
Hc=zeros(Nc,L);
bhc=zeros(Nc,L);
boc=0.1*ones(1,L);
%权值的分配:[p*N N N q*N],一共分为6个部分
gradWc=0.01*ones((pc+qc+2)*Nc,L);
deltaWc=0.01*ones((pc+qc+2)*Nc,L);
gradBoc=0.01*ones(1,L);
deltaBoc=0.2*ones(1,L);
etac=0.08*ones(6,L);
p1c=Nc;p2c=2*Nc;
p3c=3*Nc;p4c=4*Nc;p5c=5*Nc;
Pc=zeros(Nc,L);
Q1c=zeros(Nc,L);Q2c=zeros(Nc,L);Q3c=zeros(Nc,L);


%初始化DRNI(识别器)
Ni=4;pi=2;qi=1;
wi_in1=zeros(Ni,L);wi_in1(:,1)=0.1*ones(Ni,1);
wi_in2=zeros(Ni,L);wi_in2(:,1)=0.1*ones(Ni,1);
wi_r=zeros(Ni,L);wi_r(:,1)=0.1*ones(Ni,1);
wi_out=zeros(Ni,L);wi_out(:,1)=0.1*ones(Ni,1);
Si=0.1*ones(Ni,L);diffSi=0.1*ones(Ni,L);
Hi=zeros(Ni,L);
bi=0.1*ones(Ni,L);
%权值的分配:[p*N N N q*N],一共分为5个部分
gradWi=zeros((pi+qi+2)*Ni,L);
deltaWi=zeros((pi+qi+2)*Ni,L);
etai=zeros(5,L);
p1i=Ni;p2i=2*Ni;
p3i=3*Ni;p4i=4*Ni;
Pi=zeros(Ni,L);
Q1i=zeros(Ni,L);Q2i=zeros(Ni,L);

PITr=[ones(L/2,1);zeros(L/2,1)];     %目标转速
nL=zeros(L,1);      %实际低压转速
PIT=zeros(L,1);      %实际高压转速
wf=zeros(L,1);      %燃油量

%仿真开始
for k=2:1:L
    %控制对象更新
    r(k)=PITr(k);
    yr(k)=PITr(k);
    
    xk=engineD.A*[nL(k-1);PIT(k-1)]+engineD.B*[wf(k);0];
    yk=engineD.C*[nL(k-1);PIT(k-1)]+engineD.D*[wf(k);0];
    nL(k)=xk(1);PIT(k)=xk(2);
    y(k)=PIT(k);u(k)=wf(k);
    
    %DRNC更新
    Hc(:,k)=wc_in1(:,k-1)*r(k)+wc_in2(:,k-1)*u(k-1)+wc_in3(:,k-1)*y(k-1)+wc_r(:,k-1).*Sc(:,k-1)+bhc(:,k-1);
    Sc(:,k)=Acfun(Hc(:,k));
    u(k)=(wc_out(:,k-1))'*Sc(:,k)+boc(k);
    wf(k+1)=u(k);
    
    %DRNI更新
    Hi(:,k)=wi_in1(:,k-1)*u(k)+wi_in2(:,k-1)*y(k-1)+wi_r(:,k-1).*Si(:,k-1)+bi(:,k-1);
    Si(:,k)=Acfun(Hi(:,k));
    ym(k)=(wi_out(:,k-1))'*Si(:,k);
    
    ec(k)=yr(k)-y(k);
    em(k)=y(k)-ym(k);
    %反馈阶段
    %求取灵敏度yu(k)
    yu(k)=wi_out(:,k-1)'*((1-Si(:,k).^2).*wi_in1(:,k-1));

    
    %计算DRNC权值梯度
    gradWc(p5c+1:end,k)=ec(k)*yu(k)*Sc(:,k);     %输出权值梯度
    diffSc(:,k)=diffAcfun(Hc(:,k));
    gradWc(p4c+1:p5c,k)=ec(k)*yu(k)*wc_out(:,k-1).*diffSc(:,k);   %隐含层偏置梯度
    Pc(:,k)=diffSc(:,k).*(Sc(:,k-1)+wc_r(:,k-1).*Pc(:,k-1));
    gradWc(p3c+1:p4c,k)=ec(k)*yu(k)*wc_out(:,k-1).*Pc(:,k);       %循环权值梯度
    Q3c(:,k)=diffSc(:,k).*(y(k-1)+wc_r(:,k-1).*Q3c(:,k-1));
    gradWc(p2c+1:p3c,k)=ec(k)*yu(k)*wc_out(:,k-1).*Q3c(:,k);       %第三个输入权值梯度
    Q2c(:,k)=diffSc(:,k).*(u(k-1)+wc_r(:,k-1).*Q2c(:,k-1));
    gradWc(p1c+1:p2c,k)=ec(k)*yu(k)*wc_out(:,k-1).*Q2c(:,k);       %第二个输入权值梯度
    Q1c(:,k)=diffSc(:,k).*(r(k)+wc_r(:,k-1).*Q1c(:,k-1)); 
    gradWc(1:p1c,k)=ec(k)*yu(k)*wc_out(:,k-1).*Q1c(:,k);       %第一个输入权值梯度
    gradBoc(k)=ec(k)*yu(k);
    %计算DRNC自适应学习率
    etac(6,k)=evalfis([abs(ec(k)) max(abs(gradWc(p5c+1:end,k)))],ALR);
    etac(5,k)=evalfis([abs(ec(k)) max(abs(gradWc(p4c+1:p5c,k)))],ALR);
    etac(4,k)=evalfis([abs(ec(k)) max(abs(gradWc(p3c+1:p4c,k)))],ALR);
    etac(3,k)=evalfis([abs(ec(k)) max(abs(gradWc(p2c+1:p3c,k)))],ALR);
    etac(2,k)=evalfis([abs(ec(k)) max(abs(gradWc(p1c+1:p2c,k)))],ALR);
    etac(1,k)=evalfis([abs(ec(k)) max(abs(gradWc(1:p1c,k)))],ALR);
    %etac(:,k)=etaC*(2*ec(k))^2;

    %计算权值变化量
    deltaWc(p5c+1:end,k)=etac(6,k)*gradWc(p5c+1:end,k);
    deltaWc(p4c+1:p5c,k)=etac(5,k)*gradWc(p4c+1:p5c,k);
    deltaWc(p3c+1:p4c,k)=etac(4,k)*gradWc(p3c+1:p4c,k);
    deltaWc(p2c+1:p3c,k)=etac(3,k)*gradWc(p2c+1:p3c,k);
    deltaWc(p1c+1:p2c,k)=etac(2,k)*gradWc(p1c+1:p2c,k);
    deltaWc(1:p1c,k)=etac(1,k)*gradWc(1:p1c,k);
    deltaBoc(k)=etac(6,k)*gradBoc(k);
    
    %权值更新
    wc_out(:,k)=wc_out(:,k-1)+deltaWc(p5c+1:end,k);
    bhc(:,k)=bhc(:,k-1)+deltaWc(p4c+1:p5c,k);
    wc_r(:,k)=wc_r(:,k-1)+deltaWc(p3c+1:p4c,k);
    wc_in3(:,k)=wc_in3(:,k-1)+deltaWc(p2c+1:p3c,k);
    wc_in2(:,k)=wc_in2(:,k-1)+deltaWc(p1c+1:p2c,k);
    wc_in1(:,k)=wc_in1(:,k-1)+deltaWc(1:p1c,k);
    boc(k)=boc(k-1)+deltaBoc(k);
    
    %计算DRNI权值梯度
    gradWi(p4i+1:end,k)=em(k)*Si(:,k);     %输出权值梯度
    diffSi(:,k)=diffAcfun(Hi(:,k));
    gradWi(p3i+1:p4i,k)=em(k)*wi_out(:,k-1).*diffSi(:,k);   %隐含层偏置梯度
    Pi(:,k)=diffSi(:,k).*(Si(:,k-1)+wi_r(:,k-1).*Pi(:,k-1));
    gradWi(p2i+1:p3i,k)=em(k)*wi_out(:,k-1).*Pi(:,k);       %循环权值梯度
    Q2i(:,k)=diffSi(:,k).*(y(k-1)+wi_r(:,k-1).*Q2i(:,k-1));
    gradWi(p1i+1:p2i,k)=em(k)*wi_out(:,k-1).*Q2i(:,k);       %第二个输入权值梯度
    Q1i(:,k)=diffSi(:,k).*(u(k)+wi_r(:,k-1).*Q1i(:,k-1)); 
    gradWi(1:p1i,k)=em(k)*wi_out(:,k-1).*Q1i(:,k);       %第一个输入权值梯度
    %计算DRNI自适应学习率
%     etai(5,k)=1./max(gradWi(p4i+1:end,k).^2);
%     etai(4,k)=1./max(gradWi(p3i+1:p4i,k).^2);
%     etai(3,k)=1./max(gradWi(p2i+1:p3i,k).^2);
%     etai(2,k)=1./max(gradWi(p1i+1:p2i,k).^2);
%     etai(1,k)=1./max(gradWi(1:p1i,k).^2);
    etai(:,k)=etaI;
    %计算权值变化量
    deltaWi(p4i+1:end,k)=etai(5,k)*gradWi(p4i+1:end,k)+alpha*deltaWi(p4i+1:end,k-1);
    deltaWi(p3i+1:p4i,k)=etai(4,k)*gradWi(p3i+1:p4i,k)+alpha*deltaWi(p3i+1:p4i,k-1);
    deltaWi(p2i+1:p3i,k)=etai(3,k)*gradWi(p2i+1:p3i,k)+alpha*deltaWi(p2i+1:p3i,k-1);
    deltaWi(p1i+1:p2i,k)=etai(2,k)*gradWi(p1i+1:p2i,k)+alpha*deltaWi(p1i+1:p2i,k-1);
    deltaWi(1:p1i,k)=etai(1,k)*gradWi(1:p1i,k)+alpha*deltaWi(1:p1i,k-1);
    
    %权值更新
    wi_out(:,k)=wi_out(:,k-1)+deltaWi(p4i+1:end,k);
    bi(:,k)=bi(:,k-1)+deltaWi(p3i+1:p4i,k);
    wi_r(:,k)=wi_r(:,k-1)+deltaWi(p2i+1:p3i,k);
    wi_in2(:,k)=wi_in2(:,k-1)+deltaWi(p1i+1:p2i,k);
    wi_in1(:,k)=wi_in1(:,k-1)+deltaWi(1:p1i,k);
end

%展示
kk=1:L;
P1=figure(1);
set(P1,'position',[200 400 800 600]);
plot(kk,y,'b--',kk,yr,'k-',kk,ym,'r:');
legend('实际输出','目标输出','识别输出');

🎉3 参考文献

[1]王劲松,林明耀,钱元成.微型稳速无刷直流电动机结构和控制分析[J].微特电机,2004(08):11-13.

🌈4 Matlab代码实现


转载:https://blog.csdn.net/weixin_46039719/article/details/127660500
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场