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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta