我想为我的数据拟合曲线:
x=[24,25,28,37,58,104,200,235,235]
y=[340,350,370,400,430,460,490,520,550]
xerr=[1.1,1,0.8,1.4,1.4,2.6,3.8,2,2]
def fit_fc(x, a, b, c):
return a*x**b+c
popt, pcov=curve_fit(fit_fc,x,y,maxfev=5000)
plt.plot(x,fit_fc(x,popt[0],popt[1],popt[2]))
plt.errorbar(x,y,xerr=xerr,fmt='-o')
但我想对a,b和c加上一些限制。例如,我希望它们在某个范围内,比如介于0和20之间。我怎样才能实现这一目标?我是Python的新手,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
如果变量超出范围,则取决于您希望发生的事情。您可以使用简单的value
语句(在本例中为程序if
):
exit()
另一种方法是x = 21
if (x not in range(0, 20)):
print("var x is out of range")
exit()
变量必须在范围内。在这种情况下,它包含在assert
块中,可以优雅地处理问题,并且try/except
如上所述:
exit()
答案 1 :(得分:0)
Scipy使用无约束最小二乘法来拟合曲线参数,因此不会那么简单:https://github.com/scipy/scipy/blob/v0.16.0/scipy/optimize/minpack.py#L454
你可能想要做的是被称为约束(非线性?,给出你想要的东西)最小二乘问题。例如,看看那些讨论: