我对python相当陌生,我正在尝试使用lmfit进行一些曲线拟合。该代码运行良好,但我想通过原点(0,0)强制拟合。我在 stakoverlow 中看到,使用“curve_fit”可以添加和属性“sigma”来解决问题,但这在“最小化”中不起作用。你有什么解决方法吗???
到目前为止,这是我的代码:
##############################################################################
###################### IMPORT MODULES ########################################
##############################################################################
import numpy as np
import matplotlib.pyplot as plt
from lmfit import minimize, Parameters
from lmfit import report_fit
##############################################################################
##################### DATA ##################################
##############################################################################
x=np.array([0,1, 4, 6, 8, 9, 11, 13, 15, 18, 20, 27])
data=np.array([0, 67, 208, 339, 460, 539, 599, 635, 659, 685, 701, 731])
##############################################################################
######################## GOMPERTZ FUNCTION DEFINITION#########################
##############################################################################
def BMP_Gompertz(params, x, data):
BMPmax=params['BMPmax'].value
Rmax=params['Rmax'].value
Lambda=params['Lambda'].value
model=BMPmax*np.exp(-np.exp(Rmax*np.exp(1)/BMPmax*(Lambda-x)+1))
global model_data
model_data=[BMPmax,Rmax,Lambda]
return data-model
params=Parameters()
params.add('BMPmax', value=300., min=0.)
params.add('Rmax', value=25., min=0.)
params.add('Lambda',value=0.5, min=0.)
model_data=[]
##############################################################################
###################### GOMPERTZ CURVE FITTING & REPORT #######################
##############################################################################
result=minimize(BMP_Gompertz, params, args=(x,data))
report_fit(result.params)
##############################################################################
########################## GOMPERTZ PLOTTING #################################
##############################################################################
plt.plot(x, data, 'bo')
t=np.linspace(0.,100,10000)
plt.plot(t,model_data[0]*np.exp(-np.exp(model_data[1]*np.exp(1)/model_data[0]*(model_data[2]-t)+1)))
plt.xlabel('Days')
plt.ylabel('BMP (NLbiogas/kg SV)')
plt.show()
如您所见,拟合不是从 (0,0) 开始,而是在 (0,10) 左右开始,我想总是强制它从 (0,0) 开始......看起来我还没有能够上传图片(还没有权限)......无论如何,我认为你可以明白这一点。
还有另一个问题,是否有另一种方法来存储参数并绘制结果?现在要存储模型返回的参数,我将它们存储在一个名为“model_data”的全局变量中。然后,在绘图部分,我使用 linspace 创建了一个名为“t”的新“x”数组,然后使用“model_data”中存储的参数绘制 t 与 BMP_Gompertz(myfunction)的关系。效果很好,但看起来应该是其他更好的方法来做到这一点。
非常感谢您的帮助