计算插值数据的二阶导数

Computing the second derivative of interpolated data

我有 100 (x,y) 对的一维数据。我们将 x 的数组称为 data_x,将 y 的数组称为 data_y.

得到f(x):

import numpy as np
from scipy.interpolate import interp1d
f = interp1d(data_x, data_y, bounds_error=False, fill_value=np.nan)

得到f'(x):

def fp(x):
    return (f(x+eps) - f(x))/eps

# where eps is a very small number, for example 1e-3

得到f''(x):

def fpp(x):
    return (fp(x+eps) - fp(x))/eps

为了绘图,我使用了以下绘图命令:

numpoints = 100
plot_x = np.linspace(-5, 0, numpoints)
plt.plot(plot_x, f(plot_x))
plt.plot(plot_x, fp(plot_x))
plt.plot(plot_x, fpp(plot_x))

当我绘制这 3 个函数时,二阶导数出现一条有问题的锯齿线。我该如何摆脱这些?

你想要一个二次微分插值器,使用例如CubicSpline :CubicSpline(x_data, y_data).derivative(2) 是表示二阶导数的可调用对象。或者,如果您想要导数,请使用 CubicSpline(x_data, y_data)(xnew, 2)