@c Language: Brazilian Portuguese, Encoding: iso-8859-1
@c /lbfgs.texi/1.3/Sat Jun  2 00:13:23 2007//
@menu
* Introdução a lbfgs::
* Funções e Variáveis Definidas para lbfgs::
@end menu

@node Introdução a lbfgs, Funções e Variáveis Definidas para lbfgs, Top, Top
@section Introdução a lbfgs

@code{lbfgs} é uma implementação do algorítmo[1] L-BFGS (Broyden-Fletcher-Goldfarb-Shanno)
para resolver problemas de minimização não limitada através de um algorítmo de memória limitada quasi-Newton (BFGS).
Esse algorítmo é chamado de método de memória limitada porque uma aproximação de baixo ranque da
inverso da matriz Hessiana é armazenado em lugar da inversa da matriz Hessiana completa.
O programa foi escrito origináriamente em Fortran [2] por Jorge Nocedal,
incorporando algumas funções originalmente escritas por Jorge J. Moré e David J. Thuente,
e traduzidas para Lisp automaticamente através do programa @code{f2cl}.
O pacote do Maxima @code{lbfgs} compreende o código traduzido e adicionalmente
uma interface de função que gerencia alguns detallhes.

Referências:

[1] D. Liu and J. Nocedal. "On the limited memory BFGS method for large
scale optimization". @i{Mathematical Programming B} 45:503--528 (1989)

[2] http://netlib.org/opt/lbfgs_um.shar

@node Funções e Variáveis Definidas para lbfgs, , Introdução a lbfgs, Top
@section Funções e Variáveis Definidas para lbfgs

@deffn {Função} lbfgs (@var{FOM}, @var{X}, @var{X0}, @var{epsilon}, @var{iprint})

Encontra uma solução aproximada da minimização não limitada de número de mérito @var{FOM}
sobre a lista de variáveis @var{X},
começando a partir da estimativa inicial @var{X0},
tal que @math{norm grad FOM < epsilon max(1, norm X)}.

O algorítmo aplicado é um algorítmo de memória limitada[1] quasi-Newton (BFGS).
Esse algorítmo é chamado de método de memória limitada porque uma aproximação de baixo ranque da
inverso da matriz Hessiana é armazenado em lugar da inversa da matriz Hessiana completa.
Cada iteração do algorítmo é uma busca de linha, isto é,
uma busca ao longo de um raio em torno da variáveis @var{X},
com a direção de busca calculada a partir da Hessian inversa aproximada.
O FOM é sempre decrementado por meio de uma busca de linha realizada com sucesso.
Usualmente (mas não sempre) a norma do gradiente de FOM também é decrementada.

@var{iprint} controla as messaens de progresso mostradas através de @code{lbfgs}.

@table @code
@item iprint[1]
@code{@var{iprint}[1]} controla a freq@"{u}ência das mensagens de progresso.
@table @code
@item iprint[1] < 0
Nenhuma mensagem de progresso.
@item iprint[1] = 0
Messagens na primeira iteração e na última iteração.
@item iprint[1] > 0
Mostra uma mensagem a cada @code{@var{iprint}[1]} iterações.
@end table
@item iprint[2]
@code{@var{iprint}[2]} controla a quantidade de informações fornecidas pelas mensagens de progresso (verbosidade).
@table @code
@item iprint[2] = 0
Mostra na tela o contador de iterações, o número de avaliações de @var{FOM}, o valor de @var{FOM},
a norma do gradiente de @var{FOM}, e o comprimento do salto.
@item iprint[2] = 1
O mesmo que @code{@var{iprint}[2] = 0}, adicionando @var{X0} e o gradiente de @var{FOM} avaliado em @var{X0}.
@item iprint[2] = 2
O mesmo que @code{@var{iprint}[2] = 1}, adicionando valores de @var{X} a cada iteração.
@item iprint[2] = 3
O mesmo que @code{@var{iprint}[2] = 2}, adicionando o gradiente de @var{FOM} a cada iteração.
@end table
@end table

As colunas mostradas por @code{lbfgs} são as seguintes.

@table @code
@item I
número de iterações. Esse número é incrementado a cada busca de linha.
@item NFN
Número de avaliações do número de mérito.
@item FUNC
Valor do nero de mérito ao final da busca de linha mais recente.
@item GNORM
Norma do gradiente do número de mérito ao final da mais recente busca de linha.
@item STEPLENGTH
Um parâmetro interno do algorítmo de busca.
@end table

Informação adicional com relação a detalhes do algorítmo podem ser encontradas nos
comentários do código Fortran original em [2].

Veja também @code{lbfgs_nfeval_max} e @code{lbfgs_ncorrections}.

Referências:

[1] D. Liu e J. Nocedal. "On the limited memory BFGS method for large
scale optimization". @i{Mathematical Programming B} 45:503--528 (1989)

[2] http://netlib.org/opt/lbfgs_um.shar

Exemplo:

O mesmo FOM como calculada por FGCOMPUTE no programa sdrive.f no pacote LBFGS de Netlib.
Note que as variáveis em questão são variáveis com subscritos.
O FOM tem um mínimo exato igual a zero em @math{u[k] = 1} for @math{k = 1, ..., 8}.
@c ===beg===
@c load ("lbfgs");
@c t1[j] := 1 - u[j];
@c t2[j] := 10*(u[j + 1] - u[j]^2);
@c n : 8;
@c FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
@c lbfgs (FOM, '[u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8]],
@c        [-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
@c ===end===

@example
(%i1) load ("lbfgs");
(%o1)   /usr/share/maxima/5.10.0cvs/share/lbfgs/lbfgs.mac
(%i2) t1[j] := 1 - u[j];
(%o2)                     t1  := 1 - u
                            j         j
(%i3) t2[j] := 10*(u[j + 1] - u[j]^2);
                                          2
(%o3)                t2  := 10 (u      - u )
                       j         j + 1    j
(%i4) n : 8;
(%o4)                           8
(%i5) FOM : sum (t1[2*j - 1]^2 + t2[2*j - 1]^2, j, 1, n/2);
                 2 2           2              2 2           2
(%o5) 100 (u  - u )  + (1 - u )  + 100 (u  - u )  + (1 - u )
            8    7           7           6    5           5
                     2 2           2              2 2           2
        + 100 (u  - u )  + (1 - u )  + 100 (u  - u )  + (1 - u )
                4    3           3           2    1           1
(%i6) lbfgs (FOM, '[u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8]],
       [-1.2, 1, -1.2, 1, -1.2, 1, -1.2, 1], 1e-3, [1, 0]);
*************************************************
  N=    8   NUMBER OF CORRECTIONS=25
       INITIAL VALUES
 F=  9.680000000000000D+01   GNORM=  4.657353755084532D+02
*************************************************

   I  NFN     FUNC                    GNORM                   STEPLENGTH

   1    3     1.651479526340304D+01   4.324359291335977D+00   7.926153934390631D-04  
   2    4     1.650209316638371D+01   3.575788161060007D+00   1.000000000000000D+00  
   3    5     1.645461701312851D+01   6.230869903601577D+00   1.000000000000000D+00  
   4    6     1.636867301275588D+01   1.177589920974980D+01   1.000000000000000D+00  
   5    7     1.612153014409201D+01   2.292797147151288D+01   1.000000000000000D+00  
   6    8     1.569118407390628D+01   3.687447158775571D+01   1.000000000000000D+00  
   7    9     1.510361958398942D+01   4.501931728123680D+01   1.000000000000000D+00  
   8   10     1.391077875774294D+01   4.526061463810632D+01   1.000000000000000D+00  
   9   11     1.165625686278198D+01   2.748348965356917D+01   1.000000000000000D+00  
  10   12     9.859422687859137D+00   2.111494974231644D+01   1.000000000000000D+00  
  11   13     7.815442521732281D+00   6.110762325766556D+00   1.000000000000000D+00  
  12   15     7.346380905773160D+00   2.165281166714631D+01   1.285316401779533D-01  
  13   16     6.330460634066370D+00   1.401220851762050D+01   1.000000000000000D+00  
  14   17     5.238763939851439D+00   1.702473787613255D+01   1.000000000000000D+00  
  15   18     3.754016790406701D+00   7.981845727704576D+00   1.000000000000000D+00  
  16   20     3.001238402309352D+00   3.925482944716691D+00   2.333129631296807D-01  
  17   22     2.794390709718290D+00   8.243329982546473D+00   2.503577283782332D-01  
  18   23     2.563783562918759D+00   1.035413426521790D+01   1.000000000000000D+00  
  19   24     2.019429976377856D+00   1.065187312346769D+01   1.000000000000000D+00  
  20   25     1.428003167670903D+00   2.475962450826961D+00   1.000000000000000D+00  
  21   27     1.197874264861340D+00   8.441707983493810D+00   4.303451060808756D-01  
  22   28     9.023848941942773D-01   1.113189216635162D+01   1.000000000000000D+00  
  23   29     5.508226405863770D-01   2.380830600326308D+00   1.000000000000000D+00  
  24   31     3.902893258815567D-01   5.625595816584421D+00   4.834988416524465D-01  
  25   32     3.207542206990315D-01   1.149444645416472D+01   1.000000000000000D+00  
  26   33     1.874468266362791D-01   3.632482152880997D+00   1.000000000000000D+00  
  27   34     9.575763380706598D-02   4.816497446154354D+00   1.000000000000000D+00  
  28   35     4.085145107543406D-02   2.087009350166495D+00   1.000000000000000D+00  
  29   36     1.931106001379290D-02   3.886818608498966D+00   1.000000000000000D+00  
  30   37     6.894000721499670D-03   3.198505796342214D+00   1.000000000000000D+00  
  31   38     1.443296033051864D-03   1.590265471025043D+00   1.000000000000000D+00  
  32   39     1.571766603154336D-04   3.098257063980634D-01   1.000000000000000D+00  
  33   40     1.288011776581970D-05   1.207784183577257D-02   1.000000000000000D+00  
  34   41     1.806140173752971D-06   4.587890233385193D-02   1.000000000000000D+00  
  35   42     1.769004645459358D-07   1.790537375052208D-02   1.000000000000000D+00  
  36   43     3.312164100763217D-10   6.782068426119681D-04   1.000000000000000D+00  

 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.
 IFLAG = 0
(%o6) [u  = 1.000005339815974, u  = 1.000009942839805, 
        1                       2
u  = 1.000005339815974, u  = 1.000009942839805, 
 3                       4
u  = 1.000005339815974, u  = 1.000009942839805, 
 5                       6
u  = 1.000005339815974, u  = 1.000009942839805]
 7                       8
@end example
@end deffn

@defvr {Variãvel} lbfgs_nfeval_max
Valor padrão: 100

@code{lbfgs_nfeval_max} é o número máximo de avaliações do número de mérito (FOM - "figure of merit" em inglês) em @code{lbfgs}.
Quando @code{lbfgs_nfeval_max} for encontrada,
@code{lbfgs} retorna o resultado da última busca de linha realizada co sucesso.

@end defvr

@defvr {Variãvel} lbfgs_ncorrections
Valor padrão: 25

@code{lbfgs_ncorrections} é o número de correções aplicadas
à matriz Hessiana inversa aproximada que é mantida por @code{lbfgs}.

@end defvr


