Home projects readings blog about

Nonlinear Optimization

Published on Sunday, 23 February, 2020 general

In this tutorial we will show to use Python using the package scipy to solve a nonlinear programming problem satisfying KKT conditions (Kuhn-Tucker).

$$min x_1x_4(x_1+x_2+x_3)+x_3$$

$$s.t$$ $$x_1x_2x_3x_4 \ge 25$$

$$x^2_1 + x^2_2 + x^2_3 + x^2_4 = 40$$

$$1 \le x_1x_2x_3x_4 \le 5$$

$$x_0 = (1,5,5,1)$$

$$x_0$$ are intial values.


import numpy as np
from scipy.optimize import minimize
def objective(x):
    return x[0]*x[3]*(x[0]+x[1]+x[2])+x[2]
def constraint1(x):
    return x[0]*x[1]*x[2]*x[3]-25.0

def constraint2(x):
    sum_eq = 40.0
    for i in range(4):
        sum_eq = sum_eq - x[i]**2
    return sum_eq

# initial guesses
n = 4
x0 = np.zeros(n)
x0[0] = 1.0
x0[1] = 5.0
x0[2] = 5.0
x0[3] = 1.0

# show initial objective
print('Initial SSE Objective: ' + str(objective(x0)))

# optimize
b = (1.0,5.0)
bnds = (b, b, b, b)
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'eq', 'fun': constraint2}
cons = ([con1,con2])
solution = minimize(objective,x0,method='SLSQP',\
                    bounds=bnds,constraints=cons)
x = solution.x

# show final objective
print('Final SSE Objective: ' + str(objective(x)))

# print solution
print('Solution')
print('x1 = ' + str(x[0]))
print('x2 = ' + str(x[1]))
print('x3 = ' + str(x[2]))
print('x4 = ' + str(x[3]))