22#define REFINE_LAMBDA_ITERATIONS 5
48gauss_newton_refineL(
double *L,
double a12,
double a13,
double a23,
double b12,
double b13,
double b23)
54 for (
int i = 0; i < REFINE_LAMBDA_ITERATIONS; i++) {
56 const double l1_sq = l1 * l1;
57 const double l2_sq = l2 * l2;
58 const double l3_sq = l3 * l3;
61 const double r1 = l1_sq - 2.0 * b12 * l1 * l2 + l2_sq - a12;
62 const double r2 = l1_sq - 2.0 * b13 * l1 * l3 + l3_sq - a13;
63 const double r3 = l2_sq - 2.0 * b23 * l2 * l3 + l3_sq - a23;
66 if (fabs(r1) + fabs(r2) + fabs(r3) < 1e-10) {
75 const double j0 = l1 - b12 * l2;
76 const double j1 = l2 - b12 * l1;
77 const double j3 = l1 - b13 * l3;
78 const double j5 = l3 - b13 * l1;
79 const double j7 = l2 - b23 * l3;
80 const double j8 = l3 - b23 * l2;
83 const double det = 0.5 / (-j0 * j5 * j7 - j1 * j3 * j8);
86 l1 -= det * (-j5 * j7 * r1 - j1 * j8 * r2 + j1 * j5 * r3);
87 l2 -= det * (-j3 * j8 * r1 + j0 * j8 * r2 - j0 * j5 * r3);
88 l3 -= det * (j3 * j7 * r1 - j0 * j7 * r2 - j1 * j3 * r3);