我有这个函数来计算某种多项式:
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的curve_fit
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() takes 2 positional arguments but 3 were given
?如果我删除p0
论证,我被告知pj
被认为是标量,因此不能有索引。我如何清楚地知道pj
是一个阵列?
你的陈述:
pj
应该是一个包含多项式系数的数组;
是错的。据curve_fit() docs说:
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)[ source]使用非线性最小二乘法使函数f适合数据。
假设ydata = f(xdata,* params)+ eps
这意味着pipoly()
使用的curve_fit()
函数必须使用多个参数,这些参数等于多项式的参数数加1(变量,这是第一个参数)。
错误:
TypeError:pipoly()需要2个位置参数,但是给出了3个?
告诉你pipoly
收到3个参数,因为你可能正在测试一个线性polinomyal,所以三个参数是自变量和两个参数([f-f0[j] for f in 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
这样,您的函数接受可变数量的参数。 Here更多关于python函数参数中星号的含义和用法。