2013-05-17 53 views
1

我在這裏死去。所以我有一個複雜的數字(-4.9991 + 15.2631i)。在MATLAB如果我做C當量的matlab角度函數

angle(-4.9991 + 15.2631i) = 1.8873 

我想基本上計算如下

atan(15.2631/-4.9991) = -1.2543 

爲什麼這些不同的那個角度?我需要編寫一個c函數來計算複數的角度。我這樣做是這樣的:

#define angle(x) (atan((GSL_IMAG(x)/GSL_REAL(x)))) 

但這樣給我-1.2543答案,而不是1.8873答案。我究竟做錯了什麼?

+0

'man atan2' - 它比'atan'更有用。 –

回答

6
-1.2543 + Pi(radians) = 1.8873 (with rounding) 

正如其他人所指出的,使用atan2()

+0

哦,該死的。那麼解決了一切。 #define angle(x)((atan((GSL_IMAG(x)/ GSL_REAL(x))))+ M_PI) –

+4

否......這隻適用於所有可能情況的一半。請接受上面的建議並使用atan2。 –

3

雖然使用atan2解決問題,實際問題沒有得到回答:

爲什麼這些不同呢?

你缺少一個正切函數是週期性的,有周期Pi = 3.141592 ......所以,當你寫z = atan(y/x)你想到了一些z這樣tan(z) = y/x,但也有無限的這樣的數字,因爲tan(z + pi) = tan(z)。當然,你只能得到這些無限值中的一個:最接近零的值,這不是你始終需要的值。

尤其要注意的是,由於您計算商Im/Re,因此無法區分-Im/-Re,即兩個元件上的負號不會改變商,但它是對面複數(同樣適用於2-d向量)。這就是atan2angle所做的:它們分別檢查每個組件的符號,然後確定是否應將+/- pi添加到atan的結果中。