2013-10-07 21 views
0

我正在使用atand參數錯誤錯誤的不同值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 

回答

-1

您正在負數的平方根。

SQRT(((信德(1))^ 2) - ((信德(anglec))^ 2))

ANS =

   0 + 0.662021652888396i 

發生這種情況,因爲使用的是度,但Matlab期待着弧度。

+0

我進行了更改,刪除複數。你能否以代碼形式提供更多關於弧度和度數的建議?由於 – user2856145

+0

世界爲什麼會有人否決這個答案?它回答了這個問題,並確定了一個負數的sqrt主要問題。來自Fortran和科學背景,我從來沒有想到信德是「罪孽,使用度」。我認爲這是「罪過,雙精度」。好吧,我的壞。所以,糾正我,或編輯我的評論。這裏太多的人都快樂了。它阻止了像我這樣的新人。 – dmm

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);