curve_fit
принимает многомерный массив для независимой переменной, но ваша функция должна принимать то же самое:
import numpy as np
from scipy.optimize import curve_fit
data = np.array(
[[0, 0, 1],
[1, 1, 2],
[2, 1, 3],
[3, 0, 5],
[4, 0, 2],
[5, 1, 3],
[6, 0, 7]]
)
def func(X, A, B, C, D, E, F):
# unpacking the multi-dim. array column-wise, that's why the transpose
x, y, z = X.T
return (A * x ** 2) + (B * y ** 2) + (C * x * y) + (D * x) + (E * y) + F
popt, _ = curve_fit(func, data, data[:,2])
from string import ascii_uppercase
for i, j in zip(popt, ascii_uppercase):
print(f"{j} = {i:.3f}")
# A = 0.060
# B = 2004.446
# C = -0.700
# D = 0.521
# E = -2003.046
# F = 1.148
Обратите внимание, что в целом вы должны предоставить начальное предположение для параметров, чтобы добиться хорошего соответствия результаты.