這是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