具有多变量和可变变量的Python优化

具有多变量和可变变量的Python优化,python,numpy,optimization,scipy,solver,Python,Numpy,Optimization,Scipy,Solver,我是Python新手,希望找到一个具有大量约束的优化解决方案,这些约束基于输出函数 前两个约束很简单: 1) output1+output2+output3=1 2) output1、output2和output3都必须大于等于0 最后一个约束要求输出函数相等: 3) f(output1)==f(output2)==f(output3) 在这种情况下,函数数组由输出的矩阵乘法产生: F = cov.dot(array([output1,output2,output3]))*array([outp

我是Python新手,希望找到一个具有大量约束的优化解决方案,这些约束基于输出函数

前两个约束很简单:

1)
output1+output2+output3=1

2) output1、output2和output3都必须大于等于0

最后一个约束要求输出函数相等:

3)
f(output1)==f(output2)==f(output3)

在这种情况下,函数数组由输出的矩阵乘法产生:

F = cov.dot(array([output1,output2,output3]))*array([output1,output2,output3])

f(output1) = F[0], f(output2) = F[1], f(output3) = F [2]
希望我已经清楚地描述了这个问题。。。最终,我想将其扩展到3个以上的输出。 下面给出的输出值似乎根本不符合约束条件(给我一个负值)。我想我输入的约束是错误的。。。或者有一种更简单的方法可以使用
np.linalg.solve

import numpy as np
from scipy.optimize import fsolve

cov=np.array([0.04,0.0015,0.03,0.0015,0.0025,0.000625,0.03,0.000625,0.0625]).reshape(3,3)

weights=np.array([0.3,0.2,0.5])

def RC(w):
    return cov.dot(w)*w

riskcont = RC(weights)

def PV(riskcont):
    return np.sqrt(riskcont.sum())

portvol = PV(riskcont)    

def ERC(z):

    w1=z[0]
    w2=z[1]
    w3=z[2]
    #1) weights sum to 100%
    out=w1 +w2 +w3 -1
    #2) weights above zero
    out.append((w1*w2*w3)>0)
    #3) riskcont must all be equal
    out.append([riskcont[0] == riskcont[1] == riskcont[2]] #== riskcont(w4)))

    return out

z= fsolve(ERC,[1/3,1/3,1/3])

上面的第行开始
out.append([riskcont[0]==etc.
缺少a)结尾处我也是初学者,但是:,你在使用python 2.7吗?如果是,那么1/3是整数除法=0
out.append((w1*w2*w3)
至少是你的一个问题。这行需要的是偶数的权重为负数。(即(-1*-1*1)=(1*1*1))此外,
riskcont
在脚本运行时从不更改。使用Python 3.5(和Anaconda 4.1.1)是的,这是一种捷径-无法找到将多个条件放入一个约束中的方法…
w1&w2&w3>=0
也不起作用。您知道其他方法吗?上面的第行开始是
out.append([riskcont[0]==等。
结尾处缺少a)我也是初学者,但是:,你使用的是python 2.7吗?如果是,那么1/3是整数除法=0
out。追加((w1*w2*w3)>0)
至少是你的一个问题。这行所需要的是偶数的权重为负数。(即(-1*-1*1)=(1*1))另外,
riskcont
在脚本运行时从不更改。使用Python 3.5(和Anaconda 4.1.1)是的,这是一种捷径-无法找到将多个条件放入一个约束中的方法…
w1&w2&w3>=0
也不起作用。您知道其他方法吗?