| 38 | === Formulación de funciones objetivo y de restricción === |
| 39 | |
| 40 | Tanto si se calcula el gradiente como si no, las funciones objetivo y las de restricción deben tener la API TOL general común a todas ellas: |
| 41 | |
| 42 | {{{ |
| 43 | #!cpp |
| 44 | Real eval (Matrix x, Matrix gradient) |
| 45 | }}} |
| 46 | |
| 47 | En el caso de que se quiera usar un método que precise el gradiente, no se |
| 48 | necesariamente se exigirá calcular el mismo cada vez que se quiera evaluar |
| 49 | la función. En tales casos se le pasará la matriz vacía para indicar que |
| 50 | no se haga el cálculo. Podría pensarse si no sería mejor hacer una función |
| 51 | para la evaluación de la función y otra para el gradiente, pero resulta que |
| 52 | muy a menudo el cálculo del gradiente utiliza en parte las mismas componentes |
| 53 | que la propia función, por lo que resulta más eficiente que se calculen de |
| 54 | forma conjunta. La función de evaluación debería por tanto tener este aspecto: |
| 55 | |
| 56 | {{{ |
| 57 | #!cpp |
| 58 | Real eval (Matrix x, Matrix gradient) |
| 59 | { |
| 60 | ... |
| 61 | Real y = ...; |
| 62 | Real If(Rows(grad), { |
| 63 | ... |
| 64 | Matrix grad := ...; |
| 65 | True |
| 66 | }); |
| 67 | y |
| 68 | }; |
| 69 | }}} |
| 70 | |
| 71 | Si el problema no es diferenciable o el cálculo del gradiente es muy costoso |
| 72 | y se van a usar sólo algoritmos que no requieren el cálculo del gradiente, |
| 73 | entonces se puede hacer caso omiso del argumento {{{ Matrix gradient }}} y |
| 74 | calcular sólo el valor de la función. |
47 | | En el test se describe la solución TOL del sencillo [http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial ejemplo] proporcionado por el propio NLopt. |
| 84 | En primer lugar se expondrá el [http://ab-initio.mit.edu/wiki/index.php/NLopt_Tutorial ejemplo] proporcionado en el tutorial de NLopt |
| 85 | |
| 86 | ==== Función objetivo ==== |
| 87 | {{{ |
| 88 | #!cpp |
| 89 | //////////////////////////////////////////////////////////////////////////////// |
| 90 | //Target function defined as simple code |
| 91 | Real my_function(Matrix x, Matrix grad) |
| 92 | //////////////////////////////////////////////////////////////////////////////// |
| 93 | { |
| 94 | Real y = Sqrt(MatDat(x,2,1)); |
| 95 | Real If(Rows(grad), { |
| 96 | Matrix grad := Col(0.0,0.5/y); |
| 97 | True |
| 98 | }); |
| 99 | y |
| 100 | }; |
| 101 | }}} |
| 102 | |
| 103 | ==== Restricciones de desigualdad ==== |
| 104 | {{{ |
| 105 | #!cpp |
| 106 | //////////////////////////////////////////////////////////////////////////////// |
| 107 | //When a set of constraining functions are part of a parametric family |
| 108 | //of funcitons we can define a class to make an easier definition |
| 109 | Class @my_inequation |
| 110 | //////////////////////////////////////////////////////////////////////////////// |
| 111 | { |
| 112 | Real a; |
| 113 | Real b; |
| 114 | Real constraint(Matrix x, Matrix grad) |
| 115 | { |
| 116 | Real x1 = MatDat(x,1,1); |
| 117 | Real x2 = MatDat(x,2,1); |
| 118 | Real ax1b = a*x1 + b; |
| 119 | Real If(Rows(grad), { |
| 120 | Matrix grad := Col(3 * a * ax1b^2,-1.0); |
| 121 | True |
| 122 | }); |
| 123 | Real g = (ax1b^3 - x2); |
| 124 | g |
| 125 | } |
| 126 | }; |
| 127 | |
| 128 | //////////////////////////////////////////////////////////////////////////////// |
| 129 | //Inequality constraining functions defined as class instances |
| 130 | //////////////////////////////////////////////////////////////////////////////// |
| 131 | @my_inequation ineq1 = [[Real a= 2,Real b=0]]; |
| 132 | @my_inequation ineq2 = [[Real a=-1,Real b=1]]; |
| 133 | |
| 134 | }}} |