@c English version: 2011-06-11
@menu
* Funciones y variables para augmented_lagrangian::
@end menu

@node Funciones y variables para augmented_lagrangian,  , augmented_lagrangian, augmented_lagrangian
@section Funciones y variables para augmented_lagrangian


@deffn {Función} augmented_lagrangian_method (@var{FOM}, @var{xx}, @var{C}, @var{yy})
@deffnx {Función} augmented_lagrangian_method (@var{FOM}, @var{xx}, @var{C}, @var{yy}, optional_args)
@deffnx {Función} augmented_lagrangian_method ([@var{FOM}, @var{grad}], @var{xx}, @var{C}, @var{yy})
@deffnx {Función} augmented_lagrangian_method ([@var{FOM}, @var{grad}], @var{xx}, @var{C}, @var{yy}, optional_args)

Devuelve una aproximación del valor mínimo de
la expresión @var{FOM} respecto de las variables @var{xx},
manteniendo las restricciones @var{C} igual a cero. La lista
@var{yy} contiene las soluciones iniciales para @var{xx}.
El algoritmo que se utiliza es el método del lagrangiano
aumentado (ver referencias [1] y [2]).

Si @var{grad} está presente en la llamada a la función, se interpreta
como el gradiente de @var{FOM} respecto de @var{xx}, representado como una
lista de tantas expresiones como variables tenga @var{xx}. Si el
argumento @var{grad} no está, se calculará de forma automática.

Tanto @var{FOM} como cada uno de los elementos de @var{grad}, si se
da como argumento, deben ser expresiones ordinarias; no admitiéndose
ni nombres de funciones ni expresiones lambda.

El argumento @code{optional_args} hace referencia a otros argumentos adicionales,
los cuales se especifican de la forma @code{@var{symbol} = @var{value}}.
Los argumentos opcionales reconocidos son:

@table @code
@item niter
Número de iteraciones del algoritmo.
@item lbfgs_tolerance
Tolerancia que se pasa a LBFGS.
@item iprint
Parámetro IPRINT (lista de dos enteros que controlan la frecuencia
de mensajes) que se pasa a LBFGS.
@item %lambda
Valor inicial de @code{%lambda} que será utilizado para calcular el
lagrangiano aumentado.
@end table

Esta función minimiza el lagrangiano aumentado haciendo uso
del algoritmo LBFGS, que es un método de los llamados
quasi-Newton.

Antes de hacer uso de esta función ejecútense @code{load("augmented_lagrangian")}.

Véase también @code{lbfgs}.

Referencias:

@ifnottex
[1] @url{http://www-fp.mcs.anl.gov/otc/Guide/OptWeb/continuous/constrained/nonlinearcon/auglag.html}

[2] @url{http://www.cs.ubc.ca/spider/ascher/542/chap10.pdf}
@end ifnottex
@iftex
[1] @url{http://www-fp.mcs.anl.gov/@-otc/@-Guide/@-OptWeb/@-continuous/@-constrained/@*nonlinearcon/@-auglag.html}

[2] @url{http://www.cs.ubc.ca/spider/ascher/542/chap10.pdf}
@end iftex

Ejemplos:

@c ===beg===
@c load (lbfgs);
@c load (augmented_lagrangian);
@c FOM: x^2 + 2*y^2;
@c xx: [x, y];
@c C: [x + y - 1];
@c yy: [1, 1];
@c augmented_lagrangian_method(FOM, xx, C, yy, iprint=[-1,0]);
@c ===end===
@example
(%i1) load (lbfgs);
(%o1)     /maxima/share/lbfgs/lbfgs.mac
(%i2) load (augmented_lagrangian);
(%o2) 
   /maxima/share/contrib/augmented_lagrangian.mac
(%i3) FOM: x^2 + 2*y^2;
                               2    2
(%o3)                       2 y  + x
(%i4) xx: [x, y];
(%o4)                        [x, y]
(%i5) C: [x + y - 1];
(%o5)                      [y + x - 1]
(%i6) yy: [1, 1];
(%o6)                        [1, 1]
(%i7) augmented_lagrangian_method(FOM, xx, C, yy, iprint=[-1,0]);
(%o7) [[x = 0.66665984108002, y = 0.33334027245545], 
                                 %lambda = [- 1.333337940892525]]
@end example

Mismo ejemplo que en el caso anterior, pero ahora el
gradiente se suministra como argumento.

@c ===beg===
@c load (lbfgs)$
@c load (augmented_lagrangian)$
@c FOM: x^2 + 2*y^2;
@c xx: [x, y];
@c grad : [2*x, 4*y];
@c C: [x + y - 1];
@c yy: [1, 1];
@c augmented_lagrangian_method ([FOM, grad], xx, C, yy, 
@c                              iprint = [-1, 0]);
@c ===end===
@example
(%i1) load (lbfgs)$
(%i2) load (augmented_lagrangian)$
(%i3) FOM: x^2 + 2*y^2;
                               2    2
(%o3)                       2 y  + x
(%i4) FOM: x^2 + 2*y^2;
                               2    2
(%o4)                       2 y  + x
(%i5) xx: [x, y];
(%o5)                        [x, y]
(%i6) grad : [2*x, 4*y];
(%o6)                      [2 x, 4 y]
(%i7) C: [x + y - 1];
(%o7)                      [y + x - 1]
(%i8) yy: [1, 1];
(%o8)                        [1, 1]
(%i9) augmented_lagrangian_method ([FOM, grad], xx, C, yy,
                                   iprint = [-1, 0]);
(%o9) [[x = 0.666659841080025, y = .3333402724554462], 
                                 %lambda = [- 1.333337940892543]]
@end example
@end deffn

