0

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

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我看到你已经通过改变循环中的范围来纠正这个问题。

在该更正中,您的索引angleTEangleME中断,因为它们不再从1. 要正确进行索引,您将需要使用不同的循环变量。

您现在似乎遇到的另一个问题只是绘图命令。问题是在循环结束时,angle它只是它所取的最后一个值(即90)。所以你的情节是不正确的。由于您正在尝试做plot(42:90, angleTE)and 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;你的循环之后并在 and 的开头处理一堆零angleTEangleTM但这似乎不优雅。

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

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

您正在取一个负数的 sqrt。

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

答案=

              0 + 0.662021652888396i

发生这种情况是因为您使用的是度数,但 Matlab 需要弧度。

于 2013-10-07T20:51:48.477 回答