使用scipy.optimize的curve_fit

1 投票
1 回答
1976 浏览
提问于 2025-04-18 07:09

----已回答----

如果这个问题的回答太简单,我深表歉意。我刚开始学习Python编程,现在正在做一个比较困难的项目。任何帮助都非常感谢;如果有人愿意帮忙,我会很乐意解释我的困惑。

我用这个函数成功地拟合了我的数据,但绑定模型不准确(得到的热力学值是错误的):

#defining function of the binding model 
def binding_model(molar_ratio,Ka,n,dH):
    return (dH*molar_ratio**n)/(molar_ratio**n+Ka**n)

#fitting molar enthalpy vs. molar ratio data with binding model
initial_paramaters=array([1,0,0])   
parameters,cov=curve_fit(binding_model,molar_ratio,peak_areas,initial_paramaters)
n=parameters[0]
Ka=parameters[1]
dH=parameters[2]
Ffit=binding_model(molar_ratio,n,Ka,dH)

我把绑定模型修正成了单位点配体绑定模型,但现在我无法让curve_fit函数正常工作了:

#defining function of the binding model 
def binding_model(Mt,Xt,Vcell,Ka,n,dH):
    return (n*Mt*dH*Vcell/2)*(1+(Xt/(Mt*n))+(1/(n*Ka*Mt)))-((1+(Xt/(n*Mt))+(1/(n*Ka*Mt)))**2-(4*Xt/(Mt*n))**.5)
#fitting molar enthalpy vs. molar ratio data with binding model
initial_paramaters=array([1,0,0])   
parameters=curve_fit(binding_model,Mt,Xt,Vcell,peak_areas,initial_paramaters)
n=parameters[0]
Ka=parameters[1]
dH=parameters[2]
Ffit=binding_model(Mt,Xt,Ka,n,dH,Vcell)

现在它返回了一个错误:“curve_fit()最多接受5个参数(给了6个)”。

molar_ratio、Mt和Xt是三个数组,每个数组都有41个值。Vcell是从数据中提取的一个整数。谢谢你们的关注!

1 个回答

2

你只是没有正确使用它;

可以在这里了解它是怎么工作的。

假设我想把一个多项式拟合到一些数据上;

我可能会有这样的代码:

def quad(xdata, a,b,c):
    return a * xdata**2 + b * xdata + c

然后我可能会有一些数据;

xdata = np.array([range(10)])
ydata = np.array([1 for _ in xdata])

接着我可以调用curve_fit;

initial_guess = [0,0,0]
popt, pcov = scipy.optimize.curve_fit(quad, xdata, ydata, p0=initial_guess)

print popt # [0,0,1]

你遇到的问题是,你没有把初始猜测放进一个数组里,给

p0

这个参数(不过这个参数其实是可选的)。

对于你的函数,试试这个(我没有测试过,因为我这台机器上没有安装python):

def binding_model(xdata,Vcell,Ka,n,dH):
  Mt = xdata[0]
  Xt = xdata[1]
  return (n*Mt*dH*Vcell/2)*(1+(Xt/(Mt*n))+(1/(n*Ka*Mt)))-((1+(Xt/(n*Mt))+(1/(n*Ka*Mt)))**2-(4*Xt/(Mt*n))**.5)

#fitting molar enthalpy vs. molar ratio data with binding model

initial_Vcell = 0
initial_Ka = 0
initial_n = 0
initial_dH = 0

initial_paramaters=array([initial_Vcell, initial_Ka, initial_n, initial_dH])   
xdata = zip(Mt, Xt) 
parameters, cov = curve_fit(binding_model, xdata, ydata, p0=initial_paramaters)


Vcell=parameters[0]
Ka=parameters[1]
n=parameters[2]
dH=parameters[3]

Ffit=binding_model(xdata, Vcell, Ka, n, dH)

撰写回答