2013-02-28 56 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