Ciclo for in Matlab
salve a tutti, devo risolvere questo ciclo for in matlab con questa istruzione:
p_it= VGM_i + max {0; p (rif)_t - VGM_i }
Ovvero p di it dove i va da 1 a 3 e t va da 1 a 5 è uguale a VGM di i + il massimo numero tra 0 e la sottrazione di p (rif) di t meno VGM di i.
Ho tutti i dati numerici ma devo generare un ciclo che posso utilizzare un qualsiasi momento nel caso i o t aumentano oppure diminuiscono.
p_it= VGM_i + max {0; p (rif)_t - VGM_i }
Ovvero p di it dove i va da 1 a 3 e t va da 1 a 5 è uguale a VGM di i + il massimo numero tra 0 e la sottrazione di p (rif) di t meno VGM di i.
Ho tutti i dati numerici ma devo generare un ciclo che posso utilizzare un qualsiasi momento nel caso i o t aumentano oppure diminuiscono.
Risposte
Questo forum supporta la scrittura di formule matematiche. Ti consiglio di usare questa funzionalità che non mi è per niente chiaro quello che stai cercando di fare. Inoltre non mi è chiaro che cosa sono gli elementi che hai inserito nella tua equazione. Alternativamente puoi provare a postare il codice che hai scritto e spiegare quali sono le difficoltà che stai incontrando nella scrittura del codice.
$ P it = VGMi + max {0; Pt - VGMi} $
Praticamente devo definire la variabile P di i che va da 1 a 3 e t che va da 1 a 5
che sarebbe VGM di i che va da 1 a 3 sommato al massimo valore tra zero e la sottrazione fra P(di riferimento) di t che va da 1 a 5 ed il VGM di i che va da 1 a 3.
Non riesco a definire la massimo nel ciclo for
for t= 1:5
for i=1:3
Pit= ??????????
end
end
Ho tra i dati il valore dei tre VGM ed i 5 P di riferimento
Praticamente devo definire la variabile P di i che va da 1 a 3 e t che va da 1 a 5
che sarebbe VGM di i che va da 1 a 3 sommato al massimo valore tra zero e la sottrazione fra P(di riferimento) di t che va da 1 a 5 ed il VGM di i che va da 1 a 3.
Non riesco a definire la massimo nel ciclo for
for t= 1:5
for i=1:3
Pit= ??????????
end
end
Ho tra i dati il valore dei tre VGM ed i 5 P di riferimento
È prima di tutto comodo definire $P$ come una matrice $3 xx 5$. L'elemento $P(i,t)$ della matrice rappresenterà il valore $P_{it}$ nella tua equazione. Un discorso analogo va fatto con $P$ e $VGM$. Entrambi saranno o un vettore riga o colonna. Assumerò vettori riga nel seguito. In questo modo è possibile sfruttare le capacità di matlab di gestire questo genere di dati.
Usando queste matrici il tuo ciclo diventa semplicemente:
Usando queste matrici il tuo ciclo diventa semplicemente:
for i=1:3 for t=1:5 P(i, t) = VGM(i) + max(0, P(t) - VGM(i)); end end
Però a me $ P_it $ mi serve come vettore e non come matrice...
Mi mostreresti allora il codice che hai scritto finora?
$ clc; clear all;
seg = 3;
day = 5;
AA=zeros(day,seg.*day);
j=0;
for h=1:day
for i=1:seg
AA(h,j+i)=1;
end
j=seg*h;
end
AA $
Questo per definire la matrice AA. Poi devo definire un vettore colonna di 15 elementi formati da quella formula che ti ho messo sopra dove ho tutti i numeri ma devo creare un ciclo in modo tale che se i dati cambiano cmq il programma può essere usato cmq.
PS: poi devo creare altri due vettori ed usare la funzione linprog per arrivare ad una soluzione ottima. Ma questi vettori sono standard
seg = 3;
day = 5;
AA=zeros(day,seg.*day);
j=0;
for h=1:day
for i=1:seg
AA(h,j+i)=1;
end
j=seg*h;
end
AA $
Questo per definire la matrice AA. Poi devo definire un vettore colonna di 15 elementi formati da quella formula che ti ho messo sopra dove ho tutti i numeri ma devo creare un ciclo in modo tale che se i dati cambiano cmq il programma può essere usato cmq.
PS: poi devo creare altri due vettori ed usare la funzione linprog per arrivare ad una soluzione ottima. Ma questi vettori sono standard
"machefai":
Però a me $ P_it $ mi serve come vettore e non come matrice...
ma una matrice ed un vettore possiamo dire che è la stessa cosa:
puoi moltiplicare il numero della riga per la dimensione della riga ed aggiungere la colonna
Diciamo che a me serve esclusivamente come vettore e non devo moltiplicarlo per la matrice. Dovrebbe uscire un vettore di 15 numeri...
Avevo pensato qualcosa del genere...che però credo non funzioni...
VGM(1)= numero
VGM(2)= numero
VGM(3)= numero
Prif(1)= numero
Prif(2)= numero
Prif(3)= numero
Prif(4)= numero
Prif(5)= numero
for t=1:5
for i=1:3
P(i)(t)= VGM(i) + max (0;(Prif(t)-VGM(i)));
end
end
Ma naturalmente mi da errori l'istruzione nel ciclo...consigli????
Avevo pensato qualcosa del genere...che però credo non funzioni...
VGM(1)= numero
VGM(2)= numero
VGM(3)= numero
Prif(1)= numero
Prif(2)= numero
Prif(3)= numero
Prif(4)= numero
Prif(5)= numero
for t=1:5
for i=1:3
P(i)(t)= VGM(i) + max (0;(Prif(t)-VGM(i)));
end
end
Ma naturalmente mi da errori l'istruzione nel ciclo...consigli????
Usa una matrice. Se poi più avanti hai bisogno di accedere alle righe separatamente puoi usare il comando P(i,
. Usare le matrici è il metodo classico per risolvere questo genere di problemi in Matlab.

Non saprei proprio come usare una matrice...visto che la formula che ho mi consente di avere come risultato solo un vettore..!! Non potresti darmi una mano???
Devo ricavare il prezzo relativo ad ogni segmento per ogni giorno...
P_11 che rappresenta il prezzo relativo al segmento 1 per il giorno 1
P_21 che rappresenta il prezzo relativo al segmento 2 per il giorno 1
P_31 che rappresenta il prezzo relativo al segmento 3 per il giorno 1
P_12 che rappresenta il prezzo relativo al segmento 1 per il giorno 2
e così via...
P_11 = vgm1 + max[0, prif1 - vgm1]
P_21 = vgm2 + max[0, prif1 - vgm2]
P_31 = vgm3 + max[0, prif1 - vgm3]
P_12 = vgm1 + max[0, prif2 - vgm1]
e così via....
Dove VGM1 VGM2 VGM3 e prif1 prif2 prif3 prif4 prif5 sono dei numeri dati.
Naturalmente io ho analizzato il caso dove i segmenti (ovvero le i) sono 3 ed i giorni (ovvero t) sono 5. Ma quello che devo creare io dev'essere applicabile in qualsiasi caso...ovvero anche se i giorni aumentono posso cmq utilizzare questo ciclo cambiando il valore di t.
Devo ricavare il prezzo relativo ad ogni segmento per ogni giorno...
P_11 che rappresenta il prezzo relativo al segmento 1 per il giorno 1
P_21 che rappresenta il prezzo relativo al segmento 2 per il giorno 1
P_31 che rappresenta il prezzo relativo al segmento 3 per il giorno 1
P_12 che rappresenta il prezzo relativo al segmento 1 per il giorno 2
e così via...
P_11 = vgm1 + max[0, prif1 - vgm1]
P_21 = vgm2 + max[0, prif1 - vgm2]
P_31 = vgm3 + max[0, prif1 - vgm3]
P_12 = vgm1 + max[0, prif2 - vgm1]
e così via....
Dove VGM1 VGM2 VGM3 e prif1 prif2 prif3 prif4 prif5 sono dei numeri dati.
Naturalmente io ho analizzato il caso dove i segmenti (ovvero le i) sono 3 ed i giorni (ovvero t) sono 5. Ma quello che devo creare io dev'essere applicabile in qualsiasi caso...ovvero anche se i giorni aumentono posso cmq utilizzare questo ciclo cambiando il valore di t.
VGM = 1:3;
Prif= 1:5;
for y=1:length(Prif)
for x=1:length(VGM)
P(x,y) = VGM(x) + max(0, Prif(y) - VGM(x));
end
end
Ho usato questo ciclo che mi genera una matrice (3X5) ma se io volessi farlo diventare un vettore formato dalle sue colonne...come posso fare???
Prif= 1:5;
for y=1:length(Prif)
for x=1:length(VGM)
P(x,y) = VGM(x) + max(0, Prif(y) - VGM(x));
end
end
Ho usato questo ciclo che mi genera una matrice (3X5) ma se io volessi farlo diventare un vettore formato dalle sue colonne...come posso fare???
Puoi usare reshape per modificare la forma di una matrice, ma continuo a pensare che quello che hai sia una matrice (che puoi anche interpretare come "vettore di vettori" se preferisci) e non un singolo vettore.
Sto impazzendo...come faccio ad ottenere un vettore invece che una matrice?? Ti prego...dammi una mano...