Identifikacije

 

Na tej strani lahko vidite del protokola za laboratorijske vaje pri predmetu Identifikacije. Prikazano je besedilo naloge, potek naloge in odziv na eno vzbujanje. Prav tako je tukaj tudi program v programskem jeziku Matlab, s katerim lahko pridemo do odzivov pri drugih vzbujanjih.


Besedilo naloge:

Imamo proces 1., 2. in 3. reda. S pomočjo osebnega računalnika in A/D-D/A vmesnika posnemite odzive na različne testne signale. Nato s temi odzivi in testnimi signali identificirajte posamezne procese.

Parametri procesa:

  • proces 1. reda: T1=30s
  • proces 2. reda: T1=30s T2=9s
  • proces 3. reda: T1=30s T2=9s T3=9s
Potek naloge:

V laboratoriju smo snemali odziv sistema, kateremu smo lahko spreminjali časovne konstante T1, T2 in T3. Najprej smo posneli sistem kot da je sistem prvega reda, zato smo časovni konstanti T2 in T3 nastavili na nič. Sledilo je, da smo nastavili tudi časovno konstanto T2 in tako dobi časovni odziv sistema drugega reda. Nato smo dodali še časovno konstanto T3 in dobili sistem tretjega reda. Pri samem snemanju so se nam izmerjene vrednosti (vhod in izhod) vpisovale v datoteke.

Pri vsakem redu sistema smo snemali odzive na vzbujanje s stopnico in na vzbujanje s PRBS signalom. Tako smo izvedli šest meritev in dobili šest ločenih datotek. 

Po meritvi smo morali izmerjene sisteme tudi identificirati. To smo opravljali s programskim paketom Matlab. 

Razlaga programa v Matlabu:

Ker smo opravili merjenja na treh različnih sistemih z dvema različnima signaloma, sem po definiranju posameznih originalnih sistemov, za kasnejšo primerjavo, v programu dal možnost izbire kateri sistem želimo identificirati in s kakšnim signalom. Sama identifikacija je pri vsakem sistemu in signalu potekala enako.

Za začetek identifikacije smo prebrali izmerjene podatke iz datoteke vhodno-izhodnih vrednosti za tisti primer sistema in signala, katerega smo se odločili identificirati. Te prebrane vrednosti smo zapisali v matriko Z. Matrika je v prvem stolpcu vsebovala izhodne vrednosti, v drugem pa vhodne vrednosti. Stolpca sem posebej zapisal v vektorja Y (izhod) in U (vhod) in jih tudi izrisal.

 

Prava identifikacija sistema se je začela s klicem funkcije RARMAX (rekurzivni armax model). V samo funkcijo RARMAX smo morali vnesti vhod, red, zakasnitev armax modela, kateri algoritem faktorja pozabljanja bomo uporabili in sam faktor pozabljanja. Funkcija nam je kot rezultat v matriko THM vrnila ocenjene parametre a, b in c, ter v YHAT odziv modela sistema. Pri tem so morali parametri a in b v času konvergirati, zato smo jih izrisali. Iz poteka teh parametrov je bilo opaziti da proti koncu meritve ti parametri že konvergirajo, da pa smo napako zaradi kratkega časa meritve držali čim nižjo, smo kot parametre vzeli povprečje zadnjih petih vrednosti, kjer so bili že dovolj blizu končne vrednosti.

 

Identifikacija se je s tem končala. Ostalo nam je le še preveritev, kako dober (če je sploh dober) je naš dobljeni model. Zato smo morali preveriti ojačanje (statična verifikacija), primerjati parametre a in b in opazovati razlike, ter primerjati izhod sistema Y in izhod modela YMODELA (dinamična verifikacija).

 

  • Statično verifikacijo smo računali po formuli: 
Če je izračunana vrednost bila dovolj blizu 1, smo bili z ojačanjem zadovoljni.
  • Pri primerjanju parametrov poznanega sistema in parametrov modela smo opazili, da do odstopanj pride, vendar so le ta odstopanja majhna. To se pojavi zaradi diskretnega izhoda, ki je vzrok da dobimo lahko le boljšo ali slabšo aproksimacijo z nekim polinomom.
  • Pri dinamični verifikaciji smo model našega sistema vzbujali z enakim vhodom kot poprej poznan sistem in opazovali izhod. Iz razlike med odzivoma obeh sistemov smo dobili občutek pogreška modela.
 

Identifikacijo sem opravil pri dejanskih izmerjenih rezultatih ter pri izmerjenih rezultatih, katerim srednje vrednosti sem nastavil na nič!

Sledijo posneti odzivi in program napisan v Matlabu:

 

Sistem 1.reda – vzbujanje s stopnico:

 
 

Dobljeni parametri:
Ojačanje K
0.9962
Parameter a1
-0.9775
Dejanski parameter a1
-0.9672
Razlika
0.0103
Parameter a2
0.0224
Dejanski parameter b1
0.0328
Razlika
0.0104
 

Program v jeziku Matlab:

% I D E N T I F I K A C I J E 
% Računalniške vaje 
% Študent: Boštjan Štumberger Datum: 26.11.1997 
% Časovne konstante za mojo nalogo in vzorčni čas
% T1 = 0,5 min = 30 s
% T2 = 0,15 min = 9 s
% T3 = 0,15 min = 9 s
% Ts = 1 s
 
%-----------------------------------------------------------------
% Finkcija, v kateri izberemo kakšen sistem bomo identificirali
% (prvega, drugega ali tretjega reda, oz. i=1,2 ali 3
%-----------------------------------------------------------------
while(1) 
clc; 
disp(' IZBERI SISTEM, KI GA ŽELIŠ IDENTIFICIRATI:'); 
disp(' '); 
disp(' 1) sistem 1. reda'); 
disp(' 2) sistem 2. reda'); 
disp(' 3) sistem 3. reda'); 
disp(' '); 
disp(' 0) Izhod'); 
red=input('Vpisi željeno številko: ');
%-----------------------------------------------------------------
% Čas tipanja:
Ts=1;
%-----------------------------------------------------------------
% SISTEM 1. REDA % Zapis prenosne funkcije prvega reda
% 1
% G1(s) = ------
% (30s+1)
imen1=[30 1]; % Imenovalec funkcije prvega reda
%-----------------------------------------------------------------
% SISTEM 2. REDA % Zapis prenosne funkcije drugega reda
% 1
% G2(s) = --------------
% (30s+1)(9s+1)
imen2=conv(imen1,[9 1]); % Imenovalec funkcije drugega reda
%-----------------------------------------------------------------
% SISTEM 3. REDA
% 1
% G3(s) = ---------------------
% (30s+1)(9s+1)(9s+1)
imen3=conv(imen2,[9 1]); % Imenovalec funkcije tretjega reda
%-----------------------------------------------------------------
% Izpis sistema izbranega reda
% Imenovalcu izbranega sistema priredimo matriko 'imen'
%-----------------------------------------------------------------
clc; 
if (red==1)
imen=imen1;
disp('Prenosna funkcija sistema 1. reda: ');
elseif (red==2)
imen=imen2;
disp('Prenosna funkcija sistema 2. reda: ');
elseif (red==3)
imen=imen3;
disp('Prenosna funkcija sistema 3. reda: ');
elseif (red==0)
break;
end;
% Izbrano prenosno funkcijo izpišemo
disp(' ');
disp('Sistem v S prostoru:');
printsys(1,imen,'s');
%-----------------------------------------------------------------
% Z transformacija izbranega sistema z nictim redom
%-----------------------------------------------------------------
[std,imd]=c2dm(1,imen,Ts,'zoh');
disp(' ');
disp('Po Z transformaciji sistema dobimo: ');
% Izpišemo prenosno funkcijo v z prostoru
printsys(std,imd,'z');
disp(' ');
disp('Pritisni tipko za nadaljevanje');
pause;
clc
%-----------------------------------------------------------------
% Funkcija za izbiro vzbujalne funkcije
%-----------------------------------------------------------------
clc;
disp('IZBERI VZBUJANJE:');
disp(' ');
disp('1) stopnica');
disp('2) PRBS');
disp(' ');
disp('0) Izhod');
disp(' ');
% Spremenljivka vzbujanje zavzame izbiro
vzbujanje=input('Izberi vzbujanje: ');
%-----------------------------------------------------------------
% Čitanje matrike vhodno-izhodnih izmerjenih vrednosti
% Te vrednosti damo v matriko Z
%-----------------------------------------------------------------
if (red==1) % Če je sistem prvega reda
if (vzbujanje==1) % Kakšno vzbujanje smo izbrali
fid=fopen('1_red_s.dat','r');
Z=fscanf(fid,'%f%f',[2 inf]);
fclose(fid);
elseif (vzbujanje==2)
fid=fopen('1_red_p.dat','r');
Z=fscanf(fid,'%f%f',[2 inf]);
fclose(fid);
elseif (vzbujanje==0)
break;
end;
elseif (red==2) % Če je sistem drugega reda
if (vzbujanje==1) % Kakšno vzbujanje smo izbrali
fid=fopen('2_red_s.dat','r');
Z=fscanf(fid,'%f%f',[2 inf]);
fclose(fid);
elseif (vzbujanje==2)
fid=fopen('2_red_p.dat','r');
Z=fscanf(fid,'%f%f',[2 inf]);
fclose(fid);
elseif (vzbujanje==0)
break;
end;
elseif (red==3) % Če je sistem tretjega reda
if (vzbujanje==1) % Kakšno vzbujanje smo izbrali
fid=fopen('3_red_s.dat','r');
Z=fscanf(fid,'%f%f',[2 inf]);
fclose(fid);
elseif (vzbujanje==2)
fid=fopen('3_red_p.dat','r');
Z=fscanf(fid,'%f%f',[2 inf]);
fclose(fid);
elseif (vzbujanje==0)
break;
end;
end;
% Iz matrike prebranih vrednosti ločimo vhodne vrednosti od 
% izhodnih 
Z=Z';
U=Z(:,2); % Vzbujanje sistema - vhodni signal;
Y=Z(:,1); % Odziv sistema - izhodni signal;
%-----------------------------------------------------------------
% Vzbujanju //in odzivu// damo srednjo vrednost na nič
%-----------------------------------------------------------------
sestevek=0;
dolzina=0;
dolzina=length(Z);
zacetna=U(1);
if vzbujanje==1
disp('Vzbujanje = 1')
for i=1:dolzina
U(i)=U(i)-zacetna;
Y(i)=Y(i)-zacetna;
end;
end;
if vzbujanje==2
disp('Vzbujanje = 2')
for i=1:dolzina
sestevek=sestevek+U(i);
end;
srednja=sestevek/dolzina;
for i=1:dolzina
U(i)=U(i)-srednja;
% Y(i)=Y(i)-srednja;
end;
end;
zacetna=Y(1);
if zacetna<0
for i=1:dolzina
Y(i)=Y(i)+abs(zacetna);
end;
else
for i=1:dolzina
Y(i)=Y(i)-zacetna;
end;
end;
Z=[Y U];
%-----------------------------------------------------------------
% Izris vhodnih in izhodnih vrednosti sistema
figure(1);
hold off
plot(U,'b');
hold on
plot(Y,'r');
grid;
title('Vhod(modra) in izhod(rdeca) sistema');
disp(' ');
disp('Pritisni tipko za nadaljevanje');
pause;
clc
%-----------------------------------------------------------------
% Identifikacija sistema z funkcijo RARMAX
% Klicanje funkcije rarmax ki nam v matriko THM vpiše
% ocenjene parametre [a,b,c] in v YHAT izhod modela
% rarmax(vhod,redi in zakasnitve armax modela,algoritem faktorja 
% pozabljanja, faktor pozabljanja,začetne vrednosti parametrov,
% začetne vrednosti matrike P)
%-----------------------------------------------------------------
disp(' ');
% lambda=input(' Vpiši vrednost za lambdo (med 0,8 in 1) : '); 
alfa=input(' Vpiši vrednost za alfo (med 10 in 1e12) : '); 
lambda=1;
if (vzbujanje==10)
if (red==1)
alfa=1e9;
elseif (red==2)
alfa=1e9;
elseif (red==3)
alfa=1e12;
end;
end;
if (vzbujanje==20)
if (red==1)
alfa=500;
elseif (red==2)
alfa=0.1;
elseif (red==3)
alfa=10e9;
end;
end;
zak=1;
nn=[red red red zak];
spr=zeros(red*3);
TH0=spr(:,1); %Vpišem začetne vrednosti parametrov
P0 = alfa*eye(3*red); %Vpišem začetne vrednosti matrike P
[THM,YHAT] = rarmax(Z,nn,'ff',lambda,TH0,P0); 
disp(' ');
%-----------------------------------------------------------------
% Iz THM preberemo parametre a in b
%-----------------------------------------------------------------
if (red==1) % Ce je funkcija prvega reda
a1=THM(:,1); % a1 je v prvem stolpcu
b1=THM(:,2); % b1 je v drugem stolpcu
figure(2);
subplot(2,1,1),plot(a1,'b');title('parameter a_1');grid;
subplot(2,1,2),plot(b1,'b');title('parameter b_1');grid;
pause;
% Povprečimo parametre a in b (vzamem zadnjih deset vrednosti)
k1=size(a1); % Ugotovimo koliko je število vrednosti
k1=k1(:,1);
a1p=0;
for i=0:4 % Čitamo 5 zadnjih vrednosti
a1p=a1p+a1(k1-i);
end;
a1p=a1p/5;
l1=size(b1);
l1=l1(:,1);
b1p=0;
for i=0:4
b1p=b1p+b1(l1-i);
end;
b1p=b1p/5;
ap=[a1p];
bp=[b1p];
elseif (red==2) % Če je funkcija drugega reda
a1=THM(:,1); % Prvi stolpec od THM je a1 itd.
a2=THM(:,2);
b1=THM(:,3);
b2=THM(:,4);
figure(2);
subplot(2,2,1),plot(a1,'b');title('parameter a_1');grid;
subplot(2,2,3),plot(a2,'b');title('parameter a_2');grid;
subplot(2,2,2),plot(b1,'b');title('parameter b_1');grid;
subplot(2,2,4),plot(b2,'b');title('parameter b_2');grid;
pause;
% Povprečimo parametre a in b (vzamem zadnjih deset vrednosti)
k1=size(a1); % Ugotovimo koliko je število vrednosti
k1=k1(:,1);
a1p=0;
for i=0:4 % Čitamo 10 zadnjih vrednosti
a1p=a1p+a1(k1-i);
end;
a1p=a1p/5;
l1=size(b1);
l1=l1(:,1);
b1p=0;
for i=0:4
b1p=b1p+b1(l1-i);
end;
b1p=b1p/5;
k2=size(a2);
k2=k2(:,1);
a2p=0;
for i=0:4
a2p=a2p+a2(k2-i);
end;
a2p=a2p/5;
l2=size(b2);
l2=l2(:,1);
b2p=0;
for i=0:4
b2p=b2p+b2(l2-i);
end;
b2p=b2p/5;
ap=[a1p;a2p];
bp=[b1p;b2p];
elseif (red==3) % Če je funkcija trtjega reda
a1=THM(:,1); % Prvi stolpec od THM je a1
a2=THM(:,2);
a3=THM(:,3);
b1=THM(:,4);
b2=THM(:,5);
b3=THM(:,6);
figure(2);
subplot(3,2,1),plot(a1,'b');title('parameter a_1');grid;
subplot(3,2,3),plot(a2,'b');title('parameter a_2');grid;
subplot(3,2,5),plot(a3,'b');title('parameter a_3');grid;
subplot(3,2,2),plot(b1,'b');title('parameter b_1');grid;
subplot(3,2,4),plot(b2,'b');title('parameter b_2');grid;
subplot(3,2,6),plot(b3,'b');title('parameter b_3');grid;
pause;
% Povprečimo parametre a in b (vzamemo zadnjih deset vrednosti)
k1=size(a1);
k1=k1(:,1);
a1p=0;
for i=0:4
a1p=a1p+a1(k1-i);
end;
a1p=a1p/5;
l1=size(b1);
l1=l1(:,1);
b1p=0;
for i=0:4
b1p=b1p+b1(l1-i);
end;
b1p=b1p/5;
k2=size(a2);
k2=k2(:,1);
a2p=0;
for i=0:4
a2p=a2p+a2(k2-i);
end;
a2p=a2p/5;
l2=size(b2);
l2=l2(:,1);
b2p=0;
for i=0:4
b2p=b2p+b2(l2-i);
end;
b2p=b2p/5;
k3=size(a3);
k3=k3(:,1);
a3p=0;
for i=0:4
a3p=a3p+a3(k3-i);
end;
a3p=a3p/5;
l3=size(b3);
l3=l3(:,1);
b3p=0;
for i=0:4
b3p=b3p+b3(l3-i);
end;
b3p=b3p/5;
ap=[a1p;a2p;a3p];
bp=[b1p;b2p;b3p];
end
st_m=[0 bp'];
im_m=[1 ap'];
%-----------------------------------------------------------------
% Razlika med Y in YHAT ( dinamična verifikacija )
%-----------------------------------------------------------------
e1=Y-YHAT;
figure(3);
subplot(2,1,1);
plot(Y,'r'),title('Y(rdeca) in Y_H_A_T(modra)');
hold on,plot(YHAT,'b'),grid,hold off;
subplot(2,1,2),plot(e1,'r'); grid;
title('Razlika med Y in Y_H_A_T');
pause;
%-----------------------------------------------------------------
% Primerjava parametrov a in b funkcije H(z) in matrike THM
%-----------------------------------------------------------------
clc
disp('Razlika parametrov med pravim sistemom in modelom')
disp(' ')
disp('Povprečne vrednosti parametrov b:')
disp(bp);
disp('Povprečne vrednosti parametrov a:')
disp(ap);
disp(' ');
disp('Pritisni tipko za nadaljevanje');
pause;
clc
%-----------------------------------------------------------------
% Preverjanje ojačanja K (statična verifikacija) 
% (mora biti okrog 1)
%-----------------------------------------------------------------
disp('Ojačanje:')
if (red==1)
K=b1p/(1+a1p)
elseif (red==2)
K=(b1p+b2p)/(1+a1p+a2p)
elseif (red==3)
K=(b1p+b2p+b3p)/(1+a1p+a2p+a3p)
end;
disp(' ');
disp('Pritisni tipko za nadaljevanje');
pause;
clc;
%-----------------------------------------------------------------
% Vzbujamo identificirani sistem
%-----------------------------------------------------------------
[ymodela3,xmodela]=dlsim(st_m,im_m,U);
%if vzbujanje==1
% izbira=45;
% else
% izbira=5;
%end;
%i=1;
%clear ymodela2;
%clear ymodela3;
%ymodela2(1)=-5;
%ymodela2(2)=-5;
%Zac_U(2)=-5;
%Zac_Y(2)=0;
% while ymodela2<Y(1)
% Zac_U(i)=izbira;
% Zac_Y(i)=Y(1);
% vmesna=i;
% [ymodela2,xmodela]=dlsim(st_m,im_m,Zac_U');
% disp(ymodela2(i))
% i=i+1;
% end;
% VektorU=[Zac_U';U];
% VektorY=[Zac_Y';Y];
% [ymodela2,xmodela]=dlsim(st_m,im_m,VektorU);
%d1=size(ymodela2);
%d2=size(Y);
%d1=d1(:,1);
%d2=d2(:,1);
%for b=1:d2-1
% ymodela3(b)=ymodela2(d1-d2+b+1);
%end;
% ymodela3(d2)=ymodela2(d1);
% ymodela3=ymodela3';
%-----------------------------------------------------------------
% Primerjava Y_modela in Y (Odzivi)
%-----------------------------------------------------------------
e1=Y-ymodela3; 
figure(4); 
clf
subplot(2,1,1); 
plot(Y,'b');hold on;title('Y(rdeča) in Y_modela(modra)'); 
plot(ymodela3,'r');grid;
subplot(2,1,2),plot(e1,'b'); grid; title('Pogrešek'); 
pause;
%-----------------------------------------------------------------
% end; %Prvi while(1)
end; %Drugi while(1)
Avtor: Boštjan Štumberger


V kolikor želite sodelovati z nami, vas vljudno vabimo, da se nam pridružite, pošljete članke, ali pa samo izrazite vaša mnenja.