Python 最小化多变量函数

Python 最小化多变量函数,python,optimization,scipy,minimize,Python,Optimization,Scipy,Minimize,我试图最小化一个函数,该函数具有参数S1、S2、S3和n1、n2和n3。还有权重:w1、w2和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) 我想知道给定的S1,S2,S3,n1,n2和n3,什么w1,w2和w3会使f最小化

我试图最小化一个函数,该函数具有参数
S1
S2
S3
n1
n2
n3
。还有权重:
w1
w2
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)
我想知道给定的
S1
S2
S3
n1
n2
n3
,什么
w1
w2
w3
会使
f
最小化

以下是我目前的代码:

def opt(S1, S2, S3, n1, n2, n3):
    xo = np.array([0,1,.01])
    from scipy.optimize import minimize
    signoise = lambda w1,w2,w3: (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)
    w1min, w2min, w3min = scipy.optimize.minimize(signoise, (.4, .2, .4))
    return w1min, w2min, w3min
scipy.optimize.minimize接受两个参数:函数和初始猜测。我不知道它是否适用于多变量函数,因为我得到了

error : <lambda>() takes exactly 3 arguments (1 given)
错误:()正好接受3个参数(给定1个)

好吧,我听了CodyKramer的建议。当我用S1、S2、S3、n1、n2、n3的任意值对其进行测试时,我得到了所有这些作为答案:状态:0成功:真正的njev:1 nfev:5 hess_inv:array([[1,0,0],[0,1,0],[0,0,1,0]))乐趣:5.1874999894628917e-18 x:array([0.4,0.2,0.4])消息:“优化成功终止。”jac:array([-1.81249989e-17,-4.62499946e-17,1.53125002e-17])最后一行是“jac”吗?我要找的三个数字?

问题是,正如你写的
lambda
需要三个参数,而不是一个参数(恰好是一个包含三个元素的序列)。我会把你的目标函数拉出来,变成一个独立的函数

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))

好的,我遵循了你的建议。当我用S1、S2、S3、n1、n2、n3的任意值测试它时,我得到了所有这些作为答案:状态:0成功:真正的njev:1 nfev:5 hess_inv:array([[1,0,0],[0,1,0],[0,0,1]])乐趣:5.1874999894628917e-18 x:array([0.4,0.2,0.4])消息:“优化已成功终止。”jac:array([-1.81249989e-17,-4.62499946e-17,1.53125002e-17])最后一行是我要找的三个数字的“jac”吗?你能编辑你的问题以包含它吗?不幸的是,注释部分中的所有格式都丢失了,所以很难直观地分析输出结果。答案是输出中的数组
x
jac
x
的一阶导数,以及
hess
x
的二阶导数