How to minimize function like this

Function:

def Phi(u, X):
    return -(1+u[0]*X[0]+u[1]*X[1]+u[2]*X[2]+u[3]*X[3])

And I know that X[0]...X[3] is in [-0.08,0.08] and u[0],u[1],u[2],u[3] >= 0 and u[0]+u[1]+u[2]+u[3] = 1, also I know gradient of my functions. Then I defined constraint:

def constraint1(u):
    return u[0]+u[1]+u[2]+u[3]-1.0
def constraint2(u):
    return u[0]-1.0
def constraint3(u):
    return u[1]-1.0
def constraint4(u):
    return u[2]-1.0
def constraint5(u):
    return u[3]-1.0

And bounds

bnds = Bounds ([-0.08, -0.08, -0.08], [0.08, 0.08, 0.08])
cons = [{'type': 'eq', 'fun': constraint1},
               {'type': 'ineq', 'fun': constraint2},
               {'type': 'ineq', 'fun': constraint3},
               {'type': 'ineq', 'fun': constraint4},
               {'type': 'ineq', 'fun': constraint5},]
print(minimize(Phi, method='BFGS', jac=grad, constraints=cons, bounds=bnds))

But I have " TypeError: minimize() missing 1 required positional argument: 'x0' ". And I havent information about x0. Is it correct minimization of function with constraints or its impossible to do this?

UPD

Result is

def Phi2(params):
    u0,u1,u2,u3,x0,x1,x2,x3 = params
    return -(1+u0*x0+u1*x1+u2*x2+u3*x3)


x0 = np.asarray([0,0,0,0,0,0,0,0])

def constraint1(params):
    u0,u1,u2,u3,x0,x1,x2,x3 = params
    return u0+u1+u2+u3-1.0


bnds = Bounds ([0,0,0,0,-0.08,-0.08,-0.08,-0.08,], [1,1,1,1,0.08, 0.08, 0.08])

cons = [{'type': 'eq', 'fun': constraint1}]
print(minimize(Phi2,x0, method='BFGS', constraints=cons, bounds=bnds))

But there is some problem. I have gradient for u0,u1,u2,u3 in numpy array 'grad'. How to use it correctly? If i do jac=grad in parametrs of minimize then result is

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Upvotes: 0

Views: 113

Answers (1)

Sam Broster
Sam Broster

Reputation: 632

The scipy documentation says that x0 it is a positional argument and so it is required.

It says this about x0:

Initial guess. Array of real elements of size (n,), where ‘n’ is the number of independent variables.

It seems like you have to provide your initial guess at the minimum. Have you tried supplying an empty array?

Upvotes: 1

Related Questions