2016-11-07 16 views
0
for j = 1:4 
    n = (co(e(j,2),:) - co(e(j,1),:)); 
    n = n./norm(n); 
    F = e(j,5).*e(j,4)./e(j,3).*-(dot(u,n)).*n 
    theta = acosd(dot(F,n)/(norm(F)*norm(n))) 

    if theta == 180 
     F2 = [F2; -sqrt(F(1)^2 + F(2)^2 + F(3)^2)] 
    else if theta == 0 
      F2 = [F2; sqrt(F(1)^2 + F(2)^2 + F(3)^2)] 
     end 
    end 
end 

本質的に、if文のFの最初の値が無視されているシータの値は180です。チェックするために、私は 'whos theta'をやっていて、シータ== 180を0に戻したコードに書きました.j = 2:4の場合でも、コードはj = 2となり、θの値は180となる。これは、j = 1のif文を完全にスキップしているかのようなものです。これは、Fが3つの非ゼロ成分を持つ唯一の行列ベクトルですが、これを解決する方法はまだ分かりません。私のMatlabコードが機能していない(非常に単純で奇妙なif文の問題)

+0

theta == 180は0を返します.thetaは180ではありません。問題はif文ではなく、theta(またはF)への値の代入です。 j = 1のときは、Fとthetaを個別に調べることをお勧めします。 –

答えて

0

thetaは、倍数で180に非常に近いかもしれませんが、正確には180.00000001 ~= 180ではありません。与えられた公差と比較する方が良いかもしれません。

tol = 1e-3; 
if abs(theta-180)<tol 
... 
end 

MATLABは、内部浮動小数点精度epsを持って、それが面白い読み取りかもしれません。

さらに、 'else-if'ステートメントはelseifにする必要がありますが、これはコピー貼りからの誤植かもしれません。

+0

浮動小数点数を比較するために '=='と '〜='を使うことの危険性については、[この疑問](http://stackoverflow.com/questions)を参照してください。/588004/is-floating-point-math-broken)とその中のリンク。 – craigim

+0

これは問題を解決しました、ありがとう! – Jarmuh

関連する問題