为什么我的导数不等于理论值?

Why my derivative is not equal to theorical value?

我对正弦信号进行微分计算。 我制作了简单的 python 程序来测试它:

signal = np.sin(time_s.to_numpy())
for index in range(1, len(signal)-1):
        first[index] = signal[index ]-signal[index -1] /(2*dt) * 100
        second[index] = signal[index+1 ] - 2*signal[index ]+signal[index -1] /(dt*dt)
        signal_display[index] = signal[index ]* 2000

我的一阶导数函数应该是余弦?

给定时间序列和信号:

>>> time_s = np.linspace(0, 15, 1000)
>>> signal = np.cos(time_s)

现在,导数由 f'(x) = (f(x + dt) - f(x)) / dt 给出。其中 dt 是时间步长:

>>> dt = time_s[1] - time_s[0]
0.015

你可以用np.roll来计算:

>>> d1 = (np.roll(signal, -1) - signal) / dt

或通过 (signal[1:] - signal[:-1]) / dt.

使用切片

你可以绘制两者 (sin' = cos):

>>> plt.plot(time_s, signal)
>>> plt.plot(time_s[:-1], d1[:-1])

同样,您可以使用 f''(x) = (f(x + dt) - 2f(x) + f(x - dt)) / dt² 给出的二阶导数来执行此操作:

>>> d2 = (np.roll(signal, -1) - 2*signal + np.roll(signal, 1)) / dt**2

这里是剧情(sin'' = -sin):

>>> plt.plot(time_s, signal)
>>> plt.plot(time_s[1:-2], d2[1:-2])

您在导数的分子中缺少括号,并且您对它们进行了不恰当的缩放。它们应该如下所示:

first[index] = (gyroX_filtered[index] - gyroX_filtered[index - 1]) / dt 
second[index] = (gyroX_filtered[index + 1] - 2 * gyroX_filtered[index] + gyroX_filtered[index - 1]) / dt**2