ОК, обсуждение моего предыдущего ответа проясняет, что у OP есть длина ребер, которая работает. В этом случае задача может быть задана алгебраически, а затем решена. Вот один из подходов к этому. Конечно, всегда хорошо иметь конкретный пример, изложенный в вопросе. Не имея этого, мы можем сгенерировать основы примера.
Вот случайный граф с 10 вершинами и 20 ребрами.
SeedRandom[1];
g = RandomGraph[{10, 20}];
Давайте нарисуем это и извлечем информацию о местонахождении вершины. Таким образом, мы будем знать длины, которые работают.
pic = GraphPlot[g];
pts = pic[[1, 1, 1]];
Для любой конфигурации с такой длиной следующее выражение будет равно нулю.
length[UndirectedEdge[u_, v_]] :=
Norm[pts[[u]] - pts[[v]]];
expr = Sum[((x[e[[1]]] - x[e[[2]]])^2 +
(y[e[[1]]] - y[e[[2]]])^2 -
length[e]^2)^2, {e, EdgeList[g]}];
К сожалению, выражение довольно сложно минимизировать. Давайте предположим, что у нас есть неточные оценки исходных положений вершин. (Возможно, это возможно, возможно, нет.) Мы могли бы смоделировать это так. Обратите внимание, что мы просто случайным образом возмущаем исходную картинку.
vars = Flatten[Table[{
{x[i], pts[[i, 1]] + RandomReal[{-0.4, 0.4}]},
{y[i], pts[[i, 2]] + RandomReal[{-0.4, 0.4}]}},
{i, 1, 10}], 1];
Теперь следующее должно дать работающие местоположения вершин.
FindMinimum[expr, vars]