我正在使用 EPR 谱并使用 Dyson 函数来拟合实验数据。
def dyson(x, B_0, delta_B, alpha):
return (((delta_B + alpha*(x - B_0))/(4*(x - B_0)**2 + delta_B**2))
+ ((delta_B - alpha*(x + B_0))/(4*(x + B_0)**2 + delta_B**2)))
我使用 Sympy 得到它的导数:
x = Symbol('x')
delta_B = Symbol('delta_B')
B_0 = Symbol('B_0')
alpha = Symbol('alpha')
y = (((delta_B + alpha*(x - B_0))/(4*(x - B_0)**2 + delta_B**2))
+ ((delta_B - alpha*(x + B_0))/(4*(x + B_0)**2 + delta_B**2)))
der_dyson = lambdify((x, delta_B, B_0, alpha), y.diff(x))
但是,结果与使用有限差分法的计算不匹配:
def der_dyson_(x, B_0, delta_B, alpha, h=1):
return (dyson(x + h, B_0, delta_B, alpha) - dyson(x - h, B_0, delta_B, alpha))/(2*h)
fig_test, ax_test = plt.subplots()
x_test = np.linspace(-600, 600, 10000)
ax_test.plot(x_test, der_dyson_(x_test, 200, 250, 0.5, h=0.12), label='finite diff')
ax_test.plot(x_test, der_dyson(x_test, 200, 250, 0.5), label='Sympy')
ax_test.legend()
我检查了 Sympy 给出的导数表达式,它似乎是正确的,所以我无法弄清楚问题是什么。在定义戴森函数的文章中,作者添加了戴森导数的图,其形式与我的有限差分计算相对应。
此处参数顺序不正确:
der_dyson = lambdify((x, delta_B, B_0, alpha), y.diff(x))
它应该对应
dyson
中的顺序:
def dyson(x, B_0, delta_B, alpha):
...
def get_dyson_deriv():
x = Symbol('x')
delta_B = Symbol('delta_B')
B_0 = Symbol('B_0')
alpha = Symbol('alpha')
y = dyson(x, B_0, delta_B, alpha)
# NOTE order here:
return lambdify((x, B_0, delta_B, alpha), y.diff(x))
der_dyson = get_dyson_deriv()
通过此更改,即使有
h=0.12
,两个图表也变得几乎相同。
另请注意,计算导数时无需重新输入
dyson
的表达式。只需将 Symbol
直接传递给 dyson
函数即可。