加载数据:
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)
如果能得到一个提示,为什么最小化在这种情况下不起作用,我将不胜感激!
最佳答案
当然!我减少了上面的计算,以便更清楚地解释拟合:
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
关于python - scipy.optimize 最小化的结果关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957256/