Я пытаюсь установить два глобальных параметра галактической модели, используя Scipy curve_fit в python. У меня есть массив независимых переменных и массив зависимых переменных. Первый 1/4 набора данных должен быть приспособлен к функции в зависимости от двух глобальных параметров и двух локальных параметров, следующей четверти другой функции в зависимости от двух глобальных параметров и двух локальных переменных и т. Д.Scipy Curve Fit Global Parameters
Есть ли в любом случае, что я могу написать функцию, которая вызовет соответствующую функцию с правильным индексом и глобальными параметрами через весь массив.
То, что я до сих пор:
def galaxy_func_inner(time,a,b,c,d):
telescope_inner = lt.station(rot_angle=c,pol_angle=d)
power = telescope_inner.calculate_gpowervslstarray(time)[0]
return a*np.array(power)+b
def galaxy_func_outer(time,a,b,c,d):
telescope_outer = lt.station(rot_angle=c,pol_angle=d)
power = telescope_outer.calculate_gpowervslstarray(time)[0]
return a*np.array(power)+b
def galaxy_func_global(time,R,P,a,b,c,d,e,f,g,h):
for t_index in range(len(time)):
if t_index in range(0,50):
return galaxy_func_outer(t_index,a,b,R,P)
elif t_index in range(50,100):
return galaxy_func_outer(t_index,c,d,R,P)
elif t_index in range(100,150):
return galaxy_func_inner(t_index,e,f,R,P)
elif t_index in range(150,200):
return galaxy_func_inner(t_index,g,h,R,P)
Проблема заключается в том, что это подходит только в первый раз, но весь массив времени, и единственная точка устанавливается только в соответствующей точке модели, а не весь массив. Любая помощь в том, как переформулировать это? Я попытался переформулировать как:
def galaxy_func_global(xdata,R,P,a,b,c,d,e,f,g,h):
return galaxy_func_outer(xdata[0:50],a,b,R,P),galaxy_func_outer(xdata[50:100],c,d,R,P),galaxy_func_inner(xdata[100:150],e,f,R,P),galaxy_func_inner(xdata[150:200],g,h,R,P)
, но я получаю сообщение об ошибке:
File "galaxy_calibration.py", line 117, in <module>
popt,pcov = curve_fit(galaxy_func_global,xdata,ydata)
File "/Library/Python/2.7/site-packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py", line 555, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "/Library/Python/2.7/site-packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py", line 369, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "/Library/Python/2.7/site-packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py", line 20, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "/Library/Python/2.7/site-packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py", line 445, in _general_function
return function(xdata, *params) - ydata
ValueError: operands could not be broadcast together with shapes (4,) (191,)
Любая помощь будет высоко ценится.
Добро пожаловать в переполнение стека! Вы можете получить более быстрый ответ, если вы предоставите [mcve]. Что-то мне непонятно, например: неужели 'galaxy_func_inner/outer' ожидает время или целочисленный индекс в качестве первого параметра? Именование переменных предложило бы первое, но когда вы вызываете эти функции в своих 'глобальных' функциях, вы даете им' t_index', а не t. –