Progettazione di un regolatore LQG
Considerare come esempio di progettazione LQG il seguente problema di regolazione.
L’obiettivo è regolare l’output dell’impianto y in prossimità dello zero. Il disturbo dell’input d è una bassa frequenza con densità spettrale di potenza (PSD) concentrata al di sotto di 10 rad/s. Ai fini della progettazione LQG, viene modellato come rumore bianco sottoposto a un filtro passa basso con un cutoff di 10 rad/s, illustrato nella seguente figura.
Per semplicità, questo rumore è modellato come un rumore gaussiano bianco con una varianza di 1.
La seguente figura mostra la magnitudo di Bode del filtro di forma.
Magnitudo di Bode del filtro passa basso
È presente un certo rumore di misura n, con l’intensità del rumore data da
Usare la funzione di costo
per specificare il bilanciamento tra la performance di regolazione e il costo di controllo. Le seguenti equazioni rappresentano un modello stato-spazio a loop aperto:
dove (A,B,C) è una realizzazione stato-spazio di .
I seguenti comandi consentono di progettare un regolatore LQG ottimale F (s) per questo problema:
sys = ss(tf(100,[1 1 100])) % State-space plant model % Design LQ-optimal gain K K = lqry(sys,10,1) % u = -Kx minimizes J(u) % Separate control input u and disturbance input d P = sys(:,[1 1]); % input [u;d], output y % Design Kalman state estimator Kest. Kest = kalman(P,1,0.01) % Form LQG regulator = LQ gain + Kalman filter. F = lqgreg(Kest,K)
Questi comandi restituiscono un modello stato-spazio F
del regolatore LQG F (s). Le funzioni lqry
, kalman
e lqgreg
eseguono la progettazione di un LQG a tempo discreto quando vengono applicate a impianti discreti.
Per validare la progettazione, scegliere un loop con feedback
, creare e aggiungere un filtro passa basso in serie con il sistema a loop chiuso e confrontare le risposte agli impulsi a loop aperto e chiuso utilizzando la funzione impulse
.
% Close loop clsys = feedback(sys,F,+1) % Note positive feedback. % Create the lowpass filter and add it in series with clsys. s = tf('s'); lpf= 10/(s+10) ; clsys_fin = lpf*clsys; % Open- vs. closed-loop impulse responses impulse(sys,'r--',clsys_fin,'b-')
Questi comandi portano alla seguente figura, in cui si osserva il confronto delle risposte agli impulsi a loop aperto e chiuso per questo esempio.
Confronto delle risposte agli impulsi a loop aperto e chiuso