Sistema non lineare e pto incognito note le distanze da 3pt
Ciao a tutti. Visto che è il primo post mi presento: sono uno studente universitario al 4° anno di ingegneria con una discreta passione per la matematica.
Arrivando al dunque, ho bisogno per un programma MATLAB che sto scrivendo di identificare un punto note le coordinate di altri 3 o più punti e le relative distanze dal punto incognito. Tali misure inoltre non sono esatte, quindi il problema consiste nel trovare le coordinate che minimizzino gli scarti quadratici sulle misure.
Il problema è che la condizione di distanza da un punto è (ovviamente) un cerchio che come sappiamo non è una "condizione" lineare. (ammetto che questa frase sia espressa con un linguaggio poco matematico... ma ci siamo spiegati).
La strategia che ho applicata è la seguente:
- ho scritto la equazione dello scarto come distanza "reale" (funzione delle coordinate incognite) meno la distanza "nominale"
$ e_i(bar(x),bar(y)) = sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) - delta_i$
Dove $x_i$ e $y_i$ sono le coordinate dei punti noti e $delta_i$ sono le distanze da tali punti ovviamente reali positive.
- ho elevato al quadrato questi scarti e li ho sommati. Ottengo così una funzione in due incognite della somma degli scarti quadrati in funzione del punto incognito.
$ E(bar(x),bar(y)) = sum [sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) - delta_i$]^2 $$
- è sufficiente ora trovare il minimo di quella funzione per trovare il punto incognito. Per farlo ho calcolato le derivate in x e in y di questa funzione e le ho poste uguali a 0.
Un sistemino di due equazioni in due incognite.. facile no? NO!!! Il sistema non è lineare e non ho idea di come risolverlo. Mi sta bene anche un metodo iterativo approssimato.
Vi scrivo il sistema che ho trovato (sempre che non abbia sbagliato a fare le derivate...
):
$ { (
sum { (-2x_i + 2 bar (x)) sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) + 2x_i delta_i - 2 delta_i bar(x) } =0
),(
sum { (-2y_i + 2 bar (y)) sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) + 2y_i delta_i - 2 delta_i bar(y) } =0
):} $
Idee su come risolvere il sistema? Oppure un modo alternativo per approcciare il problema?
PS: non capisco perchè metta quei prima e dopo le righe.. non c'entrano niente con l'equazione
Arrivando al dunque, ho bisogno per un programma MATLAB che sto scrivendo di identificare un punto note le coordinate di altri 3 o più punti e le relative distanze dal punto incognito. Tali misure inoltre non sono esatte, quindi il problema consiste nel trovare le coordinate che minimizzino gli scarti quadratici sulle misure.
Il problema è che la condizione di distanza da un punto è (ovviamente) un cerchio che come sappiamo non è una "condizione" lineare. (ammetto che questa frase sia espressa con un linguaggio poco matematico... ma ci siamo spiegati).
La strategia che ho applicata è la seguente:
- ho scritto la equazione dello scarto come distanza "reale" (funzione delle coordinate incognite) meno la distanza "nominale"
$ e_i(bar(x),bar(y)) = sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) - delta_i$
Dove $x_i$ e $y_i$ sono le coordinate dei punti noti e $delta_i$ sono le distanze da tali punti ovviamente reali positive.
- ho elevato al quadrato questi scarti e li ho sommati. Ottengo così una funzione in due incognite della somma degli scarti quadrati in funzione del punto incognito.
$ E(bar(x),bar(y)) = sum [sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) - delta_i$]^2 $$
- è sufficiente ora trovare il minimo di quella funzione per trovare il punto incognito. Per farlo ho calcolato le derivate in x e in y di questa funzione e le ho poste uguali a 0.
Un sistemino di due equazioni in due incognite.. facile no? NO!!! Il sistema non è lineare e non ho idea di come risolverlo. Mi sta bene anche un metodo iterativo approssimato.
Vi scrivo il sistema che ho trovato (sempre che non abbia sbagliato a fare le derivate...

$ { (
sum { (-2x_i + 2 bar (x)) sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) + 2x_i delta_i - 2 delta_i bar(x) } =0
),(
sum { (-2y_i + 2 bar (y)) sqrt(((x_i-bar(x))^2+(y_i-bar(y))^2)) + 2y_i delta_i - 2 delta_i bar(y) } =0
):} $
Idee su come risolvere il sistema? Oppure un modo alternativo per approcciare il problema?
PS: non capisco perchè metta quei prima e dopo le righe.. non c'entrano niente con l'equazione
Risposte
Darò poi un'occhiata migliore al tuo metodo per vedere se si può migliorare qualcosa. In ogni caso, puoi risolvere i sistemi non lineari in MATLAB usando fsolve.
fsolve va benissimo! Grazie!
Ora però devo capire se ho fatto un errore nei calcoli (o peggio teorico) visto che trova dei punti sbagliati.....
EDIT: ho fatto le derivate con un programma (per pigrizia
) e le ho prese per buone, ma guardandole mi sembra che ci sia qualcosa che non va. Ora le rifaccio a mano e poi dico...
Ora però devo capire se ho fatto un errore nei calcoli (o peggio teorico) visto che trova dei punti sbagliati.....

EDIT: ho fatto le derivate con un programma (per pigrizia

Credo di aver trovato un errorino: gli ultimi due addendi (quelli con il delta) penso debbano essere cambiati di segno. Ma nonostante questo crea problemi 
Allego il punto incriminato del codice, magari qualcuno capisce dove sbaglio...
dove fun è la seguente function:
Il punto deve distare 1 da 0,0; 1 da 1,1 e radice di 2 da 1,0. Si tratta dunque del quarto vertice del quadrato tra 0,0 e 1,1 ovvero 0,1. Il problema è che se fate copia incolla del codice lì sopra mi restituisce un punto in 0.67,0.3...

Allego il punto incriminato del codice, magari qualcuno capisce dove sbaglio...
pti_test=[0,0; 1,1; 1,0]; d=[1; 1; sqrt(2)]; pti_new=fsolve(@fun,[0;0],[],pti_test,d)
dove fun è la seguente function:
function F=fun(X,pti,d0) x0=pti(:,1); y0=pti(:,2); F=zeros(1,2); for i=1:size(x0,1) F(1)=F(1)+(-2*x0(i)+2*X(1)) *sqrt((x0(i)-X(1))^2 +(y0(i)-X(2))^2) ... - 2*x0(i)*d0(i) + 2*d0(i)*X(1); F(2)=F(2)+(-2*y0(i)+2*X(2)) *sqrt((x0(i)-X(1))^2 +(y0(i)-X(2))^2) ... - 2*y0(i)*d0(i) + 2*d0(i)*X(2); end end
Il punto deve distare 1 da 0,0; 1 da 1,1 e radice di 2 da 1,0. Si tratta dunque del quarto vertice del quadrato tra 0,0 e 1,1 ovvero 0,1. Il problema è che se fate copia incolla del codice lì sopra mi restituisce un punto in 0.67,0.3...
Ok. Mi sembra di parlare un po' da solo. Ma aggiorno il post in modo che se qualcuno decide di aiutarmi non perda tempo su cose che ho già risolto.
Il problema non è computazionale, ma matematico. Le derivate che ho calcolato sono giuste. Il problema è che la funzione E(x,y) che io credevo (ad intuito e logica) assomigliasse a un parabolide con un solo punto critico, presenta invece numerosi punti di sella e minimi relativi.
Una ricerca del punto di minimo basandosi solamente sul teorama di Fermat della derivata nulla non fa altro che individuare il primo punto critico che il metodo iterativo incontra, che non corrisponde necessariamente con il minimo assoluto da me cercato.
Ora che ho capito il problema accetto suggerimenti sulla ricerca di un punto di minimo assoluto in una funzione in due variabili con derivate NON MONOTONE.
Help
Il problema non è computazionale, ma matematico. Le derivate che ho calcolato sono giuste. Il problema è che la funzione E(x,y) che io credevo (ad intuito e logica) assomigliasse a un parabolide con un solo punto critico, presenta invece numerosi punti di sella e minimi relativi.
Una ricerca del punto di minimo basandosi solamente sul teorama di Fermat della derivata nulla non fa altro che individuare il primo punto critico che il metodo iterativo incontra, che non corrisponde necessariamente con il minimo assoluto da me cercato.
Ora che ho capito il problema accetto suggerimenti sulla ricerca di un punto di minimo assoluto in una funzione in due variabili con derivate NON MONOTONE.
Help


Ho risolto usando FMINSEARCH. E' una function di matlab di cui non conoscevo neanche l'esistenza, ma sostanzialmente fa quello che mi serve. Le devo passare la funzione E (non le sue derivate) e lei fa il resto.
Grazie comunque dell'aiuto.
Ciao!
Grazie comunque dell'aiuto.
Ciao!