2013-04-30 38 views
0

当我尝试使用带有我收到以下错误消息,我的预定义功能和载体解决:无法从Matlabs一个答案解决功能

警告:显式的解决方案不能被发现。
在169
在cardanAngles解决在33

我有三个未知变量和三个方程式。我应该能够找到这个答案。什么可能是错的?

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); 

回答

1

如果有解决方案,您可以从解决最后的eq。即F3*V0-V(3)=0。 情商写着:

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,快速分析会产生这样的:

enter image description here

现在你可以使用这些作为如注释中所建议的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

+0

记住,我没有在我的日子里编程很多 函数F是一个值,如果猜测向量猜测它是正确的,那么假设它等于0。 第二部分。你能解释一下代码的哪些部分? for循环假设改变猜测或者什么 谢谢! – MysGubbe 2013-05-03 08:09:29

+0

您可以使用'qfun'的变体,通过省略F1,F2和F3的行来获取满足abs(F3 * V0-V(3))= 0的'a1'和'a2'的值。并编辑'F = abs(F3 * V0-V(3))'。为了得到它们,你可以使用上面提到的单独的文件,并通过合适的采样角度循环。 a1,a2的每一对猜测值都会收敛到一个近似解,然后你会得到我附加的图。然后使用获得的a1,a2作为a3值上的循环的猜测值。 – bla 2013-05-03 09:08:36