scipy.optimize最小化的结果已关闭

问题描述 投票:1回答:1

加载数据:

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)

我很高兴能得到提示,为什么在这种情况下最小化不起作用!

python function optimization scipy minimization
1个回答
0
投票

当然!为了简化对以下各项的拟合,我将上述计算减少了:

© www.soinside.com 2019 - 2024. All rights reserved.