Arrays Python/curve_fit:无法使用init guess传递数组
我用这个函数来计算某种多项式:Arrays Python/curve_fit:无法使用init guess传递数组,arrays,python-3.x,parameter-passing,Arrays,Python 3.x,Parameter Passing,我用这个函数来计算某种多项式: def pipoly(df,pj): n=np.size(pj) p=pj[0] for j in range(1,n): p+=pj[j]*df**j return p pj应该是一个数组,其中包含多项式系数的初始猜测;因此,多项式的阶数由第一行中的函数本身决定df是一个标量变量。此函数传递给scipy.optimize的曲线拟合as parfit,covfig=curve_fit(pipoly,[f-f0[j]
def pipoly(df,pj):
n=np.size(pj)
p=pj[0]
for j in range(1,n):
p+=pj[j]*df**j
return p
pj
应该是一个数组,其中包含多项式系数的初始猜测;因此,多项式的阶数由第一行中的函数本身决定df
是一个标量变量。此函数传递给scipy.optimize的曲线拟合
as
parfit,covfig=curve_fit(pipoly,[f-f0[j] for f in f_df[if0[j]:if0[i]]],
pmode_xp[ph][if0[j]:if0[i]],
p0=([pmode0[ph][-1],(pmode_xp[ph][if0[i]]-pmode_xp[ph][if0[j]])/df]))
函数名后的前两个参数是数组(2D数组的1D切片),我已经确认它们的长度相同。在pipoly
之后的第三个参数应该是一个元组,其中包含对pj
的初始猜测,我之前打印出来:[0.4586590267346888,0.7419930843896957]
。那么为什么Python抱怨TypeError:pipoly()接受了2个位置参数,但给出了3个位置参数呢?如果我去掉p0
参数,我会被告知pj
被认为是标量,因此不能有索引。我如何向pipoly说明pj
是一个数组?您的陈述:
pj
应该是一个包含
多项式
这是错误的。根据:
scipy.optimize.curve_fit(f,xdata,ydata,p0=None,sigma=None,absolute_sigma=False,check_finite=True,bounds=(-inf,inf),method=None,jac=None,**kwargs)[来源]使用非线性最小二乘法将函数f拟合到数据
假设ydata=f(扩展数据,*参数)+eps
这意味着curve\u fit()
要使用的pipoly()
函数的参数数必须等于多项式的参数数加上1(变量,即第一个参数)。
错误:
TypeError:pipoly()接受2个位置参数,但给出了3个
正在告诉您,pipoly
接收3个参数,因为您可能正在测试一个线性polinomyal,所以这三个参数是自变量和两个参数(f_df[if0[j]:if0[i]]
这是一个2长度的列表)
在编写时,它只接受2个参数
您可以通过在pj
之前添加星号轻松解决问题:
def pipoly(df,*pj):
n=len(pj) #len() is sufficient here, but np.size() works too.
p=pj[0]
for j in range(1,n):
p+=pj[j]*df**j
return p
这样,函数就可以接受数量可变的参数。更多关于python函数参数中星号的含义和用法的信息。我编辑了我的帖子,以澄清pj应该包含参数(即系数)的初始猜测。是的,在这个例子中,我尝试一个线性函数。然而,如果我像你建议的那样改变pipoly的定义,结果不是一个需要的单个数字,而是一个序列。这也是不正确的。它只是表示要估计其值的多项式的参数。您可以在
曲线拟合()
中提供初始猜测(p0
)。是的,结果是一个包含参数估计值的序列。为什么期望结果是单个数字?pipoly
是拟合模型,它应该为每个df
返回单个值。换句话说,当curve\u fit
作为拟合的结果在parfit
中产生一组参数时,我应该能够在调用中传递这些参数,如pipoly(0.2,parfit)
以便根据优化的参数集返回0.2的pipoly
函数值。因为您没有解压缩参数列表。试试这个:y=pipoly(0.2,*parfit)
(再次注意星号。阅读我答案中的链接)<代码>y是您的预期结果。