我正在处理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()

plots of derivatives

我判断了Sympy给出的导数表达式,它似乎是正确的,所以我不知道问题出在哪里.在定义Dyson函数的那篇文章中,作者增加了Dyson导数的图形,其形式与我的有限差分计算相对应.

derivative in original article

推荐答案

这里的参数顺序不正确:

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 of parameters in the tuple here:
    return lambdify((x, B_0, delta_B, alpha), y.diff(x))

der_dyson = get_dyson_deriv()

进行此更改后,这两个图表几乎完全相同,即使是h=0.12.

还要注意,在计算导数时,您不需要重新键入dyson的表达式.只需将Symbol直接传递给dyson函数即可.

Python相关问答推荐

如何避免Chained when/then分配中的Mypy不兼容类型警告?

运行Python脚本时,用作命令行参数的SON文本

发生异常:TclMessage命令名称无效.!listbox"

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

如何在Raspberry Pi上检测USB并使用Python访问它?

如何创建一个缓冲区周围的一行与manim?

Scrapy和Great Expectations(great_expectations)—不合作

什么是最好的方法来切割一个相框到一个面具的第一个实例?

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

需要帮助重新调整python fill_between与数据点

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

Flash只从html表单中获取一个值

在极中解析带有数字和SI前缀的字符串

python panda ExcelWriter切换动态公式到数组公式

在Python中使用yaml渲染(多行字符串)

(Python/Pandas)基于列中非缺失值的子集DataFrame

使用__json__的 pyramid 在客户端返回意外格式

时长超过24小时如何从Excel导入时长数据

Stats.ttest_ind:提取df值

Groupby并在组内比较单独行上的两个时间戳