Discussioni su tematiche di ingegneria che non trovano collocazione specifica negli altri forum

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

[Matlab] Come posso inserire dei vincoli nel blocco fcn di simulink?

05/10/2023, 15:24

Ho questo blocco simulink

Immagine

con il seguente codice dentro:
Codice:
function xdot = fcn(x,u)
delta=1;
x1=x(1);
x2=x(2);
xdot1=x1*x2-delta*x1;
xdot2=-x1*x2-x2+u;
xdot=[xdot1;xdot2];
end

La mia funzione è adimensionalizzata e normalizzata quindi le variabili possono assumere massimo 0 o 1. Il problema è che la seconda variabile quando provo a controllarla va nell'iperspazio e assume valori che non hanno alcun senso fisico. Sapete come posso fare? Vorrei inserire dei vincoli sulle variabili. Ho già provato ad utilizzare il blocco saturazione ma non mi convince della scelta. Come posso fare in modo alternativo inserendo dei vincoli?

Re: [Matlab] Come posso inserire dei vincoli nel blocco fcn di simulink?

05/10/2023, 17:41

Una brutale saturazione potrebbe lo stesso far assumere internamente alle le variabili x1 e x2 valori assurdi salvo poi limitarne il valore che si vede in uscita. Tuttavia, allorchè si inverte il verso dell'andamento, bisognerà aspettare tempi biblici per tornare ad avere numeri sensati (fenomeno cosiddetto di "wind-up")

Un buon metodo potrebbe essere quello di verificare se si è arrivati al limite superiore (inferiore) della variabile x e in tal caso annullare il valore della derivata (xdot) se il valore calcolato dello stesso risultasse positivo (negativo) e quindi l'andamento fosse quello di oltrepassare il limite. Quindi questa soluzione impedisce di superare il limite, ma lascia aperta la possibilità di poter immediatamente tornare indietro qualora la derivata cambi di segno.

Re: [Matlab] Come posso inserire dei vincoli nel blocco fcn di simulink?

05/10/2023, 19:15

ingres ha scritto:Una brutale saturazione potrebbe lo stesso far assumere internamente alle le variabili x1 e x2 valori assurdi salvo poi limitarne il valore che si vede in uscita. Tuttavia, allorchè si inverte il verso dell'andamento, bisognerà aspettare tempi biblici per tornare ad avere numeri sensati (fenomeno cosiddetto di "wind-up")

Un buon metodo potrebbe essere quello di verificare se si è arrivati al limite superiore (inferiore) della variabile x e in tal caso annullare il valore della derivata (xdot) se il valore calcolato dello stesso risultasse positivo (negativo) e quindi l'andamento fosse quello di oltrepassare il limite. Quindi questa soluzione impedisce di superare il limite, ma lascia aperta la possibilità di poter immediatamente tornare indietro qualora la derivata cambi di segno.


Sulla questione saturazione ok ci siamo e ho capito ed infatti non la possa applicare perchè addirittura mi fa chattering. Però scusami magari sono ignorante come una capra io ma non ho capito come lo vorresti implementare la questione della xdot ecc... Io quello che ho pensato e fare una cosa scema mettere un if(x2<=0){x2=0} non ho messo nulla sulla derivata perchè sennò si annulla la derivata dello stato e non lo stato, credo che avrei punti di equilibrio e non uno stato nullo. Ma magari ripeto so io che sono una capra.

Re: [Matlab] Come posso inserire dei vincoli nel blocco fcn di simulink?

05/10/2023, 20:10

Il problema del chattering avviene perchè anche se limiti la variabile in basso, se la sua derivata è negativa il sistema calcolerà un valore negativo che poi cimerai di nuovo e che il sistema ricalcolerà negativo, generando un'oscillazione continua.
Per eliminare il problema bisogna agire sulla derivata che viene passata al blocco integratore. Per chiarire cosa intendo ti scrivo la condizione su x2 in metalinguaggio

A=-x1*x2-x2+u
IF ((x2<=0) AND (A<0)) OR ((x2>=1) AND (A>0))
xdot2 = 0
ELSE
xdot2=A
ENDIF

NOTA: Questa condizione potrebbe non limitare esattamente sui limiti 0 e 1, per variazioni elevate nel singolo passo di calcolo (per es. se passo direttamente da 0.5 a -1.5 mi fermerei a -1.5). Per cui conviene aggiungere comunque le condizioni if(x2<=0){x2=0}, if(x2>=1){x2=1}per ritornare comunque entro il range ammesso.

Re: [Matlab] Come posso inserire dei vincoli nel blocco fcn di simulink?

06/10/2023, 14:46

ingres ha scritto:Il problema del chattering avviene perchè anche se limiti la variabile in basso, se la sua derivata è negativa il sistema calcolerà un valore negativo che poi cimerai di nuovo e che il sistema ricalcolerà negativo, generando un'oscillazione continua.
Per eliminare il problema bisogna agire sulla derivata che viene passata al blocco integratore. Per chiarire cosa intendo ti scrivo la condizione su x2 in metalinguaggio

A=-x1*x2-x2+u
IF ((x2<=0) AND (A<0)) OR ((x2>=1) AND (A>0))
xdot2 = 0
ELSE
xdot2=A
ENDIF

NOTA: Questa condizione potrebbe non limitare esattamente sui limiti 0 e 1, per variazioni elevate nel singolo passo di calcolo (per es. se passo direttamente da 0.5 a -1.5 mi fermerei a -1.5). Per cui conviene aggiungere comunque le condizioni if(x2<=0){x2=0}, if(x2>=1){x2=1}per ritornare comunque entro il range ammesso.


Secondo me stiamo facendo un casino di pazzi inutile su reddit ho scoperto che esiste l'integratore saturato provo con quello e semmai cerco di aggiustare con i tuoi consigli e ti dico
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.