加载数据:
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的最小化将使函数intn与上面显示的曲线的拟合参数(rr,bsn,dsn,pf,pfn)拟合,从而导致完全不同的值。
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)
如果能得到一个提示为什么最小化在这种情况下不起作用,我将不胜感激!
发布于 2019-11-21 16:48:51
好的!我减少了上面的计算,以便更清楚地解释拟合到:
init_guess=[1, 1, 1]
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))))
ifin = np.mean(coords[n][1][-200:])
asn = lambda bsn, dsn: ifin - bsn*vf + dsn*vf**2
intn = lambda bsn, dsn, pf: asn(bsn, dsn) + bsn*vol(pf) + dsn*(vol(pf))**2
def ssvn(var):
bsn, dsn, pf = var
return sum(coords[n][1] - ((intn(bsn, dsn, pf))**2)[0])
bnds = ((None, 0), (0,None), (0,100))
result = (minimize(ssvn, init_guess, bounds=bnds, options={"maxiter":5000}))
print(result.x)
plt.plot(coords[n][0], (intn(result.x[0], result.x[1], result.x[2])))
模拟曲线(使用glob(“.txt”)加载)的一些点是:
0. 0.000050914985470697376
0.1 0.00005226691119118905
0.2 0.000053273861157071714
0.3 0.00005399970642597728
0.4 0.000054509506785116066
0.5 0.000054860656948798976
0.6 0.00005509912334378207
0.7 0.00005525962182128574
0.8 0.000055366845246536884
0.9 0.0000554381500488244
1. 0.00005548540798339426
1.1 0.00005551666847593382
1.2 0.00005553732736787186
1.3 0.000055550957627270784
1.4 0.00005555995251553653
1.5 0.000055565880705824926
1.6 0.00005556979319469152
1.7 0.000055572367783992574
1.8 0.000055574071506690767
1.9 0.000055575203109605593
2. 0.000055575944218954186
期望值为: bsn ~ -0.037,dsn ~ 1.8e-05,pf ~7
https://stackoverflow.com/questions/58957256
复制相似问题