Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
16/9/2017
Sommario
Introduzione .................................................................................................................................. 2
Sistemi con non linearità esponenziali e algoritmo numerico di linearizzazione di un reattore
batch. ............................................................................................................................................. 3
Sintesi dell’osservatore e problema H∞ ......................................................................................... 9
Soluzione del problema a 4 parametri e sintesi del problema H∞ .............................................. 13
Introduzione
Questo tutorial nasce allo scopo di illustrare in maniera dettagliata dal punto di vista
implementativo e numerico la tesi di laurea del candidato Massimo Talia e dare la
possibilità, anche a chi non è del settore, di potere apprezzare e conoscere le tecniche
di progettazione soft-computing attraverso l’utilizzo di linguaggi di modellazione
numerica come il Matlab/Simunlink di Mathworks. Nel lavoro di tesi è stato omesso il
codice utilizzato per il progetto, che è stato consegnato su files digitali, per questioni di
riservatezza alla ricerca dei relatori di tesi, che stavano scrivendo gli articoli
scientifici da pubblicare. Ormai sono passati molti anni da allora, le pubblicazioni sono
state portate a termine nel 2008, quindi è possibile rendere noto l’approccio
algoritmico usato per la risoluzione del problema di sintesi dell’osservatore H∞, che
permette di abbattere sensibilmente l’incertezza di misura sulle concentrazioni di
reagenti e sulle temperature interne di un reattore esotermo attraverso l’osservazione
degli stati fisici interni a partire dalle variabili di uscita del sistema, senza operare
trasformazioni fisiche sulla struttura interna del reattore o aggiungendo altri sensori
di misura interni, che garantiscano una maggiore accuratezza nella misura. L’utilizzo
di ulteriore sensoristica interna comporta ridondanza hardware e costi maggiori.
L’osservatore non lineare alla Luenberger H∞, con termini più semplici, non è altro che
un filtro hardware non lineare, che ridondando le dinamiche note del sistema
impianto, permette ad un più basto costo computazionale e monetario, occupando
meno spazio, di effettuare le misurazioni di variabili fisiche soggette ad errore di
misura inferiore all’unità in modulo |e|<1. Il modello in scala di un impianto, replica
le dinamiche di un impianto a dimensioni reali, che viene controllato tipicamente da
sistemi informatici industriali PLC e SCADA, in cui è presente la sensoristica ed
elettronica di supporto necessaria allo scopo di gestire l’impianto, dove le variabili
interne vengono misurate attraverso schede elettroniche embedded, basate su logica a
microprocessore. Il tutorial parte dal codice Matlab e viene spiegato passo per passo e
si parte dalla rappresentazione numerica ISU del reattore con i dati forniti
dall’Università della Basilicata per poi descrivere l’algoritmo di linearizzazione, il
problema di ottimizzazione con l’uso di LMI (Linear Matrix Inequality). Per gli
argomenti trattati si richiede almeno la conoscenza dell’algebra lineare, della
programmazione matematica e ricerca operativa, della programmazione Matlab e
Simunlink.
Sistemi con non linearità esponenziali e algoritmo numerico di
linearizzazione di un reattore batch.
Il problema principale dei sistemi che contengono termini esponenziali o non linearità
in genere è il fatto di non potere applicare le tecniche di sintesi di controllori o
osservatori che valgono per sistemi SISO e MIMO lineari. Esistono pertanto due
strade:
A tal proposito consideriamo il caso del reattore batch, oggetto della discussione di tesi
del candidato Massimo Talia. L’algoritmo consiste nei seguenti passi:
Successivamente si fissano i valori del tempo di evoluzione della reazione che è di circa
90 min e il valore degli stati iniziali e delle incertezze che inficiano sull’impianto.
%tempo
tempo=0:.01:90;
%vettore degli stati iniziali.
x0=[Ca(1) Cb(1) Tr(1) Tj(1)];
%Interpolazione di 900 campioni
Tj_in_new=interp(Tj_in,900);
%Vettore degli ingressi interpolati from workspace
v=[tempo(1:end-1)' Tj_in_new'];
%Incertezza sulle Concentrazioni Ca, Cb pari al 5 percento
deltaCa=Ca(1)*0.05;
deltaCb=Cb(1)*0.05;
%Condizioni iniziali perturbate dall'incertezza
x0_tilde=[x0(1)+deltaCa,x0(2)+deltaCb,x0(3),x0(4)];
%Incertezza sul prodotto US pari al 35 percento
deltaUS=0.35*US;
%Scostamento di US dovuto all'incertezza
US_new=US+deltaUS;
%Varianza
varianza=10^-3;
Si approssimano le due cinetiche di reazione k1, k2 con due sviluppi di Taylor arrestati
al secondo ordine con il resto di Lagrange su una temperatura che varia da 293 °K a
329 °K con un passo di 3.7 °K:
%Attraverso un problema di ottimizzazione vincolata di tipo minimi quadrati
%-----------------min e e'*Q*e---------------------------------------------
%-----------------s.a G*x=b-e----------------------------------------------
%otteniamo la stima delle curve di tipo lineare che meglio approssimano le
%due esponenziali k1(Tr) e k2(Tr).
%Approssimiamo con una funzione parabola ki(Tr)=ai+bi*Tr(j))+ci*Tr(j)^2+res,
%i=1,2 j=1...10 dove res è lo scostamento tra ki(Tr) e ki(Tr)cap le esponenziali
%Costruisco una griglia di temperatura approssimante con 10 campioni di Tr
Tr1=293:3.7:329;
for i=1:length(Tr1)
k_1(i)=k01*exp(-Ea1/(R*Tr1(i)));
k_2(i)=k02*exp(-Ea2/(R*Tr1(i)));
end
for i=1:length(Tr1)
%Errori e1, e2 ottenuti dalla differenza tra i valori reali delle cinetiche k1,
k2 ottenuti per iterazione sull’intervallo di temperature definite
precedentemente e quelli approssimati ottenuti dal problema di pseudo inversa
minima sinistra ai minimi quadrati y1 ed y2 e sviluppati al secondo ordine
k_1cap(i)e k_2cap(i) sull’intervallo di temperature Tr1:
for i=1:length(Tr1);
k_1cap(i)=y1(1)+y1(2)*Tr1(i)+y1(3)*Tr1(i)^2;
k_2cap(i)=y2(1)+y2(2)*Tr1(i)+y2(3)*Tr1(i)^2;
end
%Definisco l'errore per k1 e per k2
e1=b1-k_1cap'
e2=b2-k_2cap'
%I valori ottenuti dalla differenza tra i vettori dello sviluppo di Taylor
arrestato al 2° ordine delle cinetiche di reazione k1,k2 e le cinetiche
approssimate ottenute dall’interpolazione attraverso problemi dei minimi
quadrati.
e1 =[-0.00175297363541,0.00041470984041,0.00142357928266,
0.00145829007421,0.00076603342336,-0.00032492016742,-0.00138197034534...
-0.00183924238486, -0.00096180181326,0.00219829578479];
e2=[-3.194252667693900e-004,5.479352443885000e-005, 2.507054652797900e-
004,2.829478957726200e-004,1.765975132461400e-004,-2.597649941352000e-005...
-2.541390840012000e-004,-3.916411495149300e-004,-2.495284277302900e-
004,4.756660324115900e-004];
Tr_mm=[min(Tr),max(Tr)];
Tj_mm=[min(Tj),max(Tj)];
res_mm1=[min(e1) max(e1)];
res_mm2=[min(e2) max(e2)];
delta=[0 1];
%Costanti cinetiche massime e minime
k1_min=0.0018;
k1_max=1.4646;
k2_min=1.4999e-5;
k2_max=1.0917;
Si approssima il dominio del problema con un ricoprimento politopico multi affine del
termine quadratico dello sviluppo delle cinetiche di reazione, che nell’algoritmo
originale della tesi viene valutato su 5 parametri e 2 indici (25=32 matrici o vertici del
politopo) Tr, Tj, Res1, Res2, δ (delta), ma che in realtà può essere ridotto a 4 parametri
e 2 indici (24=16 matrici o vertici del politopo) parametri Tr, Tj, ricavando il vettore dei
residui come res_mm=[min(min(e1),min(e2)) max(max(e1),max(e2))], δ(delta). I
risultati sulle simulazioni sono analoghi. Adesso mostriamo il codice a 5 parametri,
successivamente mostriamo quello a 4. La funzione multi affine è costruita al seguente
modo nel caso di 5 parametri e per il termine parabola f(p)=p2 si esprime come
, = , × 0,1 → ℝ.
%--------------------------------------------------------------------------
%Funzione per il calcolo della funzione multiaffine di
%ricoprimento politopico per il termine parabola f(p)=p^2 multiaffine1.m
%--------------------------------------------------------------------------
function f=multiaffine1(xr,xj,res1,res2,delta)
%p è il parametro incerto, delta è un parametro compreso tra [0,1]
Tr=[ 293.15,300,310,315,320,329.02,325,320,315,308.15];
Tj=[310,326.7158826,335.8491054,338.4149386,337.0468731,325.2849698,313.4909946,
...
306.4442608, 303.835378, 307.1230027];
e1 =[-0.00175297363541,0.00041470984041,0.00142357928266,
0.00145829007421,0.00076603342336,-0.00032492016742,-0.00138197034534...
-0.00183924238486, -0.00096180181326,0.00219829578479];
e2=[-3.194252667693900e-004,5.479352443885000e-005, 2.507054652797900e-
004,2.829478957726200e-004,1.765975132461400e-004,-2.597649941352000e-005...
-2.541390840012000e-004,-3.916411495149300e-004,-2.495284277302900e-
004,4.756660324115900e-004];
xrmax= max(Tr);
xrmin=min(Tr);
xjmax=max(Tj);
xjmin=min(Tj);
res1max=max(e1);
res1min=min(e1);
res2max=max(e2);
res2min=min(e1);
%Vettori di componenti massime e minime.
pmax=[xrmax xjmax res1max res2max];
pmin=[xrmin xjmin res1min res2min];
p=[xr xj res1 res2];
for i=1:4
if p(i)>pmax(i)|p(i)<pmin(i)
error('sei fuori dagli intervalli dei valori ammissibili')
end
end
if delta<0|delta>1
error('sei fuori dagli intervalli ammissibili')
end
%Scrivo le funzioni approssimanti la parabola e la funzione multi affine
for i=1:4
f1(i)=(pmin(i))^2+(2*pmin(i)*(p(i)-pmin(i)));
f2(i)=(((pmax(i)+pmin(i))*p(i))-(pmin(i)*pmax(i)));
end
f_low=sum(f1);
f_up=sum(f2);
f=(delta*f_low)+((1-delta)*f_up);
k1=y1(1)+(y1(2)*Tr_mm(i))+(y1(3)*ma(cont))+res_mm1(k);
k2=y2(1)+(y2(2)*Tr_mm(i))+(y2(3)*ma(cont))+res_mm2(l);
%Parametri della B(pigreco)
par1=-(Tr_mm(i)-Tj_mm(j));
par2=Tr_mm(i)-Tr_mm(j);
Astar=[A1_1;A1_2;A1_3;A1_4;A1_5;A1_6;A1_7;A1_8;A1_9;A1_10;A1_11;A1_12;A1_13;A1_1
4;A1_15;A1_16;A1_17;A1_18;A1_19;
A1_20;A1_21;A1_22;A1_23;A1_24;A1_25;A1_26;A1_27;A1_28;A1_29;A1_30;A1_31;A1_32;];
%Allo stesso modo costruisco la matrice Bstar inerente a B(pigreco)
B1star=[B1_1;B1_2;B1_3;B1_4;B1_5;B1_6;B1_7;B1_8;B1_9;B1_10;B1_11;B1_12;B1_13;B1_
14;B1_15;B1_16;B1_17;B1_18;B1_19;B1_20;B1_21;B1_22;
B1_23;B1_24;B1_25;B1_26;B1_27;B1_28;B1_29;B1_30;B1_31;B1_32;];
B1_23;B1_24;B1_25;B1_26;B1_27;B1_28;B1_29;B1_30;B1_31;B1_32;];
%In base alle dinamiche del sistema fisso una specificata regione del piano
%complesso Reg(a_min, zita_min, omegan_max)
zita_min=0.701;
omegan_max=95;
%parte reale di a+jb e a-jb (polo a più bassa frequenza)
a_min=10^-5;
%Calcolo l'angolo di smorzamento dei poli
theta=acos(zita_min);
%Fisso il guadagno gamma dal teorema del piccolo guadagno |delta|<gamma
%dove |delta|=0.35
gamma=0.6;
%Imposto le LMI per la risoluzione del problema di
%ammissibilità(Feasibility Problem).
%Otterrò un sistema di lmi formato da 3 LMI.
setlmis([])
%P matrice simmetrica piena 4*4
P=lmivar(1,[4,1])
%W matrice rettangolare 4*2
W=lmivar(2,[4,2])
%Riazzero i contatori
cont1=1;
cont2=4;
for n=1:32
%1°Blocco_di_LMI
%____________________________________________________________
%[A'i*P+P*Ai+C2'*W'+W*C2+2*alfamin*P P*B1+W*D21 C1';
% (P*B1+W*D21)' -gamma*I D11';
% C1 D11 -gamma*I;]
%____________________________________________________________
% ----------------------------
% 1a LMI
% ----------------------------
% 1a riga
lmiterm([n,1,1,P],1,Astar(cont1:cont2,:),'s')
lmiterm([n,1,1,W],1,C2,'s')
lmiterm([n,1,1,P],2*a_min,1)
lmiterm([n,1,2,P],1,B1star(cont1:cont2,:))
lmiterm([n,1,2,W],1,D21)
lmiterm([n,1,3,0],C1')
%2a riga
lmiterm([n,2,2,0],-gamma)
lmiterm([n,2,3,0],D11')
%3a riga
lmiterm([n,3,3,0],-gamma)
cont1=cont2+1;
cont2=cont1+3;
end
%Riazzero i contatori
cont1=1;
cont2=4;
for n=33:64
%2°blocco di LMI
%___________________________________________________________
%[-omegan_max*P P*Ai+W*C2;
% (P*Ai+W*C2)' -omegan_max*P;]
%___________________________________________________________
%
%------------------------------
%2a LMI
%------------------------------
%1a riga
lmiterm([n,1,1,P],-omegan_max,1)
lmiterm([n,1,2,P],1,Astar(cont1:cont2,:))
lmiterm([n,1,2,W],1,C2)
%2a riga
lmiterm([n,2,2,P],-omegan_max,1)
cont1=cont2+1;
cont2=cont1+3;
end
%riazzero i contatori
cont1=1;
cont2=4
for n=65:96
%3°blocco di LMI
% _________________________________________________________________________
%
%[sin(theta)*(A'i*P+P*Ai+C2'*W'+W*C2) cos(theta)*(A'i*P-P*Ai+C2'*W'-W*C2);
% cos(theta)*(A'i*P-P*Ai+C2'*W'-W*C2)' sin(theta)*(A'i*P+P*Ai+C2'*W'+W*C2);]
%__________________________________________________________________________
%-------------------------------
%3a LMI
%-------------------------------
%1a riga
lmiterm([n,1,1,P],sin(theta),Astar(cont1:cont2,:),'s')
lmiterm([n,1,1,W],sin(theta),C2,'s')
lmiterm([n,1,2,-P],cos(theta)*Astar(cont1:cont2,:)',1)
lmiterm([n,1,2,P],-cos(theta),Astar(cont1:cont2,:))
lmiterm([n,1,2,-W],cos(theta)*C2',1)
lmiterm([n,1,2,W],-cos(theta),C2)
%2a riga
lmiterm([n,2,2,P],sin(theta),Astar(cont1:cont2,:),'s')
lmiterm([n,2,2,W],sin(theta),C2,'s')
cont1=cont2+1;
cont2=cont1+3;
end
%Ottengo il sistema LMI
lmisys=getlmis;
%Calcolo il problema di ammissibilità con feasp
[Tmin,Xfeas]=feasp(lmisys)
%Ricaviamo le soluzioni delle lmi
P=dec2mat(lmisys,Xfeas,P)
W=dec2mat(lmisys,Xfeas,W)
%Ricavo il guadagno di anello soluzione del problema Hinf
L=-inv(P)*W
%matrici per la simulazione
B=[0 0 0 betaj]';
C=[0 0 1 0;0 0 0 1];
D=[0 0]';
sim('schema_simulazione_hinf')
%Confronto fra i grafici relativi rispettivamente alle risposte del sistema al
segnale
%d'ingresso all'impianto e quelli dell'osservatore, inclusa la dinamica
dell'errore.
plot(t,Y1,'r')
grid on
hold on
plot(t,Ystimato,'--k')
legend('Risposta sistema non lineare y1=Tr','Risposta sistema non lineare
y2=Tj','risposta approssimata y1','risposta approssimata y2')
xlabel('Minuti [min]')
ylabel('Temperature [K]')
hold off
figure(2)
plot(t,e)
grid on
legend('Dinamica errore e1','Dinamica errore e2')
xlabel('Minuti [min]')
ylabel('Temperature [K]')
Qui di seguito viene mostrato il numero di iterazioni ed i passi di risoluzione del
problema LMI nel caso di funzione multiaffine a 5 parametri (32 matrici).
Il numero di iterazioni del problema è 18. Nel paragrafo successivo verrà mostrata una
soluzione algoritmicamente ottimizzata.
cont=cont+1;
%Calcolo i vertici attraverso la funzione multi affine del file multiaffine.m
per la parabola Tr^2=F(Tr,Tj,res,delta). Dove ci sono 4 parametri.
%--------------------------------------------------------------------------
%Funzione per il calcolo della funzione multiaffine di
%ricoprimento politopico per il termine parabola f(p)=p^2
%--------------------------------------------------------------------------
function f=multiaffine(xr,xj,res,delta)
%p è il parametro incerto, delta è un parametro compreso tra [0,1]
Tr=[ 293.15,300,310,315,320,329.02,325,320,315,308.15];
Tj=[310,326.7158826,335.8491054,338.4149386,337.0468731,325.2849698,313.4909946,
...
306.4442608, 303.835378, 307.1230027];
res=[-0.00183924238486 0.00219829578479];
xrmax= max(Tr);
xrmin=min(Tr);
xjmax=max(Tj);
xjmin=min(Tj);
resmax=max(res);
resmin=min(res);
for i=1:3
f1(i)=(pmin(i))^2+(2*pmin(i)*(p(i)-pmin(i)));
f2(i)=(((pmax(i)+pmin(i))*p(i))-(pmin(i)*pmax(i)));
end
f_low=sum(f1);
f_up=sum(f2);
f=(delta*f_low)+((1-delta)*f_up);
ma(cont)=multiaffine(Tr_mm(i),Tj_mm(j),res_mm(k),delta(l));
%--------------------------------------------------------------------------
%-------------------Scrivo il sistema in forma Hinf------------------------
%-----------epunto=A1,i(pi)*e+B1(pi)*ew+B2(pi)*eu--------------------------
%-----------ez=C1(pi)*e+D11(pi)*ew+D12(pi)*eu------------------------------
%-----------ey=C2(pi)*e+D21(pi)*ew+D22(pi)*eu------------------------------
%--------------------------------------------------------------------------
%Parabola a cui è stato sostituito il suo sviluppo politopico
k1=y1(1)+(y1(2)*Tr_mm(i))+(y1(3)*ma(cont))+res_mm(k);
k2=y2(1)+(y2(2)*Tr_mm(i))+(y2(3)*ma(cont))+res_mm(k);
%Parametri della B1(pigreco)
par1=-(Tr_mm(i)-Tj_mm(j));
par2=Tr_mm(i)-Tr_mm(j);
%Cicli di controllo per evitare che si scelgano matrici che abbiano
%cinetiche che superano i valori consentiti
if (k1<k1_min)
k1= k1_min;
end
if (k1>k1_max)
k1=k1_max;
end
if (k2<k2_min)
k2=k2_min;
end
if (k2<k2_max)
k2=k2_max;
end
%Matrice dinamica del sistema A(Tr,Tj,res,delta)=A(pi)
A=[-k1,0,0,0;k1,-k2,0,0;alfa1*(k1),alfa2*(k2),-(US*alfar),US*alfar;0, 0,
US*alfaj,-((alfaj*US)+betaj)];
%Matrice B1(Tr,Tj)
B1=[0 0;0 0;par1 0;0 par2];
B1cap=[B1,zeros(4,2)]
%Matrici valutate con eval
eval(['A1_',num2str(cont),'=A'])
eval(['B1_',num2str(cont),'=B1cap'])
end
end
end
end
%Matrici dell'osservatore dopo l'approssimazione politopica, scritte in
%forma H_infinito.
B2=-eye(4);
C1=eye(4);
D11_tilde=10^-1*C2';
D11=[zeros(4,2),D11_tilde];
D12=zeros(4);
D21_tilde=10^-1*eye(2);
D21=[zeros(2),D21_tilde];
D22=zeros(2);
%Costruisco una matrice allargata Astar costituita dalle matrice ottenute
%dalla sostituzione dei vertici dei politopi,in modo tale che scorrendola
%sia possibile estrapolare le matrici A1_i
Astar=[A1_1;A1_2;A1_3;A1_4;A1_5;A1_6;A1_7;A1_8;A1_9;A1_10;A1_11;A1_12;A1_13;A1_1
4;A1_15;A1_16];
%Costruisco la B1star
B1star=[B1_1;B1_2;B1_3;B1_4;B1_5;B1_6;B1_7;B1_8;B1_9;B1_10;B1_11;B1_12;B1_13;B1_
14;B1_15;B1_16];
%In base alle dinamiche del sistema fisso una specificata regione del piano
%complesso Reg(a_min, zita_min, omegan_max)
zita_min=0.7;
omegan_max=90;
%parte reale di a+jb e a-jb (polo a più bassa frequenza)
a_min=-10^-5;
%Calcolo l'angolo di smorzamento dei poli
theta=acos(zita_min);
%Fisso il guadagno gamma dal teorema del piccolo guadagno |delta|<gamma
%dove |delta|=0.35
gamma=0.6;
%Imposto le LMI per la risoluzione del problema di
%ammissibilità(Feasibility Problem).
%Otterrò un sistema di lmi formato da 3 LMI.
setlmis([])
%P matrice simmetrica piena 4*4
P=lmivar(1,[4 1])
%W matrice rettangolare 4*2
W=lmivar(2,[4,2])
%Riazzero i contatori
cont1=1;
cont2=4;
for n=1:16
%1°Blocco_di_LMI
%____________________________________________________________
%[A'i*P+P*Ai+C2'*W'+W*C2+2*alfamin*P P*B1+W*D21 C1';
% (P*B1+W*D21)' -gamma*I D11';
% C1 D11 -gamma*I;]
%____________________________________________________________
% ----------------------------
% 1a LMI
% ----------------------------
% 1a riga
lmiterm([n,1,1,P],1,Astar(cont1:cont2,:),'s')
lmiterm([n,1,1,W],1,C2,'s')
lmiterm([n,1,1,P],2*a_min,1)
lmiterm([n,1,2,P],1,B1star(cont1:cont2,:))
lmiterm([n,1,2,W],1,D21)
lmiterm([n,1,3,0],C1')
%2a riga
lmiterm([n,2,2,0],-gamma)
lmiterm([n,2,3,0],D11')
%3a riga
lmiterm([n,3,3,0],-gamma)
cont1=cont2+1;
cont2=cont1+3;
end
%Riazzero i contatori
cont1=1;
cont2=4;
for n=17:32
%2°blocco di LMI
%___________________________________________________________
%[-omegan_max*P P*Ai+W*C2;
% (P*Ai+W*C2)' -omegan_max*P;]
%___________________________________________________________
%
%------------------------------
%2a LMI
%------------------------------
%1a riga
lmiterm([n,1,1,P],-omegan_max,1)
lmiterm([n,1,2,P],1,Astar(cont1:cont2,:))
lmiterm([n,1,2,W],1,C2)
%2a riga
lmiterm([n,2,2,P],-omegan_max,1)
cont1=cont2+1;
cont2=cont1+3;
end
%riazzero i contatori
cont1=1;
cont2=4
for n=33:48
%3°blocco di LMI
% _________________________________________________________________________
%
%[sin(theta)*(A'i*P+P*Ai+C2'*W'+W*C2) cos(theta)*(A'i*P-P*Ai+C2'*W'-W*C2);
% cos(theta)*(A'i*P-P*Ai+C2'*W'-W*C2)' sin(theta)*(A'i*P+P*Ai+C2'*W'+W*C2);]
%__________________________________________________________________________
%-------------------------------
%3a LMI
%-------------------------------
%1a riga
lmiterm([n,1,1,P],sin(theta),Astar(cont1:cont2,:),'s')
lmiterm([n,1,1,W],sin(theta),C2,'s')
lmiterm([n,1,2,-P],cos(theta)*Astar(cont1:cont2,:)',1)
lmiterm([n,1,2,P],-cos(theta),Astar(cont1:cont2,:))
lmiterm([n,1,2,-W],cos(theta)*C2',1)
lmiterm([n,1,2,W],-cos(theta),C2)
%2a riga
lmiterm([n,2,2,P],sin(theta),Astar(cont1:cont2,:),'s')
lmiterm([n,2,2,W],sin(theta),C2,'s')
cont1=cont2+1;
cont2=cont1+3;
end
%Ottengo il sistema LMI
lmisys=getlmis;
%Calcolo il problema di ammissibilità con feasp
[Tmin,Xfeas]=feasp(lmisys)
%Ricaviamo le soluzioni delle lmi
P=dec2mat(lmisys,Xfeas,P)
W=dec2mat(lmisys,Xfeas,W)
%Ricavo il guadagno di anello soluzione del problema Hinf
L=-inv(P)*W
%matrici per la simulazione
B=[0 0 0 betaj]'
C=[0 0 1 0;0 0 0 1]
D=[0 0]'
sim('schema_simulazione_hinf')
%Confronto fra i grafici relativi rispettivamente alle risposte del sistema al
segnale
%d'ingresso all'impianto e quelli dell'osservatore, inclusa la dinamica
dell'errore.
plot(t,Y1,'r')
grid on
hold on
plot(t,Ystimato,'--k')
legend('Risposta sistema non lineare y1=Tr','Risposta sistema non lineare
y2=Tj','risposta approssimata y1','risposta approssimata y2')
xlabel('Minuti [min]')
ylabel('Temperature [K]')
hold off
figure(2)
plot(t,e)
grid on
legend('Dinamica errore e1','Dinamica errore e2')
xlabel('Minuti [min]')
ylabel('Temperature [K]')
Come detto all’inizio del paragrafo il numero di passi di iterazione risulta ridotto a 15
e le simulazioni sono analoghe a quello a 5 parametri. Il numero di passi ridotto è
quello rappresentato in figura. Le simulazioni sono analoghe a quelle a 5 parametri
ma con una velocità di computazione più alta.