scipy.optimize.minimize最小化了哪个变量/它是如何工作的?

时间:2015-10-13 08:29:46

标签: python numpy scipy

从scipy教程我不太了解optimize.minimize的工作原理。 我想在以下方程组中最小化c3:

0 = cos(b1)+ cos(b2)- 0.0166
0 = sin(b1)+ sin(b2)+ 0.3077*c3 - 0.6278
0 = cos(b1)- cos(b2)+ 5.4155*c3 - 4.3547

间隔:

c3[0,1]
b1,b2[0,2*pi]

这是我的代码:

def fun(x):
    return 4.9992-5.7233*x[0]-2*np.cos(x[2])-np.sin(x[2])-np.sin(x[1])
bnds = ((0,1),(0,2*np.pi),(0,2*np.pi))
i =  optimize.minimize(fun, (0.05,np.pi*0.5,np.pi), method='SLSQP', bounds=bnds)

输出

  status: 0
 success: True
    njev: 6
    nfev: 30
     fun: -3.9601679766628886
       x: array([ 1.        ,  1.57079633,  0.46367497])
 message: 'Optimization terminated successfully.'
     jac: array([ -5.72330004e+00,   0.00000000e+00,   6.11841679e-05,
         0.00000000e+00])
     nit: 6

结果在L-BFGS-B中相同我的理解是这里c3已经变为1仍然可以,但我希望它更低。如果我在函数上应用fsolve,它会找到c3 = 0.46的根。 顺便说一句为什么我必须在代码中写x [0],x [1]和x [2]而不是c3,b1,b2? 使用约束是否有更聪明的方法,例如?

1 个答案:

答案 0 :(得分:3)

对于3个变量 b1 b2 c3 ,您有三个超越方程式。你需要做的是为变量求解这3个方程。由于方程式是超越的,因此可能没有解决方案,一种解决方案或许多解决方案。使用 Mathematica 解决它们:

In[30]:= eq1 = 0 == Cos[b1] + Cos[b2] - 0.0166;
eq2 = 0 == Sin[b1] + Sin[b2] + 0.3077*c3 - 0.6278;
eq3 = 0 == Cos[b1] - Cos[b2] + 5.4155*c3 - 4.3547;

In[42]:= Reduce[{eq1, eq2, eq3, b1 >= 0, b1 <= 2*Pi, b2 >= 0, 
  b2 <= 2*Pi, c3 >= 0, c3 <= 1}, {b1, b2, c3}]

During evaluation of In[42]:= Reduce::ratnz: Reduce was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result. >>

Out[42]= b1 == 0.214076 && b2 == 2.85985 && c3 == 0.446303

所以实际上只有一种解决方案。现在你也可以使用root以数字方式找到这个方程组的解决方案:

import scipy as sp
import scipy.optimize

def f(x):
    b1, b2, c3 = x
    e1 = sp.cos(b1) + sp.cos(b2) - 0.0166
    e2 = sp.sin(b1) + sp.sin(b2) + 0.3077*c3 - 0.6278
    e3 = sp.cos(b1) - sp.cos(b2) + 5.4155*c3 - 4.3547
    return e1, e2, e3

res = sp.optimize.root(f, [0.5, 1.0, 1.0])
print('b1 = {}, b2 = {}, c3 = {}'.format(*res.x))

给出:

b1 = 0.214076256767, b2 = 2.85985240432, c3 = 0.446302998585

你对minimize所做的是最小化三个方程的总和,这三个方程不等于&#34;最小化方程组中的c3&#34;。

minimize不符合您的要求。 &#39;最小化&#39;做最小化的事情找到最小化f(x) = x**2的x。答案显然是&#39; x = 0&#39;。

你必须写&#39; x [0]&#39;因为&#39;最小化&#39;的界面。该函数只是希望你以矢量形式给出你想要最小化的参数。