【问题标题】:Numpy's Piecewise FunctionNumpy 的分段函数
【发布时间】:2013-07-03 04:59:03
【问题描述】:

考虑一下这段代码:

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 函数在这里发挥了作用,但我不明白为什么会这样。任何见解都值得赞赏。

【问题讨论】:

    标签: python numpy lambda piecewise


    【解决方案1】:

    您的以下行有错误:

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

    [0, E2_func(w, b)] 是您的功能列表。它应该包含一个函数或一个标量,但E2_func(w, b) 是一个包含 10000 个元素的数组。

    E2 的第一个版本为w 的每个元素调用lambda 函数,其中条件列表为真。 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)]])
    

    但为了便于使用,函数列表应该是一个标量或仅是一个函数。

    【讨论】:

    • 哦,我想我明白你的意思了。所以为了澄清,在E2 的第一个版本中使用 lambda 函数是正确的,而在E2_alt 我只是从数组E2_func(w, b) 中按顺序调用元素?
    猜你喜欢
    • 2014-12-02
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多