Esercizio Matlab

sbangladesh
In quanto non conosco nulla di Matlab ma necessito quest'esercizio per la tesi , vi chiedo gentilmente di svolgere questo esercizio,ovvero bisogna cambiare i dati dei grafici con i seguenti:
1° grafico invariato.
2° grafico con assunzione del farmaco random di giorno in giorno (es.1° giorno 3 dosi,2° giorno 1 dose,3° giorno 5 dosi(max 7 dosi in un giorno))
3° grafico con dose crescente (1° giorno 1 dose,2° 2 dosi ecc..)
4° grafico con dose decrescente (1°giorno 7 dosi...)

Grazie mille in anticipo,qui l'esercizio con dati diversi:
sis=tf([.7 1],conv([.1 1],conv([.5 1],[36 1]))); 
t=0:.01:24*7;
u=t*0; 
T1=1:2400:24*4.5*100;
u(T1)=1;
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
close
subplot(2,1,1)
plot(t,y,T1,T1*0,'.')
grid on 
title('Concentrazione plasmatica con una dose al giorno')
xlabel('giorni') 
axis([0,max(t),0,1e-3]) 
t=0:.01:24*7;
u=t*0; 
T1=1:1200:24*4.5*100;
u(T1)=1;
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
subplot(2,1,2)
plot(t,y,T1,T1*0,'.')
grid on
title('Concentrazione plasmatica con due dosi al giorno')
xlabel('giorni') 
axis([0,max(t),0,1e-3]) 
pause   
t=0:.01:24*7;
u=t*0; 
T1=1:4800:24*4.5*100;
u(T1)=2;
y=lsim(sis,u,t);
t=t/24; 
T1=T1/24/100;
close
subplot(2,1,2)
plot(t,y,T1,T1*0,'.')
grid on
title('Concentrazione plasmatica con una dose doppia al giorno')
xlabel('giorni') 
axis([0,max(t),0,1.2e-3]) 
t=0:.01:24*7;
u=t*0; 
T1=1:1200:24*4.5*100;
u(T1)=1;
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
subplot(2,1,1)
plot(t,y,T1,T1*0,'.')
grid on
title('Concentrazione plasmatica con due dosi al giorno')
xlabel('giorni')
axis([0,max(t),0,1.2e-3])
pause   

Risposte
sbangladesh
Nessuno ha intenzione di aiutarmi?? bene.. non capisco ....non pretendo nulla ma almeno un piccolo interessamento da parte vostra ...

Raptorista1
Anche io "non pretendo nulla ma almeno"
1. Che tu non scriva il titolo in maiuscolo [cfr. regolamento]
2. Che le richieste non siano etichettate "urgenti" [cfr. regolamento]
3. Che tu non metta link a pagine esterne al forum [link rotti, tra l'altro].
4. Che tu formuli effettivamente una domanda, perché quella cosa lì sopra di sicuro non lo è.

Fatto quanto sopra, qualcuno potrebbe anche provare ad aiutarti.

sbangladesh
"Raptorista":
Anche io "non pretendo nulla ma almeno"
1. Che tu non scriva il titolo in maiuscolo [cfr. regolamento]
2. Che le richieste non siano etichettate "urgenti" [cfr. regolamento]
3. Che tu non metta link a pagine esterne al forum [link rotti, tra l'altro].
4. Che tu formuli effettivamente una domanda, perché quella cosa lì sopra di sicuro non lo è.

Fatto quanto sopra, qualcuno potrebbe anche provare ad aiutarti.


Modificato,ora la domanda è esplicita.

Raptorista1
Ok, ora va molto meglio. Sono riuscito a far girare lo script e vedo i grafici. Venendo alle tue domande, tu non sai proprio niente di matlab? Immagino tu faccia medicina o qualche variante di biotech, giusto?

sbangladesh
Esatto, biotecnologia..conosco le basi ,ma messe così non ci capisco tanto..Tu riusciresti a cambiare i dati dei grafici con quelli richiesti?

Raptorista1
Io invece non sono pratico di matlab e non ho mai usato il pacchetto di controllo, però conosco un po' di teoria e magari riesco ad aiutarti a venirne fuori.
Ad un'ispezione visiva mi sembra di vedere che il codice è composto da quattro ripetizioni dello stesso set di istruzioni che impostano e simulano il sistema dinamico e fanno un grafico della variabile di uscita.

In particolare mi sembra di vedere che il controllo del tuo sistema sia la variabile \(u\), che vale \(0\) negli istanti in cui non viene assunto il farmaco e vale \(k\) quando il farmaco viene assunto, essendo \(k\) il numero di dosi assunte in quell'occasione.
L'array \(T1\) definisce quali sono gli istanti in cui viene assunto il farmaco.
Direi quindi che devi giocare con queste variabili e far in modo che il valore di \(u\) sia quello giusto all'istante giusto.
Provaci e vediamo come te la cavi!

sbangladesh
Non capisco una cosa del grafico,per l'asse delle x troviamo i giorni , per l'asse delle y dovremmo trovare la dose assunta no? io leggo valori "0-0,5-1" e in alto x10-3.Perchè la y assume questi valori? cosa rappresenta ?

Raptorista1
Sulle \(y\) trovi l'uscita del tuo sistema dinamico, non il controllo. L'uscita è la concentrazione di farmaco in qualche unità di misura, magari mg/l.

sbangladesh
Hmm..non riesco.. mi è stato detto questo:
Per le dosi random c'è la funzione randi di MatLab: u(T1) = randi(5, 1, 7) dove 5 indima il massimo numero generabile, 1 il numero di righe e 7 il numero di colonne. Attenzione a generare T1 opportunamente dato che il file lavora su 5 giorni ma a te serve su sette giorni.
Gli altri sono semplici basta che assegni un vettore a u(T1): per esempio u(T1) = [1,2,3,4,5,6,7].

Ora , deduco che u(T1) indica il numero di dosi al giorno (?) , ho impostato u(T1) come da lui citato ma mi da un errore e il grafico non compare "In an assignment A(:) = B, the number of elements in A and B must be the same."
Se invece assegno ad u(T1) ad esempio il valore "2" ,in primis non so cosa ho appena fatto ,inoltre il risultato è un grafico avente i dati che fuoriescono dall'asse x y .Insomma non si vedono, puntano in alto.

Raptorista1
"xxrigoxx":
Ora , deduco che u(T1) indica il numero di dosi al giorno (?)

Non è che ci fosse tanto da dedurre qui, bastava leggere quello che ti ho scritto prima:
"Raptorista":
... la variabile \( u \), che vale \( 0 \) negli istanti in cui non viene assunto il farmaco e vale \( k \) quando il farmaco viene assunto, essendo \( k \) il numero di dosi assunte in quell'occasione.


"xxrigoxx":
ho impostato u(T1) come da lui citato ma mi da un errore e il grafico non compare "In an assignment A(:) = B, the number of elements in A and B must be the same."

Anche qui è solo questione di leggere ciò che matlab cerca di dirti: non puoi assegnare il vettore \(\begin{pmatrix}1 \\ 2 \\ 3 \end{pmatrix}\) al vettore \(\begin{pmatrix}1 \\ 2 \\ 3 \\ 4 \end{pmatrix}\), per ovvi motivi.

Allora, cerca di leggere e comprendere quello che ti scrivo ora. Leggi tutte le parole, per piacere :D
La simulazione del sistema dinamico avviene con lo scorrere del tempo. Il tempo [discreto] viene scandito dalla variabile
t=0:.01:24*7;
che significa "dividi il tempo da 0 a 24*7 in istanti lunghi 0.01 ciascuno" [l'unità di misura è l'ora].

Gli istanti di tempo in cui somministri il farmaco sono dati da
T1=1:2400:24*4.5*100;

Se stampi questo vettore con matlab ottieni
> T1
T1 =

       1    2401    4801    7201    9601

Questi sono i numeri [indici] degli istanti temporali a cui somministrare il farmaco: al primo istante temporale, al 2401-esimo, al 4801-esimo e così via. Siccome gli istanti temporali durano centesimi di ora, 2400 di essi sono 24 ore, cioè un giorno, 4800 sono due giorni e così via.

Ora, la variabile controllo \(u\) è un vettore lungo quanto \(t\) che ti dice quanto farmaco somministrare all'istante i-esimo [è l'ultima volta che ripeto questa frase].
Inizialmente lo imposti tutto a zero
u=t*0; 

E poi modifichi solo gli indici indicati da \(T1\) impostando il valore desiderato
u(T1)=1;


Questo dovrebbe essere tutto quello che ti serve per fare almeno qualche progresso. Avanti!

sbangladesh
Ti ringrazio infinitamente per l'aiuto , ho letto attentamente .. per quanto possa riuscirci.. ora inizio a comprendere molto più ,mi sono intoppato a questo punto : se imposto "T1=1:342:24*4.5*100" (che sarebbe l'assunzione del farmaco 7 volte in un giorno) come faccio a stabilire ora quante dosi il secondo giorno senza far cambiare il primo giorno..?scusa l'ignoranza ...davvero

Raptorista1
Non sono sicuro di aver capito la domanda, però ti dico due cose.
1) T1=1:343:24*4.5*100 è più corretto, usando 343 compi un errore minore.
2) Se T1 è l'array con tutti gli istanti di assunzione del farmaco con, per esempio, 7 assunzioni al giorno, allora T1(1:7) è l'array dei primi sette istanti, cioè l'array del primo giorno; T1(8:14) è l'array degli istanti di assunzione del secondo, e così via. Questo significa che facendo u(T1(1:7)) = ... assegni gli istanti del primo giorno, eccetera...

Ho risposto?

sbangladesh
"Raptorista":
Ho risposto?

Si,ora avrei le ultime due domande.
Per il grafico dove la dose deve essere random ho usato randi :
u(T1(1))=randi(5);
u(T1(2))=randi(5);
u(T1(3))=randi(5);
u(T1(4))=randi(5);
u(T1(5))=randi(5);
u(T1(6))=randi(5);
u(T1(7))=randi(5);

La domanda è , non si può sintetizzare tutto questo in una stringa?
La seconda domanda è ,quando avvio il codice mi esce solo l'ultimo grafico (prima senza il "grafico randi" uscivano i primi 2 grafici ma non il 3°),insomma mi esce solo il grafico randi e inoltre il risultato "schizza" fuori dal grafico e non posso vederlo perchè è al di sopra , non so se hai capito..Come si fa a mostrare anche la parte al di sopra?

Raptorista1
"xxrigoxx":

La domanda è , non si può sintetizzare tutto questo in una stringa?

A questo potevi rispondere da solo con un po' di inventiva! Prova
u(T1) = randi(5,1,7)


"xxrigoxx":

La seconda domanda è ,quando avvio il codice mi esce solo l'ultimo grafico (prima senza il "grafico randi" uscivano i primi 2 grafici ma non il 3°),insomma mi esce solo il grafico randi e inoltre il risultato "schizza" fuori dal grafico e non posso vederlo perchè è al di sopra , non so se hai capito..Come si fa a mostrare anche la parte al di sopra?

Non ho capito la storia del grafico randi. I grafici sono regolati dai comandi subplot.
Se il grafico eccede i limiti dell'area disegnata, devi solo ingrandire l'intervallo visualizzato; credo che il comando axis serva allo scopo [e quindi anche questa la potevi risolvere da solo :evil: ]

sbangladesh
Mi sa che hai errato tu qui "A questo potevi rispondere da solo con un po' di inventiva! Prova.." se eseguo quel comando mi mette un numero random ma uguale in tutti gl'istanti ,mentre come ho fatto io in ogni istante genera un numero random.
Ho capito il fatto di axis , grazie.
Mentre ti dicevo ,quando eseguo il codice mi mostra solo l'ultimo grafico ,gli altri tre grafici precedenti non li mostra :?

Raptorista1
"xxrigoxx":
Mi sa che hai errato tu qui "A questo potevi rispondere da solo con un po' di inventiva! Prova.." se eseguo quel comando mi mette un numero random ma uguale in tutti gl'istanti ,mentre come ho fatto io in ogni istante genera un numero random.

Questo è un colpo di scena! Può essere che la differenza stia nel fatto che io uso octave [non avendo matlab]?
Fai questa prova e dimmi se hai risultati simili ai miei
octave:1> u = [0,0,0,0,0]
u =                                                                                                                 
                                                                                                                    
   0   0   0   0   0                                                                                                
                                                                                                                    
octave:2> u([1,3,4]) = randi(3,1,3)
u =                                                                                                                 
                                                                                                                    
   3   0   2   2   0                                                                                                
                                                                                                                    
octave:3> u([1,3,4]) = randi(3,1,3)
u =

   1   0   1   2   0

octave:4> u([1,3,4]) = randi(3,1,3)
u =

   2   0   3   1   0


"xxrigoxx":

Mentre ti dicevo ,quando eseguo il codice mi mostra solo l'ultimo grafico ,gli altri tre grafici precedenti non li mostra :?

Ancora non mi è chiaro, carica la nuova versione del codice che lo faccio girare sul mio pc.

sbangladesh
Si ,risultati uguali ma quando lo applico al mio programma da l'errore
In an assignment  A(:) = B, the number of elements in A and B must be the same.
Error in (line 46) u(T1)=randi(1,2,3,4,5,6,7);

ecco il codice completo
sis=tf([.7 1],conv([.1 1],conv([.5 1],[36 1]))); 
t=0:.01:24*7;
u=t*0; 
T1=1:2400:24*7*100;
u(T1) =1;
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
close
subplot(2,1,1)
plot(t,y,T1,T1*0,'.')
grid on 
title('Concentrazione plasmatica con una dose al giorno')
xlabel('giorni') 
axis([0,max(t),0,4e-3])
t=0:.01:24*7;
u=t*0; 
T1=1:2400:24*7*100;
u(T1)=[1,2,3,4,5,6,7];
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
close
subplot(2,1,1)
plot(t,y,T1,T1*0,'.')
grid on 
title('Concentrazione plasmatica con dose crescente')
xlabel('giorni') 
axis([0,max(t),0,4e-3]) 
t=0:.01:24*7;
u=t*0; 
T1=1:2400:24*7*100;
u(T1)=[7,6,5,4,3,2,1];
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
subplot(2,1,2)
plot(t,y,T1,T1*0,'.')
grid on
title('Concentrazione plasmatica con dose decrescente')
xlabel('giorni') 
axis([0,max(t),0,4e-3])
t=0:.01:24*7;
u=t*0; 
T1=1:2400:24*7*100;
u(T1(1))=randi(7);
u(T1(2))=randi(7);
u(T1(3))=randi(7);
u(T1(4))=randi(7);
u(T1(5))=randi(7);
u(T1(6))=randi(7);
u(T1(7))=randi(7);
y=lsim(sis,u,t);
t=t/24;
T1=T1/24/100;
close
subplot(2,1,1)
plot(t,y,T1,T1*0,'.')
grid on 
title('Concentrazione plasmatica con dose casuale al giorno')
xlabel('giorni') 
axis([0,max(t),0,4e-3]);

Raptorista1
"xxrigoxx":
u(T1)=randi(1,2,3,4,5,6,7);


Dove hai preso quella sintassi? I numeri tra parentesi devono essere esattamente tre, non l'elenco dei numeri (che non sarebbe più casuale a questo punto). Usa la riga di codice che ti ho dato. Per ulteriori informazioni,
help randi

sbangladesh
Per il fatto dei grafici ? hai visto? se non hai capito cosa intendo lo rispiego un attimo.
In pratica clicco avvia e mi da come output solo un grafico .

Raptorista1
Hai fatto casino coi subplot e i close.
Subplot(i,j,k) significa che la tua finestra è divisa in i righe e j colonne e stai facendo il grafico del k-esimo.
Close chiude le finestre, quindi non vuoi usarlo in mezzo al codice.
Figure() crea una nuova finestra.

Questo significa che il tuo codice dovrebbe essere fatto più o meno così
inizio
close
figure()
[...]
subplot(2,1,1)
plot(...)
[...]
subplot(2,1,2)
plot(...)
[...]
figure()
plot(...)
[...]
subplot(2,1,1)
plot(...)
[...]
subplot(2,1,2)
plot(...)
[...]

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.