Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scipy曲线拟合全局参数_Python_Scipy_Curve Fitting - Fatal编程技术网

Python Scipy曲线拟合全局参数

Python Scipy曲线拟合全局参数,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,我试图用python中的Scipy curve_fit拟合银河系模型的两个全局参数。我有一个自变量数组和一个因变量数组。数据集的前1/4需要根据两个全局参数和两个局部参数适合于一个函数,下1/4需要根据两个全局参数和两个局部变量适合于另一个函数,等等 无论如何,我可以编写一个函数,在整个数组中使用正确的索引和全局参数调用适当的函数 到目前为止,我得到的是: def galaxy_func_inner(time,a,b,c,d): telescope_inner = lt.stat

我试图用python中的Scipy curve_fit拟合银河系模型的两个全局参数。我有一个自变量数组和一个因变量数组。数据集的前1/4需要根据两个全局参数和两个局部参数适合于一个函数,下1/4需要根据两个全局参数和两个局部变量适合于另一个函数,等等

无论如何,我可以编写一个函数,在整个数组中使用正确的索引和全局参数调用适当的函数

到目前为止,我得到的是:

   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,) 
文件“galaxy_calibration.py”,第117行,在
popt,pcov=曲线拟合(银河函数全局、扩展数据、ydata)
文件“/Library/Python/2.7/site packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py”,第555行,曲线拟合
res=leastsq(func,p0,args=args,满输出=1,**kw)
文件“/Library/Python/2.7/site packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py”,第369行,在leastsq中
shape,dtype=\u check\u func('leastsq','func',func,x0,args,n)
文件“/Library/Python/2.7/site packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py”,第20行,在检查功能中
res=至少1d(thefunc(*(x0[:numput],)+args)))
文件“/Library/Python/2.7/site packages/scipy-0.14.0.dev_7cefb25-py2.7-macosx-10.9-intel.egg/scipy/optimize/minpack.py”,第445行,通用函数
返回函数(扩展数据,*参数)-ydata
ValueError:操作数无法与形状(4,)(191,)一起广播

任何帮助都将不胜感激。

如果您希望将输入数据分为4个批次(基于
时间点的索引),并根据批次处理数据,然后以单个数组返回结果,则可以执行以下操作:

def galaxy_func_global(time,R,P,a,b,c,d,e,f,g,h):
    return np.concatenate([galaxy_func_outer(time[0:50],a,b,R,P),
                          galaxy_func_outer(time[50:100],c,d,R,P),
                          galaxy_func_inner(time[100:150],e,f,R,P),
                          galaxy_func_inner(time[150:200],g,h,R,P)])
这将在
time
数组中分割出感兴趣的每个片段,然后为每个片段调用相应的函数。在我看来,这些函数返回的是简单的
np.array
s,可以将其串联起来,得到一个数组作为结果

(我刚刚意识到我可以说“您尝试的几乎是完美的,但是您需要将结果数组连接到单个数组中”:


请注意,至少有两种方法可以解决标注问题

首先,您应该确保两个函数(
galaxy…inner/outer()
)的返回值都是1d numpy数组。否则,您将在全局返回值方面遇到问题

其次,出于显而易见的原因,每个拟合方法都希望函数的返回值与输入变量的大小(形状)相同。因此,如果
time
的长度不正好是200个元素,那么您当前的代码也可能会遇到问题,因为即使
time
更长,您的输出也会被截断为200个元素。至少你应该把

galaxy_func_inner(time[150:],g,h,R,P)
在上一次函数调用中捕获所有剩余的
时间点
,但如果要正确执行,请调用

def galaxy_func_global(time,R,P,a,b,c,d,e,f,g,h):
    inds=np.floor(np.linspace(0,len(time)-1,5))
    return np.concatenate([galaxy_func_outer(time[0:inds[1]],a,b,R,P),
                      galaxy_func_outer(time[inds[1]:inds[2]],c,d,R,P),
                      galaxy_func_inner(time[inds[2]:inds[3]],e,f,R,P),
                      galaxy_func_inner(time[inds[3]:],g,h,R,P)])
还请注意,您的原始错误正式属于此类错误:

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,) 

这说明python无法从
函数(扩展数据,*params)
(即拟合模型)中减去
ydata
,因为一个长度为4,而另一个长度为191。这是因为如果函数调用
返回a、b、c、d
,那么它将返回一个元组
(a、b、c、d)
,因此返回值的长度将为4。更有趣的是,您的
ydata
长度为191,这可能意味着您仍然会遇到错误。

欢迎使用堆栈溢出!如果你提供一个答案,你可能会得到一个更快的答案。有些事情我不清楚,例如:
galaxy\u func\u inner/outer
是否期望一个时间,或者一个整数索引作为第一个参数?变量的命名建议使用前者,但当您在
global
函数中调用这些函数时,您会给它们
t\u index
而不是t。感谢您的帮助。np.concatenate不是只接受两个参数,而不是您所写的四个参数吗?另外,关于长度为191的ydata,我的数据集被截断为[0:49]、[49:98]、[98:144]、[144:191]。但问题似乎是,它试图用这些子元素之一的扩展数据(这是我们想要的):def galaxy_func_global(扩展数据,R,P,a,b,c,d,e,f,g,h):返回np.array((galaxy_func_outer)(扩展数据[0:49]外星系(扩展数据[49:98],c,d,R,P),内星系(扩展数据[98:144],e,f,R,P),内星系(扩展数据[144:191],g,h,R,P))@Emma518,1。在一个测试用例上自己尝试
concatenate
np.concatenate([1,3],[2,5],[3,4],[6,7])
。2.对不起,我不明白你在说什么。你试过我的建议了吗?我试过了,但我得到的错误是我的第一条评论:TypeError:function最多接受2个参数(给定4个)@Emma518是的,很抱歉!您必须将
串联
的所有参数放入一个列表中。。。你说得对,我的坏:)我编辑了我的答案,现在应该可以了。下次从错误开始,我不会假设你错了;)