绘制atand针对不同角度值的函数时出错

时间:2013-10-07 20:23:28

标签: matlab math

我收到错误使用atand Argument的错误在执行下面的代码时应该是真实的。请帮助纠正它。

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

2 个答案:

答案 0 :(得分:0)

你正在使用的三角函数有一个d后缀取度作为输入,正如你所做的那样,所以这不是你的问题。只是差异(例如sind(angle)^2 - sind(anglec)^2)给你sqrt的负数。我看到你通过改变循环中angle的范围来纠正这个问题。

在该更正中,您的angleTEangleME索引已经破了,因为它们不再从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

或者在你的循环之后放置angle = 42:1:90;并在angleTEangleTM的开头处理一堆零,但这似乎不够优雅。

最后,我建议在循环之前预先分配angleTEangleTM

angleTE = zeros(numel(angle),1);
angleTM = zeros(numel(angle),1);

答案 1 :(得分:-1)

您正在使用负数的sqrt。

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

ans =

              0 + 0.662021652888396i

这种情况正在发生,因为你正在使用度数,但Matlab期待弧度。