我试图最小化包含参数S1
,S2
,S3
和n1
,n2
和{{1}的函数}}。还有权重: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
,{{1} },n3
和w1
会最小化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'我正在寻找的三个数字?
答案 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))