0

当我尝试将solve与我的预定义函数和向量一起使用时,我收到以下错误消息:

警告:找不到明确的解决方案。
在 169 处解决
在 33 处的 cardanAngles

我有三个未知变量和三个方程。我应该能够找到这个答案。有什么问题?

V0 = transpose([-0.7969, 0.1778, 0.5774]);
V = [-0.7976  ,  0.2282  ,  0.5583];

syms a1 a2 a3 


F1 = [ cos(a3 * pi / 180).*cos(a2 * pi / 180),  cos(a3 * pi / 180).*sin(a2 * pi / 180).*sin(a1 * pi / 180)+sin(a3 * pi / 180).*cos(a1 * pi / 180), -cos(a3 * pi / 180).*sin(a2 * pi / 180).*cos(a1 * pi / 180)+sin(a3 * pi / 180).*sin(a1 * pi / 180)];
F2 = [-sin(a3 * pi / 180).*cos(a2 * pi / 180), -sin(a3 * pi / 180).*sin(a2 * pi / 180).*sin(a1 * pi / 180)+cos(a3 * pi / 180).*cos(a1 * pi / 180),  sin(a3 * pi / 180).*sin(a2 * pi / 180).*cos(a1 * pi / 180)+cos(a3 * pi / 180).*sin(a1 * pi / 180)];
F3 = [ sin(a2 * pi / 180)                    , -cos(a2 * pi / 180).*sin(a1 * pi / 180)                                                           ,  cos(a2 * pi / 180).*cos(a1 * pi / 180)                                                           ];


[a1, a2,a3] = solve(V(1)==F1*V0,V(2)==F2*V0, V(3)==F3*V0, a1,a1,a3);
4

1 回答 1

1

如果有解决方案,您可以从解决最后一个方程开始。也就是说,F3*V0-V(3)=0. eq 内容如下:

F3 = [sin(a2), -cos(a2).*sin(a1),  cos(a2).*cos(a1)]; 
V0 = [-0.7969, 0.1778, 0.5774]';

F=V0(1)*sin(a2) - V0(2)*cos(a2)*sin(a1) + V0(3)*cos(a1)*cos(a2) - V(3);

我们现在需要寻找一系列解决方案,F=0在某个地方,快速分析会得出这样的结论:

在此处输入图像描述

fsolve现在,您可以按照评论中的建议将这些用作过程的初始猜测值 。您可以稍微按摩一下原始形式并编写以下函数:

function F = qfun(x)

V0 = transpose([-0.7969, 0.1778, 0.5774]);
V = [-0.7976  ,  0.2282  ,  0.5583];
F1 = [ cos(x(3) ).*cos(x(2) ),  cos(x(3) ).*sin(x(2) ).*sin(x(1) )+sin(x(3) ).*cos(x(1) ), -cos(x(3) ).*sin(x(2) ).*cos(x(1) )+sin(x(3) ).*sin(x(1) )];
F2 = [-sin(x(3) ).*cos(x(2) ), -sin(x(3) ).*sin(x(2) ).*sin(x(1) )+cos(x(3) ).*cos(x(1) ),  sin(x(3) ).*sin(x(2) ).*cos(x(1) )+cos(x(3) ).*sin(x(1) )];
F3 = [ sin(x(2) )                    , -cos(x(2) ).*sin(x(1) )                                                           ,  cos(x(2) ).*cos(x(1) )                                                           ];
F=(F1*V0-V(1))+abs(F2*V0-V(2))+abs(F3*V0-V(3));

然后在一个单独的文件上运行类似:

options = optimset('Display','off');
for ...
x0 = [a1_found a2_found 0]; % guess values
[x,Fval,exitflag] = fsolve(@qfun,x0,options);
end...

每个猜测值向量将输出最接近的解决方案,因此循环对您的角度值进行良好采样以获得a3.

于 2013-04-30T17:00:52.923 回答