Внимательно следуя этому коду Я получил следующее:
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np
def f(x, a1, a2, a3, a4, a5):
return a1+a2*x[0]+a3*x[0]**2+a4*x[1]+a5*x[1]**2
limits = [-10, 10, -10, 10] # [x1_min, x1_max, x2_min, x2_max]
side_x = np.linspace(limits[0], limits[1], 100)
side_y = np.linspace(limits[2], limits[3], 100)
X1, X2 = np.meshgrid(side_x, side_y)
size = X1.shape
X1_1d = X1.reshape((1, np.prod(size)))
X2_1d = X2.reshape((1, np.prod(size)))
xdata = np.vstack((X1_1d, X2_1d))
#Here I create some sample data
original = (1,2,3,4,5)
z = f(xdata, *original)
Z = z.reshape(size)
z_noise = z + .2*np.random.randn(len(z))
Z_noise = z_noise.reshape(size)
#For z_noise you have to plug in your data here
popt, pcov = curve_fit(f, xdata, z_noise)
print("fitted: {}".format(popt))
z_fit = f(xdata, *popt)
Z_fit = z_fit.reshape(size)
#Plotting
plt.subplot(1, 2, 1)
plt.title("Sample data")
plt.pcolormesh(X1, X2, Z_noise)
plt.axis(limits)
plt.colorbar()
plt.subplot(1, 2, 2)
plt.title("Fitted Function")
plt.pcolormesh(X1, X2, Z_fit)
plt.axis(limits)
plt.colorbar()
plt.show()
Сначала я определяю функцию в том виде, в каком вы ее опубликовали (предполагая, что под ^
вы подразумевали **
). Затем я устанавливаю ограничения для осей X и Y (вам придется заменить их на свои собственные ограничения).
Теперь, чтобы сделать подгонку, мы должны поместить ваши данные x / y в один вектор, что и делается в блоке кода до первого комментария. После комментария я создаю образцы данных, которые вам не нужны, поскольку у вас есть свои собственные. Образцы данных называются z_noise
(small z!), Которые вам нужно будет преобразовать в одномерный вектор. После всего этого я могу просто позвонить curve_fit
, чтобы получить параметры, которые лучше всего соответствуют z_noise
.
Я позволил части с созданием примера данных войти, чтобы это было легко проверить и повторить: большая часть этого кода взята с здесь