Want to make a multi-variation minimum with sympy

I want to use minimization with scipy.optimize using character characters

from scipy.optimize import minimize from sympy.utilities.lambdify import lambdify import sympy as sp x1, x2, x3, x4 = sp.symbols('x1 x2 x3 x4') FormulaMain = sp.symbols('-2*x1**2*x3+6*x1**2*x4+13*x1**2-3*x1*x2**2+x1*x2+3*x1*x3**2-3*x4+103') HandleMain = lambdify((x1,x2,x3,x4),FormulaMain,'numpy') bnds = ((-1, 1), (-1, 1), (-1, 1), (-1, 1)) PrintParams = minimize(HandleMain,[1,1,1,1],method='SLSQP',bounds=bnds) print PrintParams 

When I run the code, I get

 <lambda>() takes exactly 4 arguments (1 given) 

I think I have an input argument with [1,1,1,1] Is there something I need to change with the code?

+4
source share
1 answer

First of all: Welcome to SO!

As far as I know, lambdify() cannot deal with vectors. Also, using sympy defining jacobian is easy. You can try:

 import numpy as np from scipy.optimize import minimize from sympy.utilities.lambdify import lambdify import sympy as sy sy.init_printing() # LaTeX like pretty printing for IPython x1, x2, x3, x4 = sy.symbols('x1 x2 x3 x4') xx = (x1, x2, x3, x4) f = -2*x1**2*x3+6*x1**2*x4+13*x1**2-3*x1*x2**2+x1*x2+3*x1*x3**2-3*x4+103 f_n = lambdify(xx, f, modules='numpy') # Build Jacobian: jac_f = [f.diff(x) for x in xx] jac_fn = [lambdify(xx, jf, modules='numpy') for jf in jac_f] def f_v(zz): """ Helper for receiving vector parameters """ return f_n(zz[0], zz[1], zz[2], zz[3]) def jac_v(zz): """ Jacobian Helper for receiving vector parameters """ return np.array([jfn(zz[0], zz[1], zz[2], zz[3]) for jfn in jac_fn]) bnds = ((-1, 1), (-1, 1), (-1, 1), (-1, 1)) zz0 = np.array([1, 1, 1, 1]) rslts = minimize(f_v, zz0, method='SLSQP', jac=jac_v, bounds=bnds) print(rslts) 
+4
source

All Articles