Кусочная функция 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 и самих графиков видно, что есть разница в выходных данных между этими двумя кусочными функциями: почему? Кажется, что здесь играет роль лямбда-функция, но я не понимаю, почему это так. Любое понимание приветствуется.

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 вызывает lambda функция для каждого элемента wгде список условий истинен. Ваша вторая версия для 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)]])

но для готовности список функций должен быть только скалярным или только функцией.

Другие вопросы по тегам