2016-05-11 49 views
0

今天我想问你下一个问题 - 如何改变优化函数(scipy,Python)中的x数组?如何在优化函数(scipy,Python)中更改x数组?

实施例:

from scipy.optimize import minimize 

def function(x): 
    for i in range(len(x)): 
     if x[i]<0: 
      x[i]=0 
    F = 0.0 
    print list(x) 
    for i in x: 
     F += i**3 
return F 

n = 5 
x0=[] 
for i in range(n): 
    x0.append(-1.0) 
res = minimize(function, x0, method='Nelder-Mead') 

print res 

但结果是阵列([ - 1,-1,-1,-1,-1。。。]):

......................... 
......................... 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
    status: 1 
    nfev: 1006 
success: False 
    fun: 0.0 
     x: array([-1., -1., -1., -1., -1.]) 
message: 'Maximum number of function evaluations has been exceeded.' 
    nit: 148 

回答

0

唐不改变阵列!而是以其他方式计算结果。例如,而不是在后的代码,写:

def f(x): 
    return (x[x > 0] ** 3).sum() 

然后:

>>> x0 = np.full((5,), -1) 
>>> print(minimize(f, x0, method='Nelder-Mead')) 
final_simplex: (array([[-1.  , -1.  , -1.  , -1.  , -1.  ], 
         [-1.000098, -1.  , -1.  , -1.  , -1.  ], 
         [-1.  , -1.000098, -1.  , -1.  , -1.  ], 
         [-1.  , -1.  , -1.000098, -1.  , -1.  ], 
         [-1.  , -1.  , -1.  , -1.000098, -1.  ], 
         [-1.  , -1.  , -1.  , -1.  , -1.000098]]), 
       array([ 0., 0., 0., 0., 0., 0.])) 
      fun: 0.0 
     message: 'Optimization terminated successfully.' 
      nfev: 69 
      nit: 10 
     status: 0 
     success: True 
      x: array([-1., -1., -1., -1., -1.]) 

下面是我的功能f作品的详细说明:

  1. x > 0单位计算与x具有相同形状的布尔数组,其x中的每个元素具有True即greate r大于0,否则为False。例如:

    >>> x = np.array([-1, 0, 1, 2, 3]) 
    >>> x > 0 
    array([False, False, True, True, True], dtype=bool) 
    
  2. x[x > 0]使用Boolean indexing选择的x元素是大于零:

    >>> x[x > 0] 
    array([1, 2, 3]) 
    
  3. x[x > 0] ** 3是大于零的x元件的立方体的数组:

    >>> x[x > 0] ** 3 
    array([ 1, 8, 27]) 
    
  4. 该012在阵列上方法加起来所有元素:

    >>> (x[x > 0] ** 3).sum() 
    36