2013-10-24 5 views
2

следующий - мой код. Я получаю ValueError, упомянутый в заголовке (и добавленный в конце), и я не могу себе представить, почему. Моя функция R^2 -> R, и я внимательно слежу (в формате, а не фактических значениях) шаги в (http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize). Вот почему я не понимаю проблему размерности, все действительно похоже на нее.scipy.optimize.minimize: ValueError: все входные массивы должны иметь одинаковое количество измерений

Мой код:

def func(x, theta, sign=1.0): 
    return sign*(math.log(x[0]) + theta*math.log(1-x[1])) 


def func_deriv (x, theta, sign=1.0): 
    dfdc = (1/x[0]) 
    dfdn = theta*1/(1-x[1])*(-1) 
    return sign*array([ dfdc, dfdn]) 



cons = (
    {'type':'eq', 
      'fun' : lambda x: array([ 
       exp(e)*k**alpha*x[1]**(1-alpha) - (kPrime - k*(1-delta)) 
        - phi/2*(kPrime/k - delta)**2 - x[0] ]), 
      'jac' : lambda x: array([ 
       -1, (1-alpha)*exp(e)*k**alpha*x[1]**(-alpha)    
      ]) 
      }, 
    {'type':'ineq', 
     'fun' : lambda x: array([x[0]]), 
     'jac' : lambda x: array([1, 0]) 
     }, 
    {'type':'ineq', 
     'fun' : lambda x: array([x[1]]), 
     'jac' : lambda x: array([0, 1]) 
     }, 
    {'type':'ineq', 
     'fun' : lambda x: array([1 - x[1]]), 
     'jac' : lambda x: array([0, -1]) 
     }); 


res = scipy.optimize.minimize(
    func, [3, 0.5], 
    args=(param.theta,-1,), 
    jac=func_deriv, constraints=cons, 
    method='SLSQP', options={'disp': True}) 

Полный отслеживающий:

%run "./solve_maxim.py" 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
C:\Program Files\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc) 
    174    else: 
    175     filename = fname 
--> 176    exec compile(scripttext, filename, 'exec') in glob, loc 
    177  else: 
    178   def execfile(fname, *where): 

solve_maxim.py in <module>() 
    61  args=(param.theta,-1,), 
    62  jac=func_deriv, constraints=cons, 
---> 63  method='SLSQP', options={'disp': True}) 

AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\_minimize.pyc in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 
    362  elif meth == 'slsqp': 
    363   return _minimize_slsqp(fun, x0, args, jac, bounds, 
--> 364        constraints, **options) 
    365  else: 
    366   raise ValueError('Unknown solver %s' % method) 

\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\optimize\slsqp.pyc in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, **unknown_options) 
    366 
    367    # Now combine c_eq and c_ieq into a single matrix 
--> 368    c = concatenate((c_eq, c_ieq)) 
    369 
    370   if mode == 0 or mode == -1: # gradient evaluation required 

ValueError: all the input arrays must have same number of dimensions 
+0

Должны ли производные функции неравенства быть массивами с длиной 2? Например. для первого неравенства не будет производной 'array ([1, 0])'? –

+0

Можете ли вы заполнить свой код, чтобы он был запущен? Включите требуемый импорт и определите все переменные (например, 'k'). –

+0

Вы намекаете точно на то, что меня преследует: k [0] все еще имеет большую размерность. – FooBar

ответ

2

Ваши jac значения неравенств не являются правильными. Они должны быть массивами длиной 2, содержащие производные по отношению к x[0] и x[1]. Например.

... 
    {'type':'ineq', 
     'fun' : lambda x: array([x[0]]), 
     'jac' : lambda x: array([1, 0]) 
     }, 
    {'type':'ineq', 
     'fun' : lambda x: array([x[1]]), 
     'jac' : lambda x: array([0, 1]) 
     }, 
    {'type':'ineq', 
     'fun' : lambda x: array([1 - x[1]]), 
     'jac' : lambda x: array([0, -1]) 
     }); 
Смежные вопросы

 Смежные вопросы