加载数据:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from scipy.special import lambertw
import math
filelist = []
coords=[]
r0 = 0.1095/2 #in um
v0 = 4/3*math.pi*r0**3
ci0 = 0.19
cs = (0.522-ci0)/2+ci0
cw = 55
vf = v0*ci0/(ci0 + cs)
i=0
for fname in glob("*.txt"):
x,y = np.genfromtxt(fname, unpack=True)
i+=1
# normalize
ynorm = ((y-min(y))/((np.mean(y[-200:]))-min(y)))
coords.append([x,ynorm])
plt.show()
init_guess=[1, 1, 1, 1, 1]
到目前为止很好。问题在于,函数ssvn的最小值应与上面显示的曲线的拟合参数(rr,bsn,dsn,pf,pfn)拟合,函数intn的值会完全偏离。
for n in range(0,i):
vol = lambda pf: vf*(1+lambertw((cs/ci0)*np.exp(cs/ci0-(3*pf*(ci0+cs)**2)*(coords[n][0])/(r0*ci0*cw))))
voln = lambda pfn: vf*(1+lambertw((cs/ci0)*np.exp(cs/ci0-(3*pfn*(ci0+cs)**2)*(coords[n][0])/(r0*ci0*cw))))
totv = lambda rr, pf, pfn: rr*vol(pf) + (1 - rr)*voln(pfn)
ifin = np.mean(coords[n][1][-200:])
asn = lambda bsn, dsn: ifin - bsn*vf + dsn*vf**2
intn = lambda rr, bsn, dsn, pf, pfn: asn(bsn, dsn) + bsn*totv(rr, pf, pfn) + dsn*(totv(rr, pf, pfn))**2
def ssvn(var):
rr, bsn, dsn, pf, pfn = var
return sum(coords[n][1] - ((intn(rr, bsn, dsn, pf, pfn))**2)[0])
bnds = ((0, 1), (None, 0), (0,None), (0,100), (0,1000))
result = (minimize(ssvn, init_guess, bounds=bnds, options={"maxiter":5000}))
print(result.x)
我很高兴能得到提示,为什么在这种情况下最小化不起作用!
当然!为了简化对以下各项的拟合,我将上述计算减少了: