Я не уверен, что понимаю, что вы ищете.Вот 1D пример, иллюстрирующий важные моменты, которые следует учитывать при численной оценке производной функции:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
def f(x, y, z):
return 2 * x**3 + 3 * y**2 - z
x_fine = np.linspace(-1, 1, 50) # used for the plots
# Coarse sampling, only two points:
x_coarse = np.linspace(-1, 1, 2)
# Interpolation
interpolator_coarse = interp1d(x_coarse, f(x_coarse, 0, 0), kind='linear')
plt.plot(x_fine, f(x_fine, 0, 0), label='analytical')
plt.plot(x_coarse, f(x_coarse, 0, 0), 'ok', label='coarse sampling')
plt.plot(x_fine, interpolator_coarse(x_fine), '--r', label='interpolation based on the sampling')
plt.xlabel('x'); plt.ylabel('f(x, 0, 0)');
plt.legend();
график:
Значение «истинной» производной при x = 0 равно нулю (плоский наклон).Однако, если производная вычисляется на основе данных выборки (при x = -1 и x = 1), независимо от любого вида интерполяции, оценочное значение будет равно 2 ...
Количество выборокточки должны быть увеличены:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
def f(x, y, z):
return 2 * x**3 + 3 * y**2 - z
x_fine = np.linspace(-1, 1, 50) # used for the plots
# Coarse sampling:
x_coarse = np.linspace(-1, 1, 4)
# Interpolation
interpolator_coarse = interp1d(x_coarse, f(x_coarse, 0, 0), kind='linear')
interpolator_cubic = interp1d(x_coarse, f(x_coarse, 0, 0), kind='cubic')
plt.plot(x_fine, f(x_fine, 0, 0), 'k', label='analytical')
plt.plot(x_coarse, f(x_coarse, 0, 0), 'ok', label='coarse sampling')
plt.plot(x_fine, interpolator_coarse(x_fine), '--r', label='linear interpolation')
plt.plot(x_fine, interpolator_cubic(x_fine), '--b', label='cubic interpolation')
plt.xlabel('x'); plt.ylabel('f(x, 0, 0)');
plt.legend();
Наклон при x = 0 теперь ближе к нулю.Следующая часть проблемы заключается в оценке производной от выбранных данных, см., Например, Числовая_дифференциация .