2013-07-03 95 views
3

考慮以下代碼片段:NumPy的的分段函數

from numpy import * 
from pylab import * 

#set up constants 
v_f = 4.6e5 
l = 1.e-9 
c = 3.0e8 
g = 4*2*pi 
mu_B = 9.27e-24 
hbar = 1.05e-34 
m = 9.e-31 
alpha = v_f*hbar 
e = 1.6e-19 
eps = 8.85e-12 #epsilon_0 
B = arange(2.5, 37.5, 2.5) #magnetic field 
beta = g*mu_B*B/2 
A = (16*e**2)/(hbar*eps) 
k = arange(10000., 60000., 5.) 
n = 1. 
w = c*2*pi*k/n 

def E2_func(w, beta): 
    return A*((hbar*w)**2*((hbar*w)**2 + (2*beta)**2))/((hbar*w)**2 - (2*beta)**2)**2 

for b in beta: 
    E2 = piecewise(w, [w <= 2*b/hbar, w > 2*b/hbar], [0, lambda w: E2_func(w, b)]) 
    E2_alt = piecewise(w, [w <= 2*b/hbar, w > 2*b/hbar], [0, E2_func(w, b)]) 
    subplot(121) 
    plot(w, E2) 
    subplot(122) 
    plot(w, E2_alt) 

show() 

我把所有這些常量在那裏,所以你可以直接複製代碼,運行程序,並看看輸出 - 對不起,我不沒有足夠的聲望點在這裏發佈輸出圖像。

從y軸上的尺度和圖表本身來看,顯然這兩個分段函數之間的輸出存在差異:爲什麼?看起來lambda函數在這裏起作用,但我不明白這是爲什麼。任何見解都會被讚賞。

回答

0

你下面一行有一個錯誤:

E2_alt = piecewise(w, [w <= 2*b/hbar, w > 2*b/hbar], [0, E2_func(w, b)]) 

[0, E2_func(w, b)]是你funclist。它應該包含一個函數或標量,但E2_func(w, b)是一個包含10000個元素的數組。

E2的第一個版本爲w的每個元素調用lambda函數,其中條件列表爲true。 E2_alt的第二個版本設置第一個元素,條件爲E2_func(w, b)[0],第二個爲E2_func(w, b)[1],依此類推。

以下的工作,而不是:

E2_alt = piecewise(w, [w <= 2*b/hbar, w > 2*b/hbar], [0, E2_func(w, b)[where(w > 2*b/hbar)]]) 

但readybility的functionlist應該是一個標量或只是一個功能。

+0

哦,我想我明白你的意思了。所以,爲了澄清一下,在第一個版本中爲'E2'使用lambda函數是正確的,而在E2_alt中,我只是從數組'E2_func(w,b)'的順序調用元素。 – Anthony

+0

是的,第一個版本是正確的。 – Holger