Consider a simple question using Scipy.optimize: Maximize(xy) s.t x^2+y^2=200. The right code is this :
<code>import numpy as np
from scipy.optimize import minimize
def objective(var_tmp):
x, y = var_tmp
return -x * y
def constraint(var_tmp):
x, y = var_tmp
return 200 - (x ** 2 + y ** 2)
initial_guess = [1, 1]
constraints = {'type': 'ineq', 'fun': constraint}
result = minimize(objective, initial_guess, constraints=constraints)
optimal_x, optimal_y = result.x
optimal_value = -result.fun
print(f"Optimal x: {optimal_x}")
print(f"Optimal y: {optimal_y}")
print(f"Maximum xy value: {optimal_value}")
</code>
<code>import numpy as np
from scipy.optimize import minimize
def objective(var_tmp):
x, y = var_tmp
return -x * y
def constraint(var_tmp):
x, y = var_tmp
return 200 - (x ** 2 + y ** 2)
initial_guess = [1, 1]
constraints = {'type': 'ineq', 'fun': constraint}
result = minimize(objective, initial_guess, constraints=constraints)
optimal_x, optimal_y = result.x
optimal_value = -result.fun
print(f"Optimal x: {optimal_x}")
print(f"Optimal y: {optimal_y}")
print(f"Maximum xy value: {optimal_value}")
</code>
import numpy as np
from scipy.optimize import minimize
def objective(var_tmp):
x, y = var_tmp
return -x * y
def constraint(var_tmp):
x, y = var_tmp
return 200 - (x ** 2 + y ** 2)
initial_guess = [1, 1]
constraints = {'type': 'ineq', 'fun': constraint}
result = minimize(objective, initial_guess, constraints=constraints)
optimal_x, optimal_y = result.x
optimal_value = -result.fun
print(f"Optimal x: {optimal_x}")
print(f"Optimal y: {optimal_y}")
print(f"Maximum xy value: {optimal_value}")
Which gives the right answer 100.
However, if the constraint is written as follows:
<code>def constraint(var_tmp):
x, y = var_tmp
if x ** 2 + y ** 2 <= 200:
return 1
return -1
</code>
<code>def constraint(var_tmp):
x, y = var_tmp
if x ** 2 + y ** 2 <= 200:
return 1
return -1
</code>
def constraint(var_tmp):
x, y = var_tmp
if x ** 2 + y ** 2 <= 200:
return 1
return -1
It will give infinity as an answer. Why is the case?