2014-11-23 84 views
-1

最近,通過一個stackoverflow成員的友好響應,我學會了如何使用for循環技巧迭代遍歷每一個函數,使用與numpy不連續的函數在meshgrid上執行操作網格中的元素。然而,我發現它在大多數情況下都能正常工作,但由於某種原因,它似乎失敗了:
Emag是我創建的一個長函數。Numpy在meshgrid中迭代計算

import numpy as np 
X, Y = np.mgrid[0.1:0.15:3j, 0.1:0.15:3j] 
Z = np.zeros_like(Y)      
po = np.sqrt(X**2 + Y**2) 
phio = np.arctan2(Y,X) 
print po 
print phio 

for i in range(po.shape[0]):      
    for j in range(po.shape[1]): 
     print po[i,j] 
     print phio[i,j] 
     Z[i,j] = Emag(po[i,j], phio[i,j], 0) 
     print Z[i,j] 

下面是響應

%run C:/Users/Nigel/Desktop/Nigel07112014.py 
[[ 0.14142136 0.16007811 0.18027756]   <--- po 
[ 0.16007811 0.1767767 0.19525624] 
[ 0.18027756 0.19525624 0.21213203]] 
[[ 0.78539816 0.89605538 0.98279372]   <--- phio 
[ 0.67474094 0.78539816 0.87605805] 
[ 0.5880026 0.69473828 0.78539816]] 
0.141421356237 <--- po[0,0] 
0.785398163397 <--- phio[0,0] 
732.46186213  <--- Z[0,0] 
0.160078105936 <--- po[0,1] 
0.896055384571 <--- phio[0,1] 
--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 

似乎爲meshgrid的第二元件,所述計算機具有用於產生Z.輸出麻煩然而,當我執行埃馬克對於第二元件PO和phio分別 - 它工作得很好(見下文):

Emag(0.160078105936, 0.896055384571, 0) 
> 589.541876301 

這應該是在Z meshgrid的第二元件。

那麼哪裏出問題了?如果你處理的虛參數的指數

--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 
C:\Users\Nigel\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.4.1.1975.win-x86_64\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc) 
    195    else: 
    196     filename = fname 
--> 197    exec compile(scripttext, filename, 'exec') in glob, loc 
    198  else: 
    199   def execfile(fname, *where): 

C:\Users\Nigel\Desktop\Nigel07112014.py in <module>() 
    220   print po[i,j] 
    221   print phio[i,j] 
--> 222   Z[i,j] = Emag(po[i,j], phio[i,j], 0) 
    223   print Z[i,j] 
    224 

C:\Users\Nigel\Desktop\Nigel07112014.py in Emag(p, phi, z) 
    149 def Emag(p, phi, z): 
    150  if z >=0: 
--> 151   VE1p = (p * (z-z0) * ((MuZ)/(4 * pi * Eps0 * Eps1)) * exp(j * k1 * R0/(R0**3)) * ((3/(R0**2))- (3 * j * k1/R0)-(k1**2))) - (j * ((MuZ)/(4 * pi * Eps0 * Eps1)) * INTEGRATEZI(lambda kp: J1(kp * p) * A1(kp) * kp * k1z(kp) * (exp(1j * k1z(kp) * (z + z0))))) 
    152 
    153   VE1phi = 0 

OverflowError: math range error 
+0

作爲一個快速調試提示,修改'Emag'來打印它的參數。 – gboffi 2014-11-23 16:17:00

+1

對於它的價值,我嘗試了一個模擬Emag的代碼,它的運行完美無缺......也許你必須發佈完整的追溯 – gboffi 2014-11-23 16:19:30

+0

嗨gboffi。我已經添加了完整的錯誤信息 - 請記住,Emag確實爲單個值工作 - 只是當它們位於meshgrid中時纔會工作 – user3065619 2014-11-23 16:37:56

回答

1

變化exp(j ...Emagexp(1j ...:若跌破

完整的錯誤訊息的要求我會貼更長的錯誤消息。當它在循環內部執行時j可以收到不好的值從j循環的索引。

對於虛構的論點,我應該是正確的,我也會三重檢查您的Emag函數的結果。

+0

嗨。在我寫的代碼的開頭j = 1j(上面沒見過) – user3065619 2014-11-23 17:06:16

+0

它也沒有解釋 - 我想 - 爲什麼當輸入值時分開它工作正常。 – user3065619 2014-11-23 17:12:07

+2

即使您試圖設置'j = 1j',如果您稍後使用名爲'j'的變量進行循環,它會一遍又一遍地破壞性地更改該值。您將無法保證以後這是複雜的單位。真的,你需要更加謹慎地使用代碼中的複數。 – ely 2014-11-23 18:07:31