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

con il seguente codice dentro:
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?

con il seguente codice dentro:
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?
Risposte
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.
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.
"ingres":
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.
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.
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.
"ingres":
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