您可以使用lmfit 来约束您的参数。对于下图,我将您的参数a 和b 限制在[0,20] 的范围内(您在帖子中提到过),将c 限制在[0, 400] 的范围内。你得到的参数是:
a: 19.9999991
b: 0.46769173
c: 274.074071
对应的情节如下:
如您所见,模型对数据的再现合理,参数在给定范围内。
下面是使用附加 cmets 重现结果的代码:
from lmfit import minimize, Parameters, Parameter, report_fit
import numpy as np
x=[24,25,28,37,58,104,200,235,235]
y=[340,350,370,400,430,460,490,520,550]
def fit_fc(params, x, data):
a = params['a'].value
b = params['b'].value
c = params['c'].value
model = np.power(x,b)*a + c
return model - data #that's what you want to minimize
# create a set of Parameters
#'value' is the initial condition
#'min' and 'max' define your boundaries
params = Parameters()
params.add('a', value= 2, min=0, max=20)
params.add('b', value= 0.5, min=0, max=20)
params.add('c', value= 300.0, min=0, max=400)
# do fit, here with leastsq model
result = minimize(fit_fc, params, args=(x, y))
# calculate final result
final = y + result.residual
# write error report
report_fit(params)
#plot results
try:
import pylab
pylab.plot(x, y, 'k+')
pylab.plot(x, final, 'r')
pylab.show()
except:
pass
如果您将所有参数限制在[0,20] 范围内,则绘图看起来很糟糕: