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

Messaggioda MrChopin » 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?
MrChopin
Junior Member
Junior Member
 
Messaggio: 104 di 184
Iscritto il: 14/10/2016, 16:54

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

Messaggioda ingres » 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.
Chi non vorrà attingere ad altra intelligenza che alla sua, si troverà ben presto ridotto alla più miserabile di tutte le imitazioni: a quella delle sue stesse opere (Ingres)
ingres
Senior Member
Senior Member
 
Messaggio: 1412 di 1718
Iscritto il: 30/10/2022, 11:45

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

Messaggioda MrChopin » 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.
MrChopin
Junior Member
Junior Member
 
Messaggio: 105 di 184
Iscritto il: 14/10/2016, 16:54

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

Messaggioda ingres » 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.
Chi non vorrà attingere ad altra intelligenza che alla sua, si troverà ben presto ridotto alla più miserabile di tutte le imitazioni: a quella delle sue stesse opere (Ingres)
ingres
Senior Member
Senior Member
 
Messaggio: 1413 di 1718
Iscritto il: 30/10/2022, 11:45

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

Messaggioda MrChopin » 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
MrChopin
Junior Member
Junior Member
 
Messaggio: 106 di 184
Iscritto il: 14/10/2016, 16:54


Torna a Ingegneria

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite