如何对拟合参数施加约束?

时间:2015-09-01 14:40:26

标签: python python-2.7 curve-fitting

我想为我的数据拟合曲线:

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的新手,所以任何帮助都会受到赞赏。

2 个答案:

答案 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

你可能想要做的是被称为约束(非线性?,给出你想要的东西)最小二乘问题。例如,看看那些讨论: