Sympy 推导

问题描述 投票:0回答:1

我正在使用 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()

plots of derivatives

我检查了 Sympy 给出的导数表达式,它似乎是正确的,所以我无法弄清楚问题是什么。在定义戴森函数的文章中,作者添加了戴森导数的图,其形式与我的有限差分计算相对应。

derivative in original article

python sympy symbolic-math derivative
1个回答
0
投票

此处参数顺序不正确:

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
函数即可。

© www.soinside.com 2019 - 2024. All rights reserved.