2017-08-16 109 views
2

我在MATLAB中遇到了一些非常奇怪的东西,我无法弄清楚。MATLAB解决()不能解决特定值的三角矩阵

我有两组我想要找到欧拉角的物体坐标。我设置了旋转矩阵R和符号卡丹角矩阵R_cardan来解决角度。对于第一组,我可以简单地做solve(R==R_cardan),但是当我使用第二组时,它不起作用。返回的解决方案是空的。

这可能是什么原因造成的?这里是测试代码。

clc;clear;close all; 

%% For some reason R2 does not want to give a solution 
% Find rotation matrix to transform from origin to local reference frame 
ex = [ 0.768 0.024 0.640].'; 
ey = [-0.424 0.768 0.480].'; 
ez = [-0.480 -0.640 0.600].'; 

ex2 = [ 0.612372 0.353553 -0.707107].'; 
ey2 = [0.280330 0.739199 0.612372].'; 
ez2 = [0.739199 -0.573223 0.353553].'; 

R = eye(3)*[ex ey ez] 
R2 = eye(3)*[ex2 ey2 ez2] 
% Symbolic variables 
syms beta alpha gamma 

% Set up rotatin matrices 
R_alpha = [cos(alpha) -sin(alpha) 0; sin(alpha) cos(alpha) 0; 0 0 1] 
R_beta = [cos(beta) 0 sin(beta); 0 1 0; -sin(beta) 0 cos(beta)] 
R_gamma = [1 0 0; 0 cos(gamma) -sin(gamma); 0 sin(gamma) cos(gamma)] 

% Find symbolic rotation matrix 
R_cardan = R_alpha*R_beta*R_gamma 

[alpha, beta, gamma] = find_angles(R,R_cardan) 
[alpha, beta, gamma] = find_angles(R2,R_cardan) %fails because solution is empty 

function [alpha, beta, gamma] = find_angles(R,R_cardan) 

% Solve for the angles 
sol = solve(R == R_cardan); 
alpha = double(sol.alpha(1)); 
beta = double(sol.beta(1)); 
gamma = double(sol.gamma(1)); 

end 

我目前的解决方案是手动计算角度是好的,但我对上述方法有什么问题感兴趣。

回答

2

问题将在于你解决了确切的匹配R == R_cardan。由于您正在以有限的精度进行工作,因此这很危险,并且可能没有解决方案,因为它发生在R2。您的目标是找到一个解决方案,使其差异非常小 - 理想情况下为零。

我会做,而不是执行以下操作:创建一个损失函数

Loss

,并尽量减少此功能。在R = R_cardan的理想解决方案将导致零损失,但即使这在数值上是不可能的,你会得到一个尽可能接近最优解的解决方案(就欧几里得距离而言)。

在MATLAB中,这有点复杂,但在help pages中有很好的描述。

  1. 定义中的RR_cardan方面损失函数,并把所有的未知数到载体x

    f = sum(sum((R - R_cardan).^2)); 
    x = [alpha; beta; gamma]; 
    
  2. 从分析计算损失函数的梯度和Hessian矩阵:

    gradf = jacobian(f, x).'; % column gradf 
    hessf = jacobian(gradf, x); 
    
  3. 将这些函数从符号函数转换为MATLAB函数han dles:

    fh = matlabFunction(f, gradf, hessf, 'vars', {x}); 
    
  4. 设置优化器使用的梯度和黑森州:

    options = optimoptions('fminunc', 'SpecifyObjectiveGradient', true, ... 
                'HessianFcn', 'objective', ... 
                'Algorithm', 'trust-region') 
    
  5. 最小化!

    solution = fminunc(fh, [0;0;0], options); 
    alpha_hat = solution(1); 
    beta_hat = solution(2); 
    gamma_hat = solution(3); 
    

对于第一个示例R,这给完全相同的溶液与solve。 对于第二个示例R2,重构的矩阵R2_hat(通过插入所述估计值获得成R_cardan)是几乎相同R2,但具有在至少显著数字一些差异:

R2 = 
    0.6124 0.2803 0.7392 
    0.3536 0.7392 -0.5732 
    -0.7071 0.6124 0.3536 

R2_hat = 
    0.6125 0.2805 0.7390 
    0.3533 0.7392 -0.5734 
    -0.7071 0.6123 0.3537 
+0

非常感谢您。这是一个非常好但很复杂的解决方案。然而,了解解决问题的特殊方式绝对值得。 – Ortix92