我收到错误使用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
答案 0 :(得分:0)
你正在使用的三角函数有一个d
后缀取度作为输入,正如你所做的那样,所以这不是你的问题。只是差异(例如sind(angle)^2 - sind(anglec)^2
)给你sqrt
的负数。我看到你通过改变循环中angle
的范围来纠正这个问题。
在该更正中,您的angleTE
和angleME
索引已经破了,因为它们不再从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;
并在angleTE
和angleTM
的开头处理一堆零,但这似乎不够优雅。
最后,我建议在循环之前预先分配angleTE
和angleTM
,
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期待弧度。