function x = full_calibration_min(M) m11 = M(1,1); m13 = M(1,3); m14 = M(1,4); m15 = M(1,5); m22 = M(2,2); m25 = M(2,5); m34 = M(3,4); m35 = M(3,5); m44 = M(4,4); m55 = M(5,5); a = m11*m22^2 - m22*m13^2; b = 2*m11*m22^2*m44 - m22^2*m14^2 - 2*m22*m13^2*m44 ... - 2*m11*m22*m34^2 - 2*m11*m22*m35^2 - m22^2*m15^2 ... + 2*m13*m22*m34*m14 + m13^2*m34^2 + 2*m13*m22*m35*m15 + m13^2*m35^2; c = - 2*m13*m35^3*m15 - m22*m13^2*m44^2 + m11*m22^2*m44^2 ... + m13^2*m35^2*m44 + 2*m13*m22*m34*m14*m44 + m13^2*m34^2*m44 ... - 2*m11*m22*m34^2*m44 - 2*m13*m34^3*m14 - 2*m11*m22*m35^2*m44 ... + 2*m11*m35^2*m34^2 + m22*m14^2*m35^2 - 2*m13*m35^2*m34*m14 ... - 2*m13*m34^2*m35*m15 + m11*m34^4 + m22*m15^2*m34^2 ... + m22*m35^2*m15^2 + m11*m35^4 - m22^2*m14^2*m44 ... + 2*m13*m22*m35*m15*m44 + m22*m34^2*m14^2 - m22^2*m15^2*m44; r = roots([a b c]); W = [zeros(3,3) zeros(3,2); zeros(2,3) eye(2)]; if isreal(r(1)) | isreal(r(2)) x1 = x_given_lambda(M, r(1), W); e1 = x1' * M * x1; x2 = x_given_lambda(M, r(2), W); e2 = x2' * M * x2; if e1 < e2 x = x1; else x = x2; end else sprintf('bad thing: imaginary solution\n'); end if false f1 = @(l) det(M + l * W); f2 = @(l) polyval([c3 c2 c1], l); figure; hold on; fplot(f1, [ - 10 10], 'k - '); fplot(f2, [ - 10 10], 'r - '); end function x = x_given_lambda(M, lambda, W) Z = (M + lambda * W); [a, b] = eig(Z * Z'); v0 = a(:,1); norm(v0(4:5)) x = v0 * (sign(v0(1)) / norm(v0(4:5)) );