JM está certo sobre o armazenamento. O BFGS requer um Hessian aproximado, mas você pode inicializá-lo com a matriz de identidade e, em seguida, apenas calcular as atualizações de nível dois para o Hessian aproximado à medida que avança, desde que você tenha informações de gradiente disponíveis, preferencialmente analiticamente, e não através de diferenças finitas. O BFGS é um método quase-Newton e convergirá em menos etapas que o CG, e tem uma tendência um pouco menos de "ficar preso" e exigir pequenos ajustes algorítmicos para obter uma descida significativa para cada iteração.
Por outro lado, o CG requer produtos vetoriais de matriz, que podem ser úteis para você, se você puder calcular derivadas direcionais (novamente, analiticamente ou usando diferenças finitas). Um cálculo de diferença finita de uma derivada direcional será muito mais barato que um cálculo de diferença finita de um Hessiano; portanto, se você optar por construir seu algoritmo usando diferenças finitas, basta calcular diretamente a derivada direcional. Essa observação, no entanto, não se aplica realmente ao BFGS, que calculará Hessianos aproximados usando produtos internos de informações de gradiente.
nn
Eu compararia os dois algoritmos em um pequeno problema de teste para seu aplicativo se você souber que o armazenamento não será um problema. Sem conhecer as especificidades específicas do seu problema, meu palpite é que o BFGS será mais rápido, mas você deve realmente testar os dois algoritmos para ter uma idéia melhor de qual funcionará melhor.
Por fim, uma palavra sobre diferenciação automática: tendo alguma experiência com um recurso interno de diferenciação automática (AD) para Fortran ( DAEPACK ), posso dizer que as ferramentas do AD geralmente são exigentes. Eles podem não ser capazes de diferenciar necessariamente o código que eles próprios geram. Existem dois tipos de ferramentas do AD:
- ferramentas AD de fonte a fonte
- operador sobrecarregando ferramentas AD
As ferramentas fonte a fonte são essencialmente compiladores modificados que pegam o código-fonte que você escreveu, analisam e geram automaticamente um novo código-fonte que calcula o gradiente de funções no seu código-fonte. As ferramentas de sobrecarga do operador do AD exigem que você use os operadores do AD sobrecarregados em seu código-fonte para que as derivadas possam ser calculadas, o que exigiria um esforço adicional de sua parte para calcular derivadas analíticas com o AD.