ZEROSPOLES

Esercizi svolti › Stabilità

Stabilità e criterio di Routh

Come sapere se un sistema è stabile senza calcolare i poli. Quattro esercizi svolti passo passo, a mano, e per ognuno il codice MATLAB per controllare il risultato.

Lezione video: teoria completa

9 minuti e 36 secondi: stabilità, polinomio caratteristico, tabella di Routh, casi speciali e parametro K.

Leggi la trascrizione

Stabilità e criterio di Routh

Benvenuti su Zerospoles. In questa lezione vediamo con calma la stabilità dei sistemi lineari e il criterio di Routh, passo dopo passo. Partiamo da che cosa significa stabile e perché basta guardare i poli. Poi scriviamo il polinomio caratteristico, e costruiamo insieme la tabella di Routh. Vedremo i due casi speciali, quando compare uno zero o una riga intera di zeri. E per finire useremo il criterio con un parametro K, che è l'esercizio tipico d'esame. Gli esercizi svolti, con il codice Matlab da copiare, li trovi sotto il video, nella stessa pagina.

Che cosa vuol dire stabile

Un sistema è stabile se, dopo un impulso, la sua uscita si spegne col tempo invece di crescere senza limite. Matematicamente, la risposta all'impulso deve tendere a zero. E questa risposta è una somma di termini, uno per ogni polo della funzione di trasferimento. Un polo reale negativo dà un esponenziale che decade. Un polo con parte reale positiva dà un esponenziale che esplode. Quindi la regola è questa: il sistema è asintoticamente stabile se e solo se tutti i poli hanno parte reale negativa.

I tre comportamenti sul piano s

Guardiamo il piano complesso. A sinistra dell'asse immaginario i poli danno oscillazioni o esponenziali che si smorzano. Sull'asse immaginario abbiamo oscillazioni che non si smorzano mai: il sistema è al limite di stabilità. A destra dell'asse c'è l'instabilità: basta un solo polo lì e l'uscita diverge. Il problema è che per trovare i poli bisogna risolvere un'equazione di grado alto, e a mano è quasi impossibile. Il criterio di Routh ci evita proprio questo: ci dice quanti poli stanno a destra, senza calcolarli.

Il polinomio caratteristico

Se il sistema è in retroazione con guadagno d'anello L di s, la funzione a ciclo chiuso è L diviso uno più L. I poli sono quindi le soluzioni di uno più L uguale a zero. Portando tutto a denominatore comune otteniamo un polinomio, che chiamiamo polinomio caratteristico. Studiare la stabilità vuol dire studiare dove stanno le radici di questo polinomio.

Una condizione necessaria

Prima di fare conti, c'è un controllo velocissimo. Se manca un coefficiente, o ci sono segni diversi, il sistema non è stabile. Attenzione però: questa condizione è solo necessaria, non basta. Prendiamo s al cubo più s al quadrato più due s più otto. Tutti i coefficienti sono positivi, eppure questo polinomio ha due radici con parte reale positiva. Serve quindi un test completo, ed è esattamente il criterio di Routh.

Routh: le prime due righe

Costruiamo la tabella con un esempio: s al cubo più due s al quadrato più tre s più quattro. Una riga per ogni potenza di s, dalla più alta fino a s alla zero. Le prime due righe si riempiono con i coefficienti, alternandoli: nella prima riga uno e tre, nella seconda due e quattro.

Routh: le righe successive

Ogni elemento nuovo si calcola con un piccolo determinante: prendi i due elementi della colonna a sinistra e quelli della colonna a destra. Per la riga s alla uno: due per tre, meno uno per quattro, diviso due. Fa sei meno quattro, diviso due, cioè uno. Per l'ultima riga basta ricopiare il quattro, perché non ci sono altri elementi da combinare. La regola generale è: elemento della riga sopra a sinistra per quello in diagonale, meno il pivot per quello a destra, tutto diviso il pivot.

Come si legge la tabella

Ora guardiamo solo la prima colonna: uno, due, uno, quattro. Il criterio dice che il numero di cambi di segno in questa colonna è uguale al numero di poli nel semipiano destro. Qui i segni sono tutti positivi, quindi zero cambi di segno, zero poli instabili: il sistema è stabile. Se vuoi controllare, le radici vere sono circa meno uno virgola sei, e una coppia con parte reale meno zero virgola diciassette.

Un esempio instabile

Facciamo un secondo esempio, di grado quattro: s alla quarta più due s al cubo più tre s al quadrato più quattro s più cinque. Le prime due righe: uno, tre, cinque, e poi due, quattro. La riga s al quadrato: due per tre meno uno per quattro, diviso due, fa uno. Poi due per cinque meno zero, diviso due, fa cinque. La riga s alla uno: uno per quattro, meno due per cinque, diviso uno, fa meno sei. E l'ultima è cinque. La prima colonna è: più uno, più due, più uno, meno sei, più cinque. Due cambi di segno: dal più uno al meno sei, e poi dal meno sei al più cinque. Quindi due poli nel semipiano destro, sistema instabile.

Un trucco per semplificare

Un trucco che fa risparmiare molti errori. Puoi moltiplicare o dividere un'intera riga per un numero positivo, e il risultato sui segni non cambia. Se in una riga hai quattro, otto, dodici, dividi tutto per quattro e lavori con uno, due, tre. Occhio però: solo per numeri positivi. Se dividi per un numero negativo, rovesci i segni e sbagli il conteggio.

Primo caso speciale: uno zero

Può capitare che il primo elemento di una riga venga zero, mentre il resto della riga no. Allora non puoi dividere. Prendiamo s alla quarta più s al cubo più due s al quadrato più due s più tre. Nella riga s al quadrato il primo elemento viene uno per due meno uno per due, cioè zero. La soluzione è sostituire lo zero con un numero piccolissimo, che chiamiamo epsilon, positivo. Nella riga successiva compare due meno tre su epsilon. Se epsilon tende a zero, tre su epsilon è enorme, e il termine diventa molto negativo. La prima colonna è più, più, più epsilon, meno, più: due cambi di segno, quindi due poli instabili.

Secondo caso speciale: riga di zeri

Il secondo caso è una riga formata solo da zeri. Succede quando ci sono radici simmetriche rispetto all'origine. Esempio: s al cubo più due s al quadrato più quattro s più otto. La riga s alla uno viene zero zero. Si costruisce il polinomio ausiliario con la riga sopra: due s al quadrato più otto. Si deriva, e si ottiene quattro s: quel quattro prende il posto della riga di zeri, e si continua. La prima colonna è uno, due, quattro, otto: nessun cambio di segno, quindi nessun polo a destra. Le radici dell'ausiliario, più o meno due j, stanno sull'asse immaginario: il sistema è al limite di stabilità.

Con un parametro K

Veniamo all'esercizio tipico d'esame: trovare per quali valori di K il sistema è stabile. Il guadagno d'anello è K diviso s più uno, per s più due, per s più tre. Sviluppiamo il denominatore e sommiamo K: il polinomio caratteristico è s al cubo più sei s al quadrato più undici s più sei più K. Nella riga s alla uno: sei per undici, meno sei più K, diviso sei. Fa sessanta meno K, diviso sei. E l'ultima riga è sei più K.

Le condizioni su K

Per la stabilità la prima colonna deve avere tutti i segni uguali. Uno e sei sono positivi, quindi chiediamo sessanta meno K maggiore di zero, e sei più K maggiore di zero. Questo dà K minore di sessanta, e K maggiore di meno sei. Se consideriamo guadagni positivi, il sistema è stabile per K compreso tra zero e sessanta. A K uguale sessanta la riga s alla uno è zero. Il polinomio ausiliario è sei s al quadrato più sessantasei, con radici più o meno j radice di undici. Il sistema oscilla a circa tre virgola tre radianti al secondo: è proprio il limite di stabilità.

Il legame con Matlab

In Matlab puoi verificare tutto in pochi secondi. Il comando roots restituisce le radici del polinomio, e vedi subito il segno delle parti reali. Nella pagina trovi anche la funzione routh table, da copiare: costruisce la tabella e gestisce anche il caso dello zero con epsilon. E il valore sessanta che abbiamo trovato è lo stesso che dà il margine di guadagno: circa trentacinque virgola sei decibel.

Errori da evitare

Quattro errori classici. Primo: bisogna contare i cambi di segno nella prima colonna, non il numero di elementi negativi. Secondo: non dividere una riga per un numero negativo. Terzo: se compare uno zero nella prima colonna, usa epsilon e non fermarti. Quarto: Routh ti dice quanti poli sono a destra, ma non dove siano. Per saperlo davvero devi calcolare le radici.

Riepilogo

Ricapitolando. Il sistema è stabile se tutti i poli hanno parte reale negativa. Con Routh, il numero di cambi di segno nella prima colonna è il numero di poli nel semipiano destro. Uno zero si sostituisce con epsilon, una riga di zeri si risolve col polinomio ausiliario. E con un parametro K si impongono i segni positivi nella prima colonna e si risolvono le disequazioni. Ora prova tu: nella pagina trovi quattro esercizi svolti passo passo, e uno da fare da solo. Ci vediamo al prossimo argomento. Ciao!

Da salvare: il metodo in 5 righe

  1. Condizione necessaria. Nel polinomio caratteristico mancano coefficienti, o ce n'è uno negativo mentre gli altri sono positivi? Allora il sistema non è stabile. Se tutti sono positivi, si procede.
  2. Prime due righe. Scrivi i coefficienti alternati: nella prima riga il 1°, il 3°, il 5°…, nella seconda il 2°, il 4°, il 6°…
  3. Righe successive. Ogni elemento = (primo elemento della riga sopra × elemento in alto a destra − primo elemento della riga due sopra × elemento a destra nella riga sopra) / primo elemento della riga sopra.
  4. Ultima riga. Si ferma alla riga della potenza s⁰.
  5. Lettura. Il numero di cambi di segno nella prima colonna è il numero di poli con parte reale positiva. Zero cambi: stabile.
Esercizio 1 · Base

Il sistema è stabile?

Il polinomio caratteristico è:

p(s) = s³ + 2s² + 3s + 4
  1. Condizione necessaria. I coefficienti 1, 2, 3, 4 sono tutti positivi: si può costruire la tabella.
  2. Prime due righe. s³: 1, 3. s²: 2, 4.
  3. Riga s¹, primo elemento: (2·3 − 1·4) / 2 = 2/2 = 1. Il secondo elemento è 0 (non c'è un'altra colonna).
  4. Riga s⁰: (1·4 − 2·0) / 1 = 4.
  5. Prima colonna: 1, 2, 1, 4. Nessun cambio di segno.
col. 1col. 2
s³13
s²24
s¹10
s⁰4
Risultato: il sistema è stabile, tutti i poli hanno parte reale negativa. (Controllo: i poli sono −1,6506 e −0,1747 ± 1,5469j.)

Codice MATLAB per controllare:

p = [1 2 3 4];              % s^3 + 2s^2 + 3s + 4
r = roots(p)                % i poli
stabile = all(real(r) < 0)  % 1 se tutti a sinistra
r = -1.6506 + 0.0000i -0.1747 + 1.5469i -0.1747 - 1.5469i stabile = logical 1
Esercizio 2 · Contare i poli instabili

Quanti poli stanno a destra?

p(s) = s⁴ + 2s³ + 3s² + 4s + 5
  1. Condizione necessaria. Coefficienti 1, 2, 3, 4, 5: tutti positivi, si procede.
  2. Prime due righe. s⁴: 1, 3, 5. s³: 2, 4.
  3. Riga s²: (2·3 − 1·4)/2 = 1 e (2·5 − 1·0)/2 = 5.
  4. Riga s¹: (1·4 − 2·5)/1 = −6.
  5. Riga s⁰: (−6·5 − 1·0)/(−6) = 5.
  6. Prima colonna: 1, 2, 1, −6, 5. I segni sono + + + − +: due cambi (da + a − e da − a +).
col. 1col. 2col. 3
s⁴135
s³240
s²150
s¹−600
s⁰5
Risultato: due cambi di segno: il sistema ha 2 poli con parte reale positiva, quindi è instabile. (Controllo: i poli instabili sono 0,2878 ± 1,4161j.)

Codice MATLAB:

p = [1 2 3 4 5];
r = roots(p);
n_instabili = sum(real(r) > 0)   % numero di poli a destra
n_instabili = 2
Esercizio 3 · Parametro K

Per quali K il sistema in retroazione è stabile?

Un anello aperto con guadagno K, chiuso in retroazione unitaria negativa:

L(s) = K / ((s+1)(s+2)(s+3))
  1. Equazione caratteristica. Si impone 1 + L(s) = 0, cioè (s+1)(s+2)(s+3) + K = 0.
  2. Sviluppa. (s+1)(s+2) = s² + 3s + 2, poi (s² + 3s + 2)(s + 3) = s³ + 6s² + 11s + 6. Quindi s³ + 6s² + 11s + (6 + K) = 0.
  3. Prime due righe. s³: 1, 11. s²: 6, 6+K.
  4. Riga s¹: (6·11 − 1·(6+K)) / 6 = (60 − K)/6.
  5. Riga s⁰: 6 + K.
  6. Prima colonna positiva: 1 e 6 lo sono già. Poi (60 − K)/6 > 0 dà K < 60, e 6 + K > 0 dà K > −6. Con K positivo: 0 < K < 60.
  7. Controllo al limite. Con K = 60 il polinomio diventa s³ + 6s² + 11s + 66 = (s + 6)(s² + 11): poli −6 e ±j√11 ≈ ±3,317. I due poli sull'asse immaginario oscillano senza smorzarsi.
col. 1col. 2
s³111
s²66+K
s¹(60−K)/60
s⁰6+K
Risultato: il sistema è stabile per 0 < K < 60. A K = 60 è al limite, con oscillazione a √11 ≈ 3,32 rad/s.

Codice MATLAB: prova tanti valori di K e prendi il più grande stabile.

K = 0:0.1:100;
stab = arrayfun(@(k) all(real(roots([1 6 11 6+k])) < 0), K);
Kmax = K(find(stab, 1, 'last'))
Kmax = 59.9000 (oppure 60: dipende dall'arrotondamento. Il limite esatto, a mano, è 60)

Con il Control System Toolbox puoi vedere lo stesso limite sul margine di guadagno:

L = tf(1, [1 6 11 6]);   % L(s) con K = 1
margin(L)                % margine di guadagno: 60 (35,6 dB) a 3,32 rad/s
rlocus(L)                % luogo delle radici
Il margine di guadagno 60 è proprio il K massimo trovato a mano.
Esercizio 4 · Caso speciale

Uno zero nella prima colonna

p(s) = s⁴ + s³ + 2s² + 2s + 3
  1. Condizione necessaria. Coefficienti 1, 1, 2, 2, 3: tutti positivi.
  2. Prime due righe. s⁴: 1, 2, 3. s³: 1, 2.
  3. Riga s²: (1·2 − 1·2)/1 = 0 e (1·3 − 1·0)/1 = 3. Il primo elemento è zero: la riga dopo richiederebbe una divisione per zero.
  4. Metodo ε. Sostituisci lo zero con un numero positivo piccolissimo, ε. La riga s² diventa: ε, 3.
  5. Riga s¹: (ε·2 − 1·3)/ε = 2 − 3/ε. Per ε che tende a 0 da destra questo numero va a −∞: è negativo.
  6. Riga s⁰: ((2 − 3/ε)·3 − ε·0)/(2 − 3/ε) = 3.
  7. Prima colonna: 1, 1, ε (positivo), (negativo), 3. I segni sono + + + − +: due cambi.
col. 1col. 2col. 3
s⁴123
s³120
s²ε30
s¹2−3/ε00
s⁰3
Risultato: 2 poli instabili: il sistema è instabile. (Controllo: i poli sono 0,4057 ± 1,2928j e −0,9057 ± 0,9020j.)

Codice MATLAB: una funzione che costruisce la tabella e gestisce lo zero con il metodo ε. Salvala come routh_table.m.

function R = routh_table(c)
% Tabella di Routh. c = coefficienti in ordine decrescente di potenza.
n = length(c) - 1;                 % grado del polinomio
m = ceil((n + 1) / 2);             % numero di colonne
R = zeros(n + 1, m);
a = c(1:2:end);  b = c(2:2:end);
R(1, 1:length(a)) = a;
R(2, 1:length(b)) = b;
for i = 3:n + 1
    if R(i-1, 1) == 0
        R(i-1, 1) = 1e-9;          % metodo epsilon: zero -> numero piccolo
    end
    for j = 1:m - 1
        R(i, j) = (R(i-1, 1) * R(i-2, j+1) - R(i-2, 1) * R(i-1, j+1)) / R(i-1, 1);
    end
end
end
R = routh_table([1 1 2 2 3])
cambi = sum(diff(sign(R(:,1))) ~= 0)   % cambi di segno nella prima colonna
cambi = 2 (due poli instabili, come a mano)

Prova tu

Per quali valori di K il sistema con questo polinomio è stabile?

p(s) = s³ + 3s² + 3s + K

Costruisci la tabella a mano e poi apri la soluzione.

Mostra la soluzione
  1. s³: 1, 3. s²: 3, K.
  2. s¹: (3·3 − 1·K)/3 = (9 − K)/3.
  3. s⁰: K.
  4. Prima colonna positiva: (9 − K)/3 > 0 dà K < 9, e K > 0.
Risultato: stabile per 0 < K < 9. Con K = 9 il polinomio diventa (s + 3)(s² + 3): oscilla a √3 ≈ 1,73 rad/s.