5

following is my code. I get the ValueError mentioned in the headline (and appended in the end), and I can't imagine why. My function is R^2 -> R, and I follow closely (in format, not actual values) the steps in (http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize). That's why I don't understand the dimensionality problem, everything is really similar to there.

My code:

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])
            },
        {'type':'ineq',
            'fun' : lambda x: array([x[1]]),
            'jac' : lambda x: array([1])
            },
        {'type':'ineq',
            'fun' : lambda x: array([1 - x[1]]),
            'jac' : lambda x: array([-1])
            });


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

Full traceback:

%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
3
  • Shouldn't the derivatives of the inequality functions be arrays with length 2? E.g. for the first inequality, wouldn't the derivative be array([1, 0])? Commented Oct 24, 2013 at 16:48
  • Can you fill out your code so that it is runnable? Include the required imports, and define all variables (e.g. k). Commented Oct 24, 2013 at 17:26
  • You're hinting exactly at what was haunting me: k[0] was still of higher dimensionality. Commented Oct 24, 2013 at 17:52

1 Answer 1

3

Your jac values for the inequalities are not correct. They should be length-2 arrays, containing the derivatives with respect to x[0] and x[1]. E.g.

    ...
    {'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])
        });
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.