的结果科学优化最小化

2024-05-23 16:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

加载数据:

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]

enter image description here

到目前为止还不错。问题是,函数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)

我将非常感谢得到一个提示,为什么最小化在这种情况下不起作用!你知道吗


Tags: lambdainimportnprrcoordscsdsn
1条回答
网友
1楼 · 发布于 2024-05-23 16:28:43

当然!为了更清楚地解释拟合,我将上述计算减少到:

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

相关问题 更多 >