| | 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 | }}} |