%%クリア環境変数は
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