JM tiene razón sobre el almacenamiento. BFGS requiere un Hessian aproximado, pero puede inicializarlo con la matriz de identidad y luego simplemente calcular las actualizaciones de rango dos al Hessian aproximado a medida que avanza, siempre que tenga información de gradiente disponible, preferiblemente analíticamente en lugar de a través de diferencias finitas. BFGS es un método cuasi-Newton, y convergerá en menos pasos que CG, y tiene un poco menos de tendencia a "atascarse" y requiere pequeños ajustes algorítmicos para lograr un descenso significativo para cada iteración.
Por el contrario, CG requiere productos de vectores de matriz, que pueden ser útiles para usted si puede calcular derivadas direccionales (de nuevo, analíticamente o utilizando diferencias finitas). Un cálculo de diferencia finita de una derivada direccional será mucho más barato que un cálculo de diferencia finita de una arpillera, por lo que si elige construir su algoritmo utilizando diferencias finitas, calcule directamente la derivada direccional. Sin embargo, esta observación no se aplica realmente a BFGS, que calculará las Hesse aproximadas utilizando productos internos de información de gradiente.
nortenorte
Compararía los dos algoritmos en un pequeño problema de prueba para su aplicación si sabe que el almacenamiento no será un problema. Sin conocer los detalles específicos de su problema, supongo que BFGS será más rápido, pero realmente debe probar los dos algoritmos para tener una mejor idea de cuál funcionará mejor.
Finalmente, una palabra acerca de la diferenciación automática: teniendo algo de experiencia con un servicio interno de diferenciación automática (AD) para Fortran ( DAEPACK ), puedo decirle que las herramientas de AD a menudo son delicadas. Es posible que no necesariamente puedan diferenciar el código que generan ellos mismos. Hay dos tipos de herramientas AD:
- herramientas de fuente a fuente de AD
- operador sobrecargando herramientas AD
Las herramientas de fuente a fuente son compiladores esencialmente modificados que toman el código fuente que ha escrito, lo analizan y generan automáticamente un nuevo código fuente que calcula el gradiente de funciones en su código fuente. Las herramientas de AD de sobrecarga de operadores requieren que use los operadores de AD sobrecargados en su código fuente para poder calcular los derivados, lo que requeriría un esfuerzo adicional de su parte para calcular derivados analíticos con AD.