0

以下のコードの実行中に、Error using atand Argument should be real というエラーが発生します。修正にご協力ください。

n1=1.51; 
n2=1; 
anglec = asind (n2/n1); 
angleTE=[]; 
angleTM=[]; 
for angle= 42:1:90 
   angleTE(angle)= 2*atand((sqrt (((sind (angle))^2) - ((sind (anglec))^2))) / (cosd          (angle))); 
   angleTM(angle) = 2*atand( (sqrt (((sind(angle))^2) - ((sind (anglec))^2))) / ((cosd (angle))*(sind(anglec))^2)); 
end 

plot(angle,angleTE) 
plot(angle,angleTM)enter code here
4

2 に答える 2

0

あなたが使用している三角関数には、あなたがしているように、d接尾辞が入力として度を取るので、ここでは問題ではありませんでした。sind(angle)^2 - sind(anglec)^2に負の数を与えていたのは、単に違い (例: ) でしたsqrtangleループ内の範囲を変更することでそれを修正したようです。

その修正では、 と のインデックス作成がangleTE壊れangleMEました1。インデックスを適切に作成するには、別のループ変数を使用する必要があります。

あなたが今抱えていると思われるもう1つの問題は、プロットコマンドだけです。問題は、ループangleの最後に、 が最後に取得した値 (つまり90) であることです。したがって、あなたのプロットは正しくありません。やろうとしているのでplot(42:90, angleTE)plot(42:90, angleTM)修正は次のようになります。

angle = 42:1:90;
for ii = 1:numel(angle),
    angleTE(ii) = 2*atand(sqrt(sind(angle(ii))^2 - sind(anglec)^2) / cosd(angle(ii))); 
    angleTM(ii) = 2*atand(sqrt(sind(angle(ii))^2 - sind(anglec)^2) / cosd(angle(ii))*sind(anglec)^2); 
end

または、ループの後に入れて、 andangle = 42:1:90;の先頭にある一連のゼロを処理しますが、それはエレガントではないようです。angleTEangleTM

最後に、ループの前に事前割り当てangleTEを行うことをお勧めします。angleTM

angleTE = zeros(numel(angle),1);
angleTM = zeros(numel(angle),1);
于 2013-10-07T22:31:49.950 に答える
-1

あなたは負の数の平方根を取っています。

sqrt (((sind (1))^2) - ((sind (anglec))^2))

ans =

              0 + 0.662021652888396i

これは、度を使用しているために発生していますが、Matlab はラジアンを想定しています。

于 2013-10-07T20:51:48.477 に答える