2
2
3
3
import nlopt
4
4
import math as m
5
+ import sys
5
6
6
7
7
8
def myfunc (x , grad ):
@@ -10,23 +11,28 @@ def myfunc(x, grad):
10
11
grad [1 ] = 0.5 / m .sqrt (x [1 ])
11
12
return m .sqrt (x [1 ])
12
13
14
+
13
15
def myconstraint (x , grad , a , b ):
14
16
if grad .size > 0 :
15
17
grad [0 ] = 3 * a * (a * x [0 ] + b )** 2
16
18
grad [1 ] = - 1.0
17
19
return (a * x [0 ] + b )** 3 - x [1 ]
18
20
19
- opt = nlopt .opt (nlopt .LD_MMA , 2 )
20
- opt .set_lower_bounds ([- float ('inf' ), 0 ])
21
+
22
+ algo = nlopt .LD_MMA if len (sys .argv ) < 2 else int (sys .argv [1 ])
23
+ opt = nlopt .opt (algo , 2 )
24
+ print (f"algo: { opt .get_algorithm_name ()} " )
25
+ opt .set_lower_bounds ([- float ('inf' ), 1e-6 ])
21
26
opt .set_min_objective (myfunc )
22
- opt .add_inequality_constraint (lambda x , grad : myconstraint (x ,grad , 2 , 0 ), 1e-8 )
23
- opt .add_inequality_constraint (lambda x , grad : myconstraint (x ,grad , - 1 , 1 ), 1e-8 )
27
+ opt .add_inequality_constraint (lambda x , grad : myconstraint (x , grad , 2 , 0 ), 1e-8 )
28
+ opt .add_inequality_constraint (lambda x , grad : myconstraint (x , grad , - 1 , 1 ), 1e-8 )
24
29
opt .set_xtol_rel (1e-4 )
25
30
x0 = [1.234 , 5.678 ]
26
31
x = opt .optimize (x0 )
27
32
minf = opt .last_optimum_value ()
28
- print ('optimum at ' , x )
29
- print ('minimum value = ' , minf )
30
- print ('result code = ' , opt .last_optimize_result ())
31
- print ('nevals = ' , opt .get_numevals ())
32
- print ('initial step =' , opt .get_initial_step (x0 ))
33
+ print (f"optimum at { x } " )
34
+ print (f"minimum value: { minf :.7g} " )
35
+ print (f"result code: { opt .last_optimize_result ()} " )
36
+ print (f"nevals: { opt .get_numevals ()} " )
37
+ print (f"initial step: { opt .get_initial_step (x0 )} " )
38
+ assert m .fabs (minf - 0.544331 ) < 1e-3 , "wrong optimum"
0 commit comments