Sistema non lineare e pto incognito note le distanze da 3pt

pj1989
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... :roll: ):

$ { (
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
apatriarca
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.

pj1989
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 :roll: ) 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...

pj1989
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...

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...

pj1989
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 :cry: :cry:

pj1989
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!

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