Determine la posición de un punto en el espacio 3D dada la distancia a N puntos con coordenadas conocidas
Estoy tratando de determinar las coordenadas (x, y, z) de un punto p. Lo que tengo son las distancias a 4 puntos diferentes m1, m2, m3, m4 con coordenadas conocidas.
En detalle: lo que tengo son las coordenadas de 4 puntos (m1, m2, m3, m4) y no están en el mismo plano:
m1: (x1,y1,z1),
m2: (x2,y2,z2),
m3: (x3,y3,z3),
m4: (x4,y4,z4)
y las distancias euclidianas forman m1-> p, m2-> p, m3-> p y m4-> p que son
D1 = sqrt( (x-x1)^2 + (y-y1)^2 + (z-z1)^2);
D2 = sqrt( (x-x2)^2 + (y-y2)^2 + (z-z2)^2);
D3 = sqrt( (x-x3)^2 + (y-y3)^2 + (z-z3)^2);
D4 = sqrt( (x-x4)^2 + (y-y4)^2 + (z-z4)^2);
Estoy buscando (x, y, z). Intenté resolver este sistema no lineal de 4 ecuaciones y 3 incógnitas con matlab fsolve tomando las distancias euclidianas pero no las logré.
Hay dos preguntas:
¿Cómo puedo encontrar las coordenadas desconocidas del punto p: (x, y, z)¿Cuál es el número mínimo de puntos m con coordenadas conocidas y distancias a p que necesito para encontrar (x, y, z)?EDITAR:
Aquí hay un pedazo de código que no da soluciones:
Digamos que los puntos que tengo son:
m1 = [ 370; 1810; 863];
m2 = [1586; 185; 1580];
m3 = [1284; 1948; 348];
m4 = [1732; 1674; 1974];
x = cat(2,m1,m2,m3,m4)';
Y la distancia de cada punto a p es
d = [1387.5; 1532.5; 1104.7; 0855.6]
Por lo que he entendido, si quiero ejecutar fsolve, tengo que usar lo siguiente: 1. Crear una función 2. Llamar a fsolve
function F = calculateED(p)
m1 = [ 370; 1810; 863];
m2 = [1586; 185; 1580];
m3 = [1284; 1948; 348];
m4 = [1732; 1674; 1974];
x = cat(2,m1,m2,m3,m4)';
d = [1387.5; 1532.5; 1104.7; 0855.6]
F = [d(1,1)^2 - (p(1)-x(1,1))^2 - (p(2)-x(1,2))^2 - (p(3)-x(1,3))^2;
d(2,1)^2 - (p(1)-x(2,1))^2 - (p(2)-x(2,2))^2 - (p(3)-x(2,3))^2;
d(3,1)^2 - (p(1)-x(3,1))^2 - (p(2)-x(3,2))^2 - (p(3)-x(3,3))^2;
d(4,1)^2 - (p(1)-x(4,1))^2 - (p(2)-x(4,2))^2 - (p(3)-x(4,3))^2;];
y luego llamar a fsolve:
p0 = [1500,1500,1189]; % initial guess
options = optimset('Algorithm',{'levenberg-marquardt',.001},'Display','iter','TolX',1e-1);
[p,Fval,exitflag] = fsolve(@calculateED,p0,options);
Estoy corriendo Matlab 2011b.
¿Me estoy perdiendo de algo?
¿Cómo sería la solución de mínimos cuadrados?
Una nota aquí es que los valores de m1, m2, m3, m4 y d pueden no darse con precisión, pero para una solución analítica que no debería ser un problema.