Вы запрашиваете решение нелинейной системы уравнений. Для математически наклонных я выпишу уравнения ограничений:
Предположим, у вас есть позиции точек A, B, C, D. Мы определяем векторы AB = A-B и т. Д., И, кроме того, мы используем обозначение nAB для обозначения нормализованного вектора AB / | AB |. С этим обозначением имеем:
AB.AB = fixed
CD.CD = fixed
CB.CB = r*r
nAB.nCB = cos(ang1)
nDC.nBC = cos(ang2)
Let E = D - DC.(nCB x nAB) // projection of D onto plane defined by ABC
nEC.nDC = cos(tors1)
nEC x nDC = sin(tors1) // not sure if your torsion angle is signed (if not, delete this)
где точка (.) Обозначает скалярное произведение, а крестик (x) обозначает перекрестное произведение.
Каждая точка определяется 3-мя координатами, поэтому существует 12 неизвестных и 6 уравнений ограничения, оставляя 6 степеней свободы без ограничений. Это DOF 6 калибров из поступательной и вращательной инвариантности пространства.
Предполагая, что у вас есть старые точечные позиции A ', B', C 'и D', и вы хотите найти новое решение, которое "ближе всего" (в определенном смысле, которое я определил) к этим старым позициям, тогда вы решение задачи оптимизации:
minimize: AA'.AA' + BB'.BB' + CC'.CC' + DD'.DD'
subject to the 4-5 constraints above.
Эта оптимизационная задача не имеет хороших свойств, поэтому вы захотите использовать что-то вроде сопряженного градиентного спуска, чтобы найти локально оптимальное решение с исходным предположением, представляющим собой старые точки. Это итеративное решение, которое, как вы сказали, неприемлемо, но прямого решения не существует, если вы не проясните свою проблему.
Если это звучит хорошо для вас, я могу остановиться на мельчайших подробностях выполнения численной оптимизации.