Distanza tra due punti generici Matlab!
Ciao a tutti!!
Mi servirebbe un aiuto in quanto non sono molto pratico di Matlab.
Il mio problema è quello di trovare la distanza tra due punti generici del piano, quindi P1(x1,y1) e P2(x2,y2) con 0
Se il calcolo dovesse risultare molto laborioso per Matlab posso sostituire il passo con 0.05.
Grazie mille in anticipo e mi scuso se non sono stato chiaro o se non è la sezione corretta!
Francesco
Mi servirebbe un aiuto in quanto non sono molto pratico di Matlab.
Il mio problema è quello di trovare la distanza tra due punti generici del piano, quindi P1(x1,y1) e P2(x2,y2) con 0
Grazie mille in anticipo e mi scuso se non sono stato chiaro o se non è la sezione corretta!
Francesco
Risposte
Qual'è lo scopo di tutti questi calcoli? Il numero di punti è chiaramente molto grande e probabilmente non è necessario.
P.S. La funzione che hai scritto non mi sembra rispettare le normali proprietà di una distanza. È per esempio evidente che se calcoli la distanza di un punto con se stesso non ottieni zero e che la funzione non è simmetrica nei due input.
P.S. La funzione che hai scritto non mi sembra rispettare le normali proprietà di una distanza. È per esempio evidente che se calcoli la distanza di un punto con se stesso non ottieni zero e che la funzione non è simmetrica nei due input.
"apatriarca":
Qual'è lo scopo di tutti questi calcoli? Il numero di punti è chiaramente molto grande e probabilmente non è necessario.
P.S. La funzione che hai scritto non mi sembra rispettare le normali proprietà di una distanza. È per esempio evidente che se calcoli la distanza di un punto con se stesso non ottieni zero e che la funzione non è simmetrica nei due input.
I calcoli mi servono per la mia tesi magistrale. Diciamo che adesso il problema non è contestualizzato e quindi può risultare insensato, ma fa parte di un discorso più grande. In breve posso dirvi che mi serve calcolare il travel between tra due punti all'interno di un magazzino. Oltre a quella funzione distanza ne ho altre due da dover utilizzare, per andare a confermare i risultati ottenuti con il metodo numerico. Non so se adesso è un po' più chiaro il concetto. Se hai altre domande chiedi pure!

Quindi è veramente difficile farlo? Ahah! Grazie!
Non è una questione di difficoltà a scriverlo, si tratta semplicemente di fare qualche ciclo sulle coordinate, ma piuttosto se sia necessario. A seconda di quali statistiche dei dati vuoi calcolare, c'è probabilmente un metodo migliore che calcolare tutti quei valori. È per questo che ti sto chiedendo a che ti serve.
"apatriarca":
Non è una questione di difficoltà a scriverlo, si tratta semplicemente di fare qualche ciclo sulle coordinate, ma piuttosto se sia necessario. A seconda di quali statistiche dei dati vuoi calcolare, c'è probabilmente un metodo migliore che calcolare tutti quei valori. È per questo che ti sto chiedendo a che ti serve.
Di necessario è necessario perchè mi è stato richiesto dal mio relatore che sicuramente ne saprà più di me sull'argomento..Ahah!!! E comunque, a parte tutto, mi serve perchè devo confermare dei dati e poichè è una tesi di ricerca devo essere (e anche il mio relatore vuole esserlo) sicuro che ciò che abbiamo ottenuto sia veritiero e corretto e l'unico modo per verificarlo è questo. Devo calcolare la media di tutti i percorsi possibili, ma ripeto ciò che ho chiesto qui è solo una parte dei calcoli. Puoi aiutarmi per favore? Grazie!

Il modo più semplice per calcolare il tuo valore è qualcosa del tipo:
Si può tuttavia calcolare abbastanza facilmente che con \(N \to \infty\) il valore della media tende a \(1\). Hai infatti che l'integrale corrispondente si semplifica in
\[
\iiiint_{I^4} (y_1 + x_2 - x_1 + y_2)\,dy_1\,dx_2\,dx_1\,dy_2 = \int_0^1 y_1\,dy_1 + \int_0^1 x_2\,dx_2 - \int_0^1 x_1\,dx_1 + \int_0^1 y_2\,dy_2 \]
che si può risolvere molto facilmente.
N = 101 coords = linspace(0, 1, N); tot = 0; for x1=coords for y1=coords for x2=coords for y2=coords tot = tot + y1 + x2 - x1 + y2; end end end end media = tot / (N*N*N*N);
Si può tuttavia calcolare abbastanza facilmente che con \(N \to \infty\) il valore della media tende a \(1\). Hai infatti che l'integrale corrispondente si semplifica in
\[
\iiiint_{I^4} (y_1 + x_2 - x_1 + y_2)\,dy_1\,dx_2\,dx_1\,dy_2 = \int_0^1 y_1\,dy_1 + \int_0^1 x_2\,dx_2 - \int_0^1 x_1\,dx_1 + \int_0^1 y_2\,dy_2 \]
che si può risolvere molto facilmente.
"apatriarca":
Il modo più semplice per calcolare il tuo valore è qualcosa del tipo:
N = 101 coords = linspace(0, 1, N); tot = 0; for x1=coords for y1=coords for x2=coords for y2=coords tot = tot + y1 + x2 - x1 + y2; end end end end media = tot / (N*N*N*N);
Si può tuttavia calcolare abbastanza facilmente che con \(N \to \infty\) il valore della media tende a \(1\). Hai infatti che l'integrale corrispondente si semplifica in
\[
\iiiint_{I^4} (y_1 + x_2 - x_1 + y_2)\,dy_1\,dx_2\,dx_1\,dy_2 = \int_0^1 y_1\,dy_1 + \int_0^1 x_2\,dx_2 - \int_0^1 x_1\,dx_1 + \int_0^1 y_2\,dy_2 \]
che si può risolvere molto facilmente.
Allora, innanzitutto grazie per la risposta! Volevo chiederti, ma questo codice considera il fatto che x2 possa essere minore di x1? Devo aggiungere il valore assoluto nella funzione? E poi..dovrei fare la stessa cosa con la funzione
x1*tan(alfa)-y1+(x2-x1)/cos(alfa)+x2*tan(alfa)-y2. Basta cambiare la parte della funzione giusto? Ma se volessi sapere i risultati di ogni iterezione, come posso modificarlo? Cioè se dovesse servirmi non solo il totale, ma ogni singola iterazione?
Mi spiego meglio. Io ho questi generici punti P1 e P2. Per ogni possibile coppia devo calcolare i tre possibili itinerari con le tre funzioni:
\(\displaystyle y1+x2-x1+y2 \)
\(\displaystyle x1*tan(alfa)-y1+(x2-x1)/cos(alfa)+x2*tan(alfa)-y2 \)
\(\displaystyle 2-y1-y2+(x2-x1) \)
Per ogni coppia di punti mi servirebbe il valore relativo ad ogni funzione, perchè poi di questi tre valori per coppia devo prendere il minore. Dovrò sommare i minori di ogni coppia e fare il valore medio. Per questo chiedevo come è possibile modificare il codice in modo tale da avere come output i singoli valori.
Grazie di nuovo!
\(\displaystyle y1+x2-x1+y2 \)
\(\displaystyle x1*tan(alfa)-y1+(x2-x1)/cos(alfa)+x2*tan(alfa)-y2 \)
\(\displaystyle 2-y1-y2+(x2-x1) \)
Per ogni coppia di punti mi servirebbe il valore relativo ad ogni funzione, perchè poi di questi tre valori per coppia devo prendere il minore. Dovrò sommare i minori di ogni coppia e fare il valore medio. Per questo chiedevo come è possibile modificare il codice in modo tale da avere come output i singoli valori.
Grazie di nuovo!
Ciao, il problema è che avrai \(N^4 \times 3\) valori. Se \(N = 100\) significa \(300\,000\,000\) di valori. Siccome matlab memorizza ogni valore intero su \(8\) byte significa che avrai un array di \(2.4\,\mathrm{GB}.\) Non ho mai lavorato con array di queste dimensioni in Matlab ma suppongo sia possibile. Ci impiegherà comunque un po' di tempo e immagino potrebbe valer a questo punto la pena di farlo con un qualche linguaggio più performante. Nel codice devi semplicemente creare l'array all'inizio e fare un ciclo sugli indici invece che sui valori.
E' da un po' che non lavoro con Matlab (negli ultimi anni ho principalmente usato Python o C++) ma se provi a postare quello che stai provando a fare forse ti posso aiutare. Potrebbe convenire partire con un numero di valori inferiori (per esempio 10 suddivisioni) durante lo sviluppo. Per chiarezza ti interessa quindi trovare il valore medio di
\[ \Bigl(y_1 + x_2 - x_1 + y_2\Bigr) \wedge \Bigl(x_1\,\tan\alpha - y_1 + \frac{x_2 - x_1}{\cos\alpha} + x_2\,\tan\alpha - y_2\Bigr) \wedge \Bigl(2 - y_1 - y_2 + (x_2 - x_1)\Bigl) \]
dove ho usato \(\wedge\) per indicare il minimo quindi? Che cos'è \(\alpha\)? Se è una costante hai allora tre funzioni che sono somma di addendi che dipendono da una sola coordinata. Dal punto di vista puramente analitico è quindi possibile affrontare questo problema trovando le regioni in cui ogni funzione è quella minima e integrare queste funzioni su tali regioni separatamente. Non è particolarmente difficile farlo ma se il tuo professore ritiene che fare i calcoli sia il metodo corretto continua pure in questo modo.
E' da un po' che non lavoro con Matlab (negli ultimi anni ho principalmente usato Python o C++) ma se provi a postare quello che stai provando a fare forse ti posso aiutare. Potrebbe convenire partire con un numero di valori inferiori (per esempio 10 suddivisioni) durante lo sviluppo. Per chiarezza ti interessa quindi trovare il valore medio di
\[ \Bigl(y_1 + x_2 - x_1 + y_2\Bigr) \wedge \Bigl(x_1\,\tan\alpha - y_1 + \frac{x_2 - x_1}{\cos\alpha} + x_2\,\tan\alpha - y_2\Bigr) \wedge \Bigl(2 - y_1 - y_2 + (x_2 - x_1)\Bigl) \]
dove ho usato \(\wedge\) per indicare il minimo quindi? Che cos'è \(\alpha\)? Se è una costante hai allora tre funzioni che sono somma di addendi che dipendono da una sola coordinata. Dal punto di vista puramente analitico è quindi possibile affrontare questo problema trovando le regioni in cui ogni funzione è quella minima e integrare queste funzioni su tali regioni separatamente. Non è particolarmente difficile farlo ma se il tuo professore ritiene che fare i calcoli sia il metodo corretto continua pure in questo modo.
Ciao e grazie nuovamente per la risposta. Sì, in pratica mi servirebbe trovare il minimo tra i tre itinerari diversi per ogni coppia di punti. Sì, alfa è una costante che abbiamo calcolato precedentemente. Comunque, credo di aver risolto.Ho iniziato prima con passo di 0.2, poi di 0.05 e adesso ho provato a fare 0.02, vediamo cosa ne uscirà! Analiticamente l'avevamo già svolto, diciamo che ci serviva una conferma di altro tipo. Se dovessi avere altri dubbi ti scrivo!
Grazie ancora!
Grazie ancora!