# Minimizing a Quartic function with constraints ```python '''Minimizing a Quartic function with constraints''' import numpy as np from modopt import Problem class Quartic(Problem): def initialize(self, ): self.problem_name = 'quartic' def setup(self): self.add_design_variables('x', shape=(2, ), lower=np.array([0., -np.inf]), upper=np.array([np.inf, np.inf]), vals=np.array([500., 5.])) self.add_objective('f') self.add_constraints('c', shape=(2, ), lower=np.array([1., 1.]), upper=np.array([1., np.inf]), equals=None,) def setup_derivatives(self): self.declare_objective_gradient(wrt='x', vals=None) self.declare_constraint_jacobian(of='c', wrt='x', vals=np.array([[1.,1.],[1.,-1]])) def compute_objective(self, dvs, obj): x = dvs['x'] obj['f'] = np.sum(x**4) def compute_objective_gradient(self, dvs, grad): grad['x'] = 4 * dvs['x'] ** 3 def compute_constraints(self, dvs, cons): x = dvs['x'] con = cons['c'] con[0] = x[0] + x[1] con[1] = x[0] - x[1] def compute_constraint_jacobian(self, dvs, jac): pass # jac['c', 'x'] = vals=np.array([[1.,1.],[1.,-1]]) from modopt import SLSQP, SQP, SNOPT tol = 1E-8 maxiter = 500 prob = Quartic(jac_format='dense') print(prob) snopt_options = { 'Infinite bound': 1.0e20, 'Verify level': 3, } # Set up your optimizer with the problem optimizer = SLSQP(prob, solver_options={'maxiter':20}) # optimizer = SQP(prob, maxiter=20) # optimizer = SNOPT(prob, solver_options=snopt_options) optimizer.check_first_derivatives(prob.x0) optimizer.solve() optimizer.print_results(summary_table=True) print(prob) print('optimized_dvs:', prob.x.get_data()) print('optimized_cons:', prob.con.get_data()) print('optimized_obj:', prob.obj['f']) ```