最小化多变量函数Python SciPy

时间:2015-07-16 20:16:21

标签: python optimization scipy minimize

我试图最小化包含参数S1S2S3n1n2和{{1}的函数}}。还有权重:n3w1w2

这是功能:

w3

我想知道给定f = (w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2) / (w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3) S1S2S3n1n2,{{1} },n3w1会最小化w2

到目前为止,这是我的代码:

w3

scipy.optimize.minimize接受两个参数,即函数和初始猜测。我不知道它是否适用于多变量函数,因为我得到了

f

好的,我遵循了CodyKramer的建议。当我用S1,S2,S3,n1,n2,n3的任意值测试它时,我得到了所有这些作为答案:状态:0成功:真njev:1 nfev:5 hess_inv:数组([[1,0] ,0],[0,1,0],[0,0,1]])乐趣:5.1874999894628917e-18 x:数组([0.4,0.2,0.4])消息:'优化已成功终止。& #39; jac:array([-1.81249989e-17,-4.62499946e-17,1.53125002e-17])最后一行是' jac'我正在寻找的三个数字?

1 个答案:

答案 0 :(得分:2)

问题在于,写lambda需要3个参数,而不是1个参数(恰好是带有3个元素的序列)。我会将你的目标函数拉出一个独立的函数

def signoise(w):
    w1, w2, w3 = w  # unpack your tuple into each variable
    # populate your S and n coefficients
    return w1**2 * n1**2 + w2**2 * n2**2 + w3**2 * n3**2) / (w1**2 * S1**2 + w2**2 * S2**2 + w3**2 * S3**2 + 2*w1*S1*w2*S2 * 2*w1*S1*w2*S2 + 2*w2*S2*w3*S3

然后你可以修改你的功能

def opt(S1, S2, S3, n1, n2, n3):
    xo = np.array([0,1,.01])
    from scipy.optimize import minimize
    return scipy.optimize.minimize(signoise, (.4, .2, .4))