Laboratorium Modelowania i Symulacji
Ćwiczenie 5
Modelowanie nieliniowego systemu dynamicznego za pomocą sztucznej sieci neuronowej
Program ćwiczenia
Przed wykonaniem kolejnych punktów programu ćwiczenia należy zapoznać się z załączonymi programami w języku Matlaba,
Dla wybranych parametrów nieliniowego systemu dynamicznego (dyskretny liniowy podsystem dynamiczny II-ego rzędu):
sprawdzić zachowanie dyskretnego liniowego podsystemu dynamicznego II-ego rzędu generując odpowiedź skokową lub impulsową (funkcje dstep lub dimpulse),
za pomocą programu ham wygenerować ciąg 1000 wzorców odpowiedzi nieliniowego systemu dynamicznego na wymuszenie w postaci ciągu pseudolosowego o rozkładzie równomiernym,
Uruchomić program narx2 identyfikacji modelu neuronowego systemu metodą wstecznej propagaccji błędów:
Uwaga: przed uruchomieniem programu należy podać początkową wartość współczynnika uczenia i parametru sterującego inicjalizacją wag wypisując polecenia
i = 1; lr = 0.01;
zbadać wpływ początkowej wartości współczynnika uczenia na przebieg identyfikacji,
zbadać wpływ zmian struktury modelu neuronowego na przebieg identyfikacji,
Wykonać testowanie modelu neuronowego za pomocą programu narx2t.
Uruchomić program idnarx identyfikacji modelu neuronowego metodą Marquardta.
Wykonać dodatkowe symulacje według zaproponowanego prze grupę indywidualnego planu.
Sprawozdanie
Sprawozdanie powinno zawierać raport z przebiegu ćwiczenia z wykresami otrzymanych przebiegów sygnałów i parametrów oraz uwagami i wnioskami.
Programy wykorzystywane w ćwiczeniu
3.1 HAM.M - modelowanie systemu Hammersteina
% ch-ka statyczna v=sign(u)
% sygnał wejściowy u-szum o r.r (-0.5,0.5)
% x znormalizowany do przedziału (-2,2)
% N - liczba pomiarów
function[y,u,u1,u2,ymax]=ham(NN);
n=[0 0.21 -0.01]; d=[1 -0.3 -0.6];
t=[0:NN-1]; s=size(t);
% generowanie sygnału wejściowego
u=rand(s)-0.5*ones(s);
u=4*u; u=u';
% obliczenie sygnału wyjściowego podsystemu nieliniowego
for i=1:NN,
if abs(u(i))>=1, v(i)=sign(u(i)); else v(i)=u(i); end;
end;
% obliczenie sygnału wyjściowego podsystemu liniowego
y=dlsim(n,d,v);
u1(1)=0; u1(2:NN)=u(1:NN-1); u1=u1';
u2(1)=0; u2(2:NN)=u1(1:NN-1); u2=u2';
y1(1)=0; y1(2:NN)=y(1:NN-1); y1=y1';
y2(1)=0; y2(2:NN)=y1(1:NN-1); y2=y2';
ymax=max(abs(y));
v1(1)=0; v1(2:NN)=v(1:NN-1); v1=v1';
v2(1)=0; v2(2:NN)=v1(1:NN-1); v2=v2';
end;
y=[y1 y2 y];
3.2. narx2.m - identyfikacja nieliniowego systemu dynamicznego II-ego rzędu
% metoda wsadowa wstecznej propagacji błędów (batch)
% z adaptacją współczynnika uczenia
n4=4; % liczba wejść
S4=n4; % liczba neuronów w warstwie 1
S34=12; % liczba neuronów w warstwie 2
S3=1; % liczba neuronów w warstwie 3
Q=500; % liczba wzorców
%i=1;
if i==1, % sprawdzenie warunku inicjalizacji wsp. wagowych
Er=0; e=1;
clear Lr; clear Wr1; clear Wr2; clear Wr3; clear Wr4;
% ustawienie początkowe wsp. wagowych
[W3,B3]=rands(S3,S34); W3=0.125*W3; B3=0.*B3;
[W34,B34]=rands(S34,S4); W34=0.5*W34; B34=0.*B34;
[W4,B4]=nwtan(S4,S4); W4=1*W4; B4=0*B4;
dW3=0*W3; dB3=0*B3; dW34=0*W34; dB34=0*B34; dW4=0*W4; dB4=0*B4;
% rozmieszczenie okien graficznych
figure(1); clf;
set(figure(1),'Position',[5,350,375,270]);
figure(2); clf;
set(figure(2),'Position',[420,350,375,270]);
figure(3); clf;
set(figure(3),'Position',[420,0,375,270]);
end;
for p=1:4, % liczba pętli
for K=1:1, % numer wsadu
O=(K-1)*Q; s=0; N=0;
for k=1:500, % liczba ieracji
T=y(O+1:O+Q,3)'; % y(i)- sygał wyjściowy systemu
% P4 - macierz wejść
P4=[u1(O+1:O+Q,1) u2(O+1:O+Q,1) -y(O+1:O+Q,1) -y(O+1:O+Q,2)]';
% obliczenie wyjścia sieci
[X4]=tansig(W4*P4,B4);
P34=X4;
[X34]=tansig(W34*P34,B34);
P3=X34;
[X3]=purelin(W3*P3,B3);
mc=0.95; % mc - stała momentum
E=-X3+T; % E - wektor błędów
e1=e;
e=sumsqr(E); Ys=sumsqr(T); ey=e/Ys;
% adaptacja współczynnika uczenia lr
if e/e1>1, lr=0.98*lr; end;
if e/e1<0.9999999, lr=1.005*lr; end;
if lr<0.000001, lr=0.000001; end;
Er(i)=e;
Lr(i)=lr;
s=s+1;
if s==50, s=0; [i K sqrt(sumsqr(E)/sumsqr(T))*100],
M=[ k e e/e1 lr], end;
% wsteczna propagacja błędów
D3=1*deltalin(X3,E);
D34=1*deltatan(X34,D3,W3);
D4=1*deltatan(X4,D34,W34);
D2=1*deltatan(P4,D4,W4);
% obliczenie skorygowanych wsp. wagowych
[dW4,dB4]=learnbpm(P4,D4,lr,mc,dW4,dB4);
W4=W4+dW4; B4=B4+dB4;
[dW34,dB34]=learnbpm(P34,D34,lr,mc,dW34,dB34);
W34=W34+dW34; B34=B34+dB34;
[dW3,dB3]=learnbpm(P3,D3,lr,mc,dW3,dB3);
W3=W3+dW3; B3=B3+dB3;
% rysowanie wykresów
if i<=5000,
Wr1(i)=W3(1); Wr2(i)=W3(2); Wr3(i)=W3(3); Wr4(i)=W3(4); end;
i=i+1;
N=N+1;
if N==100, N=0; [p,k,K],
figure(1);
subplot(2,1,1);
semilogy(Lr); title('Współczynnik uczenia');
subplot(2,1,2);
semilogy(Er); title('Suma kwadratów błędów');
figure(2);
clf; hold on; plot(T,'b'); plot(E,'r');
title('Sygnał wyjściowy systemu i błąd identyfikacji'); hold off;
figure(3);
plot(Wr2); grid; hold on; plot(Wr3,'r'); plot(Wr4,'b'); plot(Wr1,'g');
title('Współczynniki W3(1) - W3(4)'); hold off;
end;
end;
end;
end;
3.3. narx2t.m - testowanie modelu neuronowego nieliniowego systemu dynamicznego II-ego rzędu
% syganł wejściowy - szum pseudolosowy o rozkładzie równomiernym
n4=4; % liczba wejść
S4=n4; % liczba neuronów w warstwie 1
S34=12; % liczba neuronów w warstwie 2
S3=1; % liczba neuronów w warstwie 3
Q=500; % liczba wzorców
lr=0; mc=0; % parametry uczenia
% rozmieszczenie okien graficznych
figure(1); clf;
set(figure(1),'Position',[5,350,375,270]);
figure(2); clf;
set(figure(2),'Position',[420,350,375,270]);
figure(3); clf;
set(figure(3),'Position',[420,0,375,270]);
end;
for p=1:1, % liczba pętli
for K=2:2, % numer wsadu
O=(K-1)*Q; s=0; N=0;
for k=1:500, % liczba ieracji
T=y(O+1:O+Q,3)'; % y(i)- sygał wyjściowy systemu
% P4 - macierz wejść
P4=[u1(O+1:O+Q,1) u2(O+1:O+Q,1) -y(O+1:O+Q,1) -y(O+1:O+Q,2)]';
% obliczenie wyjścia sieci
[X4]=tansig(W4*P4,B4);
P34=X4;
[X34]=tansig(W34*P34,B34);
P3=X34;
[X3]=purelin(W3*P3,B3);
E=-X3+T; % E - wektor błędów
e1=e;
e=sumsqr(E); Ys=sumsqr(T); ey=e/Ys;
Er(i)=e
Lr(i)=lr;
s=s+1;
if s==50, s=0; [i K sqrt(sumsqr(E)/sumsqr(T))*100], M=[ k e e/e1 lr], end;
% rysowanie wykresów
if i<=5000,
Wr1(i)=W3(1); Wr2(i)=W3(2); Wr3(i)=W3(3); Wr4(i)=W3(4); end;
i=i+1;
N=N+1;
if N==100, N=0; [p,k,K],
figure(1);
subplot(2,1,1);
semilogy(Lr); title('Współczynnik uczenia');
subplot(2,1,2);
semilogy(Er); title('Suma kwadratów błędów');
figure(2);
clf; hold on; plot(T,'b'); plot(E,'r');
title('Sygnał wyjściowy systemu i błąd identyfikacji'); hold off;
figure(3);
plot(Wr2); grid; hold on; plot(Wr3,'r'); plot(Wr4,'b'); plot(Wr1,'g');
title('Współczynniki W3(1) - W3(4)'); hold off;
end;
end;
end;
end;
3.4. idnarx - identyfikacja systemu nieliniowego metodą wsadową Marquardta
% pliki używane: corr, corry, ham, lipsc, nnarx
N=1000; % liczba wzorców
% generowanie danych z systemu nieliniowego
[y,u,u1,u2,ymax]=ham(N);
m=[1:5];
n=m;
% testowanie rzędu systemu
%[OrderIndexMat]=lipsc(u(1:500),y(1:500,3)),m,n);
% deklaracja struktury sieci
NetDef=['HHHHHHHHHHHH';'L-----------'];
% parametry uczenia
I=200; % liczba iteracji
trparms=[20 0 1 0];
%deklaracja rzędu modelu
NN=[2 2 1];
y=y';
u=u';
% uczenie sieci metodą Marquardta
[W1,W2,e,iter,lambd]=nnarx(NetDef,NN,[],[],trparms,y(3,1:500),u(1:500));
figure(1)
semilogy(e);
%testowanie modelu
[Yhat,NSSE] = nnval('nnarx',NetDef,NN,W1,W2,y(3,501:1000),u(501:1000));
Literatura
Hertz J., Krogh A., Palmer R. G.: Wstęp do teorii obliczeń neuronowych. WNT. Warszawa. 1993, 1995.
Korbicz J., Obuchowicz A., Uciński D.: Sztuczne sieci neuronowe. Podstawy i zastosowania. Akad. Ofic. Wyd. Warszawa. 1994.
Żurada J., Barski M., Jędruch W.: Sztuczne sieci neuronowe. PWN. Warszawa. 1996.