我正在处理EPR谱,并使用戴森函数来拟合实验数据.
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给出的导数表达式,它似乎是正确的,所以我不知道问题出在哪里.在定义Dyson函数的那篇文章中,作者增加了Dyson导数的图形,其形式与我的有限差分计算相对应.