Utilizzo del FEEDBACK per chiudere i loop di feedback
Questo esempio mostra il motivo per cui si dovrebbe sempre utilizzare FEEDBACK per chiudere i loop di feedback.
I due modi per chiudere i loop di feedback
Si consideri il seguente loop di feedback
dove
K = 2; G = tf([1 2],[1 .5 3])
G = s + 2 --------------- s^2 + 0.5 s + 3 Continuous-time transfer function.
È possibile calcolare la funzione di trasferimento a loop chiuso H
da r a y in almeno due modi:
Utilizzando il comando
feedback
Utilizzando la formula
Per calcolare H
utilizzando feedback
, digitare
H = feedback(G,K)
H = s + 2 --------------- s^2 + 2.5 s + 7 Continuous-time transfer function.
Per calcolare H
dalla formula, digitare
H2 = G/(1+G*K)
H2 = s^3 + 2.5 s^2 + 4 s + 6 ----------------------------------- s^4 + 3 s^3 + 11.25 s^2 + 11 s + 21 Continuous-time transfer function.
I motivi per cui è preferibile utilizzare FEEDBACK
Il problema principale del calcolo di H
dalla formula è che gonfia l'ordine della funzione di trasferimento a loop chiuso. Nell'esempio precedente, H2
a un ordine doppio rispetto ad H
. Questo accade perché l'espressione G/(1+G*K)
è valutata come rapporto delle due funzioni di trasferimento G
e 1+G*K
. Se
viene quindi G/(1+G*K)
valutato come:
Di conseguenza, i poli di G
sono aggiunti sia al numeratore che al denominatore di H
. È possibile confermarlo osservando la rappresentazione ZPK:
zpk(H2)
ans = (s+2) (s^2 + 0.5s + 3) --------------------------------- (s^2 + 0.5s + 3) (s^2 + 2.5s + 7) Continuous-time zero/pole/gain model.
Questo eccesso di poli e zeri può influire negativamente sull'accuratezza dei risultati quando si tratta di funzioni di trasferimento di ordine elevato, come mostrato nell'esempio successivo. Questo esempio prevede una funzione di trasferimento del 17-esimo ordine G
. Come in precedenza, utilizzare entrambi gli approcci per calcolare la funzione di trasferimento a loop chiuso per K=1
:
load numdemo G H1 = feedback(G,1); % good H2 = G/(1+G); % bad
Per avere un punto di riferimento, calcolare inoltre un modello FRD contenente la risposta in frequenza di G e applicare feedback
direttamente ai dati della risposta in frequenza:
w = logspace(2,5.1,100); H0 = feedback(frd(G,w),1);
Confrontate quindi le magnitudini delle risposte a loop chiuso:
h = sigmaplot(H0,'b',H1,'g--',H2,'r'); legend('Reference H0','H1=feedback(G,1)','H2=G/(1+G)','location','southwest') setoptions(h,'YlimMode','manual','Ylim',{[-60 0]})
La risposta in frequenza di H2
è imprecisa per frequenze inferiori a 2e4 rad/s. Questa inaccuratezza può essere ricondotta alle ulteriori dinamiche (che si annullano) introdotte in prossimità di z=1. In particolare, H2
ha un numero di poli e zeri vicino a z=1 circa doppio rispetto a H1
. Di conseguenza, H2(z)
ha un'accuratezza molto più scarsa in prossimità di z=1 che distorce la risposta alle basse frequenze. Vedere l'esempio Using the Right Model Representation per maggiori dettagli.