首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >scipy.optimize最小化的结果已关闭

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

Stack Overflow用户
提问于 2019-11-20 22:56:14
回答 1查看 56关注 0票数 1

加载数据:

代码语言:javascript
运行
复制
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的最小化将使函数intn与上面显示的曲线的拟合参数(rr,bsn,dsn,pf,pfn)拟合,从而导致完全不同的值。

代码语言:javascript
运行
复制
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)

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

EN

回答 1

Stack Overflow用户

发布于 2019-11-21 16:48:51

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

代码语言:javascript
运行
复制
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”)加载)的一些点是:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58957256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档