ニューラルネットワークに基づくPIDコントローラー

 
%%クリア環境変数は
CLC
クリア
すべて閉じ
%%粒子初期
%2つの粒子群れアルゴリズムのパラメータ
C1 = 1.49445;
C2 = 1.49445;
最大値と最小重み
WMAX = 0.9;
WMIN = 0.1;
最大および最小速度
値Vmax = 0.03 ;
Vmin = -0.03;
%最大および最小の個々の
popmax = 0.3;
popmin = -0.3;

maxgen = 50;%進化数  
sizepop = 20;%人口サイズ


i = 1の母集団ランダムに生成します:sizepop
    pop(i、:)    = 0.03 * rand(1,45);%個々のコーディング
    フィットネス(i)= fun(pop(i、:));%染色体フィットネス
    V( i、:)= 0.003 * rands(1,45);%初期化速度
終了

%%初期母集団の極値
%最良の染色体を見つける
[bestfitness bestindex] = min(fitness);
zbest = pop(bestindex、:);%global best
gbest = pop;%individual best
Fitnessgbest = Fitness;%individual best Best Fitness value
Fitnesszbest = bestfitness;%Global best Fitness value

%%
i = 1:maxgenの反復最適化     j = 1:sizepopの
    i

        w =(wmax-wmin)*(i-1)/(maxgen)+ wmin;%重み線形変化
        V(j、:) = w * V(j、:) + c1 * rand *(gbest(j 、: )-pop(j、:))+ c2 * rand *(zbest-pop(j、:));%速度更新
        V(j、find(V(j、:)> Vmax))= Vmax;%は少ない最大速度より
        V(j、find(V(j、:) <Vmin))= Vmin;%が最小速度よりも大きい
        %population update
        pop(j、:) = pop(j、:) + 0.5 * V (j、:);
        for k = 1:45
            if rand> 0.95
                pop(j、k)= 0.3 * rand;%適応突然変異
            終了
        終了
        pop(j、find(pop(j、:)> popmax))= popmax ;%個人よりも小さい最大
        pop(j、find(pop(j、:) <popmin))= popmin;%は個人の最小値よりも大きい

        %フィットネス値
        fitness(j)= fun(pop(j、:));
    end
    
    for j = 1:sizepop
        %個々の極値の更新
        if Fitness(j)<fitnessgbest(j)
            gbest(j、:) = pop(j 、:);
            Fitnessgbest(j)= Fitness(j);
        終了

        %
        fitness(j)<fitnesszbest
            zbest = pop(j、:);
            Fitnesszbest = Fitness(j);
        end
    endの場合のグローバル極値更新
    
    %最適なフィットネス値を記録します
    yy(i)= Fitnesszbest;

終わり

%%最適な個別制御
figure(1)
plot(yy)
title( '粒子群アルゴリズム進化プロセス');
xlabel( '進化代数'); ylabel( 'フィットネス');

個人= zbest;

w11 = reshape(individual(1:6)、3,2);
w12 = reshape(individual(7:12)、3,2);
w13 = reshape(individual(13:18)、3,2);

w21 =個人(19:27);
w22 =個人(28:36);
w23 =個人(37:45);

rate1 = 0.006; rate2 = 0.001;%学習率
k = 0.3; K = 3;
y_1 = zeros(3,1); y_2 = y_1; y_3 = y_2;%出力値
u_1 = zeros(3,1); u_2 = u_1; u_3 = u_2;%制御率
h1i = zeros(3,1); h1i_1 = h1i;%最初の制御量
h2i = zeros(3,1); h2i_1 = h2i;%2番目の制御量
h3i = zeros(3 、1); h3i_1 = h3i;%3番目の空室量
x1i = zeros(3,1); x2i = x1i; x3i = x2i; x1i_1 = x1i; x2i_1 = x2i; x3i_1 = x3i;%隠れ層の出力 

%重みの初期化
k0 = 0.03;

%値制限
ynmax = 1; ynmin = -1;%システム出力値制限
xpmax = 1; xpmin = -1;%Pノード出力制限
qimax = 1; qimin = -1;%Iノード出力制限
qdmax = 1; qdmin = -1;%Dノードの出力制限
uhmax = 1; uhmin = -1;%出力結果の制限

k = 1:1:200の場合

    %--------------------------------ネットワークフォワード計算--------------- ------------
    
    %システム出力
    y1(k)=(0.4 * y_1(1)+ u_1(1)/(1 + u_1(1)^ 2)+0.2 * u_1(1) ^ 3 + 0.5 * u_1(2))+ 0.3 * y_1(2);
    y2(k)=(0.2 * y_1(2)+ u_1(2)/(1 + u_1(2)^ 2)+0.4 * u_1 (2)^ 3 + 0.2 * u_1(1))+ 0.3 * y_1(3);
    y3(k)=(0.3 * y_1(3)+ u_1(3)/(1 + u_1(3)^ 2)+ 0.4 * u_1(3)^ 3 + 0.4 * u_1(2))+ 0.3 * y_1(1);
    
    r1(k)= 0.1 +(0.01 * sin(2 * pi * k / 100));
    r2(k) = 0.3 +(0.03 * sin(2 * pi * k / 100));
    r3(k)= 0.5 +(0.05 * sin(2 * pi * k / 100));%制御ターゲット
    
    %システム出力制限
    yn = [ y1(k)、y2(k)、y3(k)];
    yn(find(yn> ynmax))= ynmax;
    yn(find(yn <ynmin))= ynmin;
    
    %入力層出力
    x1o = [r1(k ); yn(1)]; x2o = [r2(k); yn(2)]; x3o = [r3(k); yn(3)];
    
    %隠れ層 
    x1i = w11 * x1o;
    x2i = w12 * x2o;
    x3i = w13 * x3o;

    %比例ニューロンP計算
    xp =(x1i(1)、x2i(1)、x3i(1)];
    xp(find(xp> xpmax))= xpmax;
    xp(find(xp <xpmin))= xpmin;
    qp = xp;
    h1i(1)= qp(1); h2i(1)= qp(2); h3i(1)= qp(3);

    %積分ニューロンIの計算
    xi = [x1i(2)、x2i(2)、x3i(2)];
    qi = [0,0,0]; qi_1 = [h1i(2)、h2i(2)、h3i(2 )];
    qi = qi_1 + xi;
    qi(find(qi> qimax))= qimax;
    qi(find(qi <qimin))= qimin;
    h1i(2)= qi(1); h2i(2)= qi( 2); h3i(2)= qi(3);

    %微分ニューロンD計算
    xd = [x1i(3)、x2i(3)、x3i(3)];
    qd = [0 0 0];
    xd_1 = [x1i_1(3)、x2i_1(3)、x3i_1(3)] ;
    qd = xd-xd_1;
    qd(find(qd> qdmax))= qdmax;
    qd(find(qd <qdmin))= qdmin;
    h1i(3)= qd(1); h2i(3)= qd(2) ; h3i(3)= qd(3);

    %出力層の計算
    wo = [w21; w22; w23]; qo
    = [h1i '、h2i'、h3i ']; qo = qo';
    uh = wo * qo;
    uh(find(uh> uhmax))= uhmax;
    uh(find(uh <uhmin))= uhmin;
    u1(k)= uh(1); u2(k)= uh(2); u3(k)= uh(3);%制御法
    
    %---- ----------------------------------ネットワークフィードバックの修正------------- ---------
    
    %計算エラー
    エラー= [r1(k)-y1(k); r2(k)-y2(k); r3(k)-y3(k)];  
    エラー1(k) = error(1); error2(k)= error(2); error3(k)= error(3);
    J(k)= 0.5 *(error(1)^ 2 + error(2)^ 2 + error( 3)^ 2);%Resize
    ypc = [y1(k)-y_1(1); y2(k)-y_1(2); y3(k)-y_1(3)];
    uhc = [u_1(1)- u_2(1); u_1(2)-u_2(2); u_1(3)-u_2(3)];
    
    %非表示レイヤーと出力レイヤーの重み調整

    %Adjust w21
    Sig1 = sign(ypc ./(uhc(1)+0.00001));
    dw21 = sum(error。* Sig1)*
    qo ';   w21 = w21 + rate2 * dw21;
    
    %Adjust w22
    Sig2 = sign(ypc。 /(uh(2)+0.00001));
    dw22 = sum(error。* Sig2)*
    qo '; w22 = w22 + rate2 * dw22;
    
    %adjust w23
    Sig3 = sign(ypc ./(uh(3)+0.00001) );
    dw23 = sum(error。* Sig3)* qo '; w23
    = w23 + rate2 * dw23;

    %輸入層和隐輸入層評価值调整
    delta2 = zeros(3,3);
    wshi = [w21; w22; w23];
    t = 1:1:3の場合
        delta2(1:3、t)= error(1:3)。* sign(ypc(1:3)./(uhc(t)+0.00000001));
    端
    J = 1:1:3
        SGN(J)=符号((h1i(J)-h1i_1(J))/(X1I(J)-x1i_1(J)0.00001))。
    end
 
     s1 = sgn '* [r1(k)、y1(k)];
     wshi2_1 = wshi(1:3,1:3);
     alter = zeros(3,1);
     dws1 = zeros(3,2);
     j = 1:1:3の
         場合p = 1:1:3の場合
             alter(j)= alter(j)+ delta2(p、:)* wshi2_1(:、j);      p = 1:1:3の
         終了
     終了          dws1(p、:) = alter(p)* s1(p、:) .;      終了      w11 = w11 + rate1 * dws1;
     



     %调整w12
    for j = 1:1:3
        sgn(j)= sign((h2i(j)-h2i_1(j))/(x2i(j)-x2i_1(j)+0.0000001));
    end
    s2 = sgn '* [r2(k)、y2(k)];
    wshi2_2 = wshi(:、4:6);
    alter2 = zeros(3,1);
    dws2 = zeros(3,2);
    j = 1:1:3の
        場合p = 1:1:3の場合
            alter2(j)= alter2(j)+ delta2(p、:) * wshi2_2(:、j);     p = 1:1:3の
        終了
    終了         dws2(p、:) = alter2(p)* s2(p、:) .;     終了     w12 = w12 + rate1 * dws2;     %调整w13     for j = 1:1:3         sgn(j)= sign((h3i(j)-h3i_1(j))/(x3i(j)-x3i_1(j)+0.0000001));     end     s3 = sgn '* [r3(k)、y3(k)];     wshi2_3 = wshi(:、7:9);




    






    alter3 = zeros(3,1);
    dws3 = zeros(3,2);
    for j = 1:1:3
        for p = 1:1:3
            alter3(j)=(alter3(j)+ delta2(p、:) * wshi2_3(:、j));     p = 1:1:3の
        終了
    終了         dws3(p、:) = alter2(p)* s3(p、:) .;     終了     w13 = w13 + rate1 * dws3;



    %参数更新
    u_3 = u_2; u_2 = u_1; u_1 = uh;
    y_2 = y_1; y_1 = yn;
    h1i_1 = h1i; h2i_1 = h2i; h3i_1 = h3i;
    x1i_1 = x1i; x2i_1 = x2i; x3i_1 = x3i;
終わり

time = 0.001 *(1:k);
figure(2)
subplot(3,1,1)
plot(time、r1、 'r-'、time、y1、 'b-');
title( 'PIDニューロンネットワーク制御');
ylabel('制御量1 ');
legend('制御ターゲット '、'実際の出力 '、' fontsize '、12);
subplot(3,1,2)
plot(time、r2、' r- '、 time、y2、 'b-');
ylabel( '制御量2');
legend( '制御ターゲット'、 '実際の出力'、 'fontsize'、12);
axis([0,0.2,0、1])
subplot(3,1,3)
plot(time、r3、 'r-'、time、y3、 'b-');       
xlabel( 'time / s');
ylabel( '制御量3');
legend( 'コントロールターゲット '、'実際の出力 '、' fontsize '、12);

figure(3)
plot(time、u1、 'r-'、time、u2、 'g-'、time、u3、 'b');
title( 'PIDニューラルネットワークからオブジェクトに提供される制御入力');
xlabel( 'Time')、ylabel( 'Control Law');
legend( 'u1'、 'u2'、 'u3'); grid

figure(4)
plot(time、J、 'r-');
axis([0,0.1,0,0.5]); grid
title( 'ネットワーク学習目的関数J動的曲線');
xlabel( '時間'); ylabel( '制御エラー');  


%Webブラウザhttp://www.ilovematlab.cn/thread-62563-1-1.html

おすすめ

転載: blog.csdn.net/ccsss22/article/details/114446466