Curve_fit для функции с несколькими переменными приводит к "объекту, слишком глубокому для требуемого массива"
Я пытаюсь подогнать 2D-функцию, используя кривую SciPy. Код является:
import numpy as np
from scipy.optimize import curve_fit
rh_list = np.logspace(-4,0,100)
M0_list = np.logspace(8,15,100)
def myfunc(M,a,b,c):
return 10**((a*(np.log10(M)))**b + c)
def myfunc2(r,a,alpha,b,beta,A):
return a*(r)**(-alpha) + b*(r)**(-beta) + A*np.exp(-1./r)
def myfunc_comb(X,a1,b1,c1,a2,alpha,b2,beta,A):
M,r = X
return myfunc(M,a1,b1,c1)*myfunc2(r,a2,alpha,b2,beta,A)
params, pcov = curve_fit(myfunc_comb, (M0_list, rh_list),Z,p0=(1.,1.,1.,1.,1.,1.,1.,1.), maxfev=20000)
Z
определяется M0_list
,rh_list
таким образом, что это слишком сложно, чтобы писать здесь (и я надеюсь, что это не нужно будет решать). Я получаю следующую ошибку:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
ValueError: object too deep for desired array
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-775-a436d168d234> in <module>()
----> 1 params, pcov = curve_fit(myfunc_comb, (M0_list, rh_list),Z,p0=(1.,1.,1.,1.,1.,1.,1.,1.), maxfev=20000)
c:\python27\lib\site-packages\scipy\optimize\minpack.pyc in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
740 # Remove full_output from kwargs, otherwise we're passing it in twice.
741 return_full = kwargs.pop('full_output', False)
--> 742 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
743 popt, pcov, infodict, errmsg, ier = res
744 cost = np.sum(infodict['fvec'] ** 2)
c:\python27\lib\site-packages\scipy\optimize\minpack.pyc in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
385 maxfev = 200*(n + 1)
386 retval = _minpack._lmdif(func, x0, args, full_output, ftol, xtol,
--> 387 gtol, maxfev, epsfcn, factor, diag)
388 else:
389 if col_deriv:
error: Result from function call is not a proper array of floats.
c:\python27\lib\site-packages\scipy\optimize\minpack.pyc in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
740 # Remove full_output from kwargs, otherwise we're passing it in twice.
741 return_full = kwargs.pop('full_output', False)
--> 742 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
743 popt, pcov, infodict, errmsg, ier = res
744 cost = np.sum(infodict['fvec'] ** 2)
c:\python27\lib\site-packages\scipy\optimize\minpack.pyc in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
385 maxfev = 200*(n + 1)
386 retval = _minpack._lmdif(func, x0, args, full_output, ftol, xtol,
--> 387 gtol, maxfev, epsfcn, factor, diag)
388 else:
389 if col_deriv:
error: Result from function call is not a proper array of floats.