То, что вы хотите сделать, это установить многомерное соответствие (2-D в вашем случае) для ваших данных;Таким образом, для всего набора данных вы получаете один набор параметров C, который лучше всего описывает ваши данные. Я думаю, что лучший способ сделать это - использовать scipy.optimize.curve_fit()
.
Так что ваш код будет выглядеть примерно так:
import scipy.optimize as optimize
import numpy as np
def my_function(xz, *par):
""" Here xz is a 2D array, so in the form [x, z] using your variables, and *par is an array of arguments (C1, C2) in your case """
x = xz[:,0]
z = xz[:,1]
return par[0] * x**2 * np.sin(z) + par[1] * x**3 * np.cos(z)
# generate fake data. You will presumable have this already
x = np.linspace(0, 10, 100)
z = np.linspace(0, 3, 100)
xx, zz = np.meshgrid(x, z)
xz = np.array([xx.flatten(), zz.flatten()]).T
fakeDataCoefficients = [4, 6.5]
fakeData = my_function(xz, *fakeDataCoefficients) + np.random.uniform(-0.5, 0.5, xx.size)
# Fit the fake data and return the set of coefficients that jointly fit the x and z
# points (and will hopefully be the same as the fakeDataCoefficients
popt, _ = optimize.curve_fit(my_function, xz, fakeData, p0=fakeDataCoefficients)
# Print the results
print(popt)
Когда я подхожу, я получаю именно fakeDataCoefficients
Я использовал для генерации функции, так что подгонка работает хорошо.
Таким образом, вывод состоит в том, что вы не делаете 3 подгонки независимо, устанавливая значение z
каждый раз, но вместо этого вы делаете 2D-подборку, которая принимает значения x
и z
одновременнонайти лучшие коэффициенты.