这是scipy.optimize.leastsq
如何使用一个最基本的例子:
import numpy as np
import scipy.optimize as optimize
import matplotlib.pylab as plt
def func(kd,p0,l0):
return 0.5*(-1-((p0+l0)/kd) + np.sqrt(4*(l0/kd)+(((l0-p0)/kd)-1)**2))
的residuals
的平方的总和为我们试图功能最小化:
def residuals(kd,p0,l0,PLP):
return PLP - func(kd,p0,l0)
这里我生成一些随机数据。您想要在这里加载您的真实数据。
N=1000
kd_guess=3.5 # <-- You have to supply a guess for kd
p0 = np.linspace(0,10,N)
l0 = np.linspace(0,10,N)
PLP = func(kd_guess,p0,l0)+(np.random.random(N)-0.5)*0.1
kd,cov,infodict,mesg,ier = optimize.leastsq(
residuals,kd_guess,args=(p0,l0,PLP),full_output=True,warning=True)
print(kd)
产生类似
3.49914274899
这是optimize.leastsq
发现最合适的值。
在这里,我们生成使用值的的PLP
价值,我们才发现:
PLP_fit=func(kd,p0,l0)
下面是PLP
与p0
一个阴谋。蓝线来自数据,红线是最合适的曲线。
plt.plot(p0,PLP,'-b',p0,PLP_fit,'-r')
plt.show()
非常感谢你,我添加了我的数据,但它不起作用。我一直在调整kd_guess值,但得到了错误:ValueError:操作数不能与形状一起播放(15)(8) – Anake
@Anake:这听起来也许你的数据有不同的形状。尝试打印'len(PLP)','len(p0)'和'len(l0)'以确保它们都具有相同数量的项目。 – unutbu