python - scipy.optimize 最小化的结果关闭

标签 python function optimization scipy minimization

加载数据:

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)

如果能得到一个提示,为什么最小化在这种情况下不起作用,我将不胜感激!

最佳答案

当然!我减少了上面的计算,以便更清楚地解释拟合:

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/

相关文章:

python - Pandas 枢轴给了我很多 'none' 值

function - SML 中具有用户数据类型的部分函数

php - 如何使用 codeigniter 优化 activerecords?

visual-studio-2008 - 在 VB 2008 中,为什么操作短裤的时间比整数长?

Python:用 py2exe 编译的脚本会卡住操作系统吗?

python - 这是一个过度拟合的网络吗?

python - Pygame 只绘制屏幕的 1/4

javascript - 仅跟踪过去一周帖子浏览量的功能

c - 在函数中使用#define

c++ - 优化二进制增量循环