加载数据:
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)
我将非常感谢得到一个提示,为什么最小化在这种情况下不起作用!你知道吗
当然!为了更清楚地解释拟合,我将上述计算减少到:
模拟曲线的某些点(加载glob(“.txt”))是:
预期值为: bsn~-0.037,dsn~1.8e-05,pf~7
相关问题 更多 >
编程相关推荐