(python, matplotlib) 我怎样才能对不是来自方程的图形进行微分?

(python, matplotlib) how can I do differential in graph that isn't from equation?

我获取了数据并使用 matplotlib 将其显示为图表。 并且我降低了噪点,下面是他们的照片。

现在我想知道每个点的梯度, 所以我试着在我的图表中做微分。

但是当我发现这一点时,我只是得到了当你有图形方程时如何做到这一点的信息。

也许这个可以工作(代码在下面),但是我怎样才能得到 f(x+h) 和 f(x-h) 的值?

def numerical_diff(f, x):
h = 1e-4
return (f(x+h) - f(x-h)) / (2*h)

抱歉英语不好,感谢您的阅读。 我会等你的答复。请帮助我

numpy np.gradient 可以处理用于绘制数据的数据数组。您还需要提供 dx,这是您的变量之间的变化,

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 4*np.pi, 100)
dx = x[1] - x[0]
y = np.sin(x)

plt.plot(x, y)
plt.plot(x, np.gradient(y, dx))
plt.show()

数值导数有噪音您还可以考虑样条拟合并采用 derivatives 以获得更平滑的图,

from scipy.interpolate import UnivariateSpline

spl = UnivariateSpline(x, y, k=4, s=0)
diffspl = spl.derivative()

plt.plot(x, spl(x), '--')
plt.plot(x, diffspl(x), '--')
plt.show()

我了解到您正在尝试进行数值微分,这可以通过多种方式实现,但最简单的是使用您编写的方程式。

def numerical_dif(y_data: list) -> list:
    differential = []
    for i in range(len(y_data) - 1):
        differential.append(y_data[i+1]-y_data[i])
    return differential

这假设等距数据点,但可以很容易地修改为也采用 x 轴位置。如果您使用的是 NumPy,那么最简单的微分是 numpy.diff()

如果您正在寻找更复杂的解决方案,请看这里 Univariate spline