我试图回答这个问题:创建一个函数cubefit(xdata, ydata)(按此顺序的参数),返回最佳拟合*参数[a, B, C, D]的numpy数组,该数组适合x值的列表xdata到y值的列表ydata,到形式为y= Ax^3 + B x^2 + C x + D的三次方程
*,其中拟合是使用非线性最小二乘回归检验(scipy的curve_fit()函数的默认拟合方法)确定的
这是我的尝试:
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as scpo
def cubefit(xdata,ydata):
x = np.array(xdata)
y = np.array(ydata)
def cubic(x_a,A,B,C,D):
return A*x_a**3+B*x_a**2+C*x_a+D
actual_fit_parameters = scpo.curve_fit(cubic, x , y)
fit_D = actual_fit_parameters[3]
fit_C = actual_fit_parameters[2]
fit_B = actual_fit_parameters[1]
fit_A = actual_fit_parameters[0]
return [fit_A,fit_B,fit_C,fit_D]
我得到这个错误信息:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-40-fafc77be7ebf> in <module>()
3 import numpy as np
4 assert "cubefit" in dir(), "It appears that you may not have defined a function named `cubefit`, or you may not have executed your answer cell."
----> 5 assert type(cubefit([0,1,2,3],[0,1,8,27])) != None, "It appears that your function `cubefit` does not return anything"
6 assert type(cubefit([0,1,2,3],[0,1,8,27])) != list, "It appears that your function `tophat` does not return a list"
7 assert type(cubefit([0,1,2,3],[0,1,8,27])) == np.ndarray, "It appears that your function `tophat` does not return a numpy array"
<ipython-input-39-d4f3443da67b> in cubefit(xdata, ydata)
11 actual_fit_parameters = scpo.curve_fit(cubic, x , y)
12
---> 13 fit_D = actual_fit_parameters[3]
14 fit_C = actual_fit_parameters[2]
15 fit_B = actual_fit_parameters[1]
IndexError: tuple index out of range
知道为什么吗?
如果您阅读scipy.optimize.curve_fit()
文档,您将看到发生了什么:
函数返回两个结果,两个数组。再往下看,在示例部分中,您将看到作者认为应该如何使用函数:
popt
: array使
f(xdata, *popt) - ydata
的残差平方和最小的参数的最优值。
pcov
:二维阵列
popt
的估计协方差。对角线表示参数估计的方差。使用perr = np.sqrt(np.diag(pcov))
计算参数的一个标准差误差。[…]
popt, pcov = curve_fit(func, xdata, ydata) # ...
使用元组赋值将两个数组拆分为两个变量。
你的代码没有,它将2值元组视为至少有4个值的数组。我猜测你想要的是第一个数组,所以你可以使用:
actual_fit_parameters, _ = scpo.curve_fit(cubic, x , y)
将第二个数组pcov
赋值给_
(表示您想在代码中忽略它)。
你没有包括样本输入或预期的输出,所以我不能告诉你我的猜测是否对你有用。
其他注释:
type(someobject) != None
isalways true。type(None)
返回NoneType
。如果您需要测试返回None
以外的内容,请使用someobject is not None
。- 不要使用
type(someobject) == SomeType
或type(someobject) != SomeType
,应该使用isinstance(someobject, SomeType)
进行类型检查。isinstance()
对子类也返回true。(在极少数情况下,您必须只测试一种特定类型,而不测试子类,请使用标识测试,type(someobject) is SomeType
)。