我已经做了好几个小时了,以前从没用过。
试图找到sig
的最小值,以及该sig
的w1
和w2
的相应值。
我的限制是w1 + w2 = 1
和w1
和w2
都是阳性。
我为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通过为不满足约束的w1
和w2
提供输入,我成功地获得了所需的数据,以前不知道。我添加了另一个约束,因为我希望w1
和w2
的值介于(0和1)之间,但是每当我使用bounds
时,我最终得到objective
的输出,其中w1
占用值0
,w2
占用值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
时,代码都会返回w1
和w2
的值以及bounds
最小值和最大值本身,并且不会继续计算最优解。
进一步阅读,我认为这是一个 Gradient数值微分的问题,不尊重边界,这是我无法理解的
请随意解释一下,每当我提出bounds
的论点时,它是如何不为我提供一个好的解决方案的
sol=minimize(objective,x0,method='SLSQP',constraints=cons,args=(std_dev1,std_dev2,co),bounds=bnds)
目前没有回答
相关问题 更多 >
编程相关推荐