0

定義済みの関数とベクトルで solve を使用しようとすると、次のエラー メッセージが表示されます。

警告: 明示的な解が見つかりませんでした。
ソルブでは 169
、カルダンアングルでは 33

3 つの未知の変数と 3 つの方程式があります。私はこの答えを見つけることができるはずです。何が間違っている可能性がありますか?

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。式は次のとおりです。

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 に答える