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

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

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

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

目录

💥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代码实现

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荔枝科研社

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

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

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

打赏作者

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

抵扣说明:

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

余额充值