无法最小化所需参数

2024-05-12 22:39:04 发布

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

我已经做了好几个小时了,以前从没用过。 试图找到sig的最小值,以及该sigw1w2的相应值。 我的限制是w1 + w2 = 1w1w2都是阳性。 我为x0传递了一些随机值,比如x0 = [0.1, 0.9],但它没有最小化它,而是将sig的计算值发送给我。对于那些x0值,它实际上并没有最小化它

应为w1 = 0.389085, w2 = 0.61091, sig = 0.0001639

import numpy as np
import scipy
from scipy.optimize import minimize

def objective(x,s1,s2,cov):
    w1=x[0]
    w2=x[1]
    std1=s1
    std2=s2
    covar=cov
    sig=(w1**2)*(std1**2)+(w2**2)*(std2**2)+(2*w1*w2*cov)
    return sig #find the lowest possible answer for this given w1+w2=1
#also the values of the given w1 and w2 for which sig is lowest

def ad(x):
    return x[0]+x[1]

def constraint(x):
    return 1-ad(x)

cons=({'type':'eq','fun':constraint})
w1=0.4
w2=0.6
x0=np.array([w1,w2])
std_dev1=0.016131666748327497
std_dev2=0.014246969689996261
co=0.000102553
sol=minimize(objective,x0,method='SLSQP',constraints=cons,args(std_dev1,std_dev2,co))
print(sol)

电子dit:I通过为不满足约束的w1w2提供输入,我成功地获得了所需的数据,以前不知道。我添加了另一个约束,因为我希望w1w2的值介于(0和1)之间,但是每当我使用bounds时,我最终得到objective的输出,其中w1占用值0w2占用值1,这不是最佳解决方案

def objective(x,s1,s2,cov):
    w1=x[0]
    w2=x[1]
    std1=s1
    std2=s2
    covar=cov
    sig=(w1**2)*(std1**2)+(w2**2)*(std2**2)+(2*w1*w2*cov)
    return sig
#def ad(x):
#    return x[0]+x[1]
def constraint(x):
    return 1-x[0]-x[1]
def constraint2(x):
    return 1-x[0]**2-x[1]**2
cons=({'type':'eq','fun':constraint,},
        {'type':'ineq','fun':constraint2})
w1=100
w2=0
bnds=((0.0,1.0),(0.0,1.0))
x0=np.array([w1,w2])
std_dev1=0.016131666748327497
std_dev2=0.014246969689996261
co=0.000102553
sol=minimize(objective,x0,method='SLSQP',constraints=cons,args=(std_dev1,std_dev2,co))
print(sol.x)
print(sol.fun)

不ote:-In the 上面提到的代码我定义了bnds,但实际上并没有将它与参数bounds一起使用。我注意到,每当我使用bounds时,代码都会返回w1w2的值以及bounds最小值和最大值本身,并且不会继续计算最优解。 进一步阅读,我认为这是一个 Gradient数值微分的问题,不尊重边界,这是我无法理解的

请随意解释一下,每当我提出bounds的论点时,它是如何不为我提供一个好的解决方案的

sol=minimize(objective,x0,method='SLSQP',constraints=cons,args=(std_dev1,std_dev2,co),bounds=bnds)

Tags: returndev1defdev2covw1stdsig