分辨率提高后 np.gradient 的奇怪行为

hen*_*nry 3 python numpy

我想在同一个图上绘制 cos(x) 及其导数 -sin(x) 。我做了以下事情:

import numpy as np    
x = np.linspace(0,10,20) #x values: 0-10, 20 values
f = np.cos(x) # function
df = np.gradient(f) # derivative

# plot
plt.plot(f, label ="function")
plt.plot(df, label ="derivative")
plt.legend()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这里您已经可以看到导数的幅度存在问题。应该是1,但是大约是0.5。

如果我现在将分辨率从 20 点增加到 50 点,导数的幅度会下降得更多:

在此输入图像描述

100分:

在此输入图像描述

1000分:

在此输入图像描述

有谁知道发生了什么事吗?

Mus*_*dın 6

这是因为两个连续值之间假定的默认间距为 1。有关详细信息,请参阅此答案。

在您的示例中,当您使用 时np.linspace,可以通过编程方式找到间距:

sp = np.diff(x)[0]
Run Code Online (Sandbox Code Playgroud)

或者更好(感谢@Kraigolas!)

# form the array *and* get the spacing in one shot
x, sp = np.linspace(0, 10, 20, retstep=True)
Run Code Online (Sandbox Code Playgroud)

然后,

x, sp = np.linspace(0, 10, 2000, retstep=True)
f = np.cos(x)

df = np.gradient(f, sp) # change is here!

# plot
plt.plot(f, label ="function")
plt.plot(df, label ="derivative")
plt.legend()
Run Code Online (Sandbox Code Playgroud)

给出

在此输入图像描述

对于其他数量的点也类似。