2013-02-28 55 views
0

使用以下代碼:奇怪復相位顯示

from numpy import * 
from matplotlib.pyplot import * 

Radius=10 
N=1024 
dx=2*Radius/N 
dy=dx 
x=r_[-Radius:Radius:dx] 
y=r_[-Radius:Radius:dy] 
X, Y = meshgrid(x,y) 
R = sqrt(X**2+Y**2) 
PHI = arctan2(Y,X) 

ringthing = R < Radius 
ring = zeros((2,N,N),dtype=complex) 
ring[0] = ringthing 
ring[1] = ringthing*exp(1j*PHI) 

f=fig() 
p1=f.add_subplot(121) 
p1.imshow(angle(ring[0])) 
p2=f.add_subplot(122) 
p2.imshow(angle(ring[1])) 

f.show() 

第二圖像的左下方被標記爲紅色(相等於PI)沒有明顯的理由。爲什麼是這樣?

回答

0

問題是圓外的值是零,復角的零不明確(它是一個奇點)。在浮點算術鍛鍊,使得一些地區,他們評估爲0和他人-0這是通過運行

from __future__ import division 

from numpy import * 

Radius=10 
N=1024 
dx=2*Radius/N 
dy=dx 
x=r_[-Radius:Radius:dx] 
y=r_[-Radius:Radius:dy] 
X, Y = meshgrid(x,y) 
R = sqrt(X**2+Y**2) 
PHI = arctan2(Y,X) 

ringthing = R < Radius 
ring = zeros((2,N,N),dtype=complex) 
ring[0] = ringthing 
ring[1] = ringthing*exp(1j*PHI) 

print ring[1][-1, 0], angle(ring[1][-1, 0]) 
print ring[1][0, -1], angle(ring[1][0, -1]) 

與輸出

(-0+0j) 3.14159265359 
0j 0.0 

一個解決方案解決此是設置可見圓圈外的所有值都明確爲零。

+0

整潔!我試圖在這裏使用unwrap(),但是看起來像zero()+/-問題。 – Arcturus 2013-02-28 14:05:37

+0

我認爲在給定零輸入時使'angle()'返回'nan'可能是有用的,但這基本上是一個定義。 – 2013-02-28 14:07:51

+0

感謝您的詳細解釋。我正在考慮爲此提交一個錯誤報告。首先,Matlab可以很好地處理這個問題,並且根據這個例子pi相移是任意的(在你的答案中有一些潛在的實現原因)。 – rubenvb 2013-02-28 14:12:39