Gradiente Conjugado no lineal

La base para un gradiente conjugado no lineal es aplicar efectivamente el gradiente conjugado lineal, reemplazando el residuo por el gradiente.
El primero de estos métodos fue propuesto por Fletcher and Reeves de la siguiente manera: dada una dirección de paso p_k, se utiliza una búsqueda lineal para encontrar α_k tal que x_ (k + 1) = x_k + α_kp_k. Luego se calcula

β_ (k + 1) = ∇f(x_ (k + 1)) . ∇f(x_ (k + 1))/∇f(x_k) . ∇f(x_k) p_ (k + 1) = β_ (k + 1) p_k - ∇f(x_ (k + 1)) (2)

Un método alternativo que generalmente (no siempre) funciona mejor en la práctica, es el de Polak y Ribiere, que reemplaza (2) por

FormBox[RowBox[{β_ (k + 1), =, RowBox[{RowBox[{∇f(x_ (k + 1)),  , .,  , RowBox[{(,  ... _ (k + 1))}], -, ∇f(x_k)}],  , )}]}], /, ∇f(x_k) . ∇f(x_k)}]}], TraditionalForm] (3)

En Mathematica el método por defecto es Polak-Ribiere, pero se puede cambiar utilizando la opción: Method→{"ConjugateGradient", Method→"FletcherReeves"}
La ventaja de estos métodos es que utilizan poca memoria para problemas grandes, relativamente, y no necesitan hacer álgebra lineal numérica de forma que cada paso es rápido.
La desventaja es que no tienen ratas de convergencia como Newton o quasi-Newton. Además, los pasos no se escalan correctamente en longitud, de forma que la búsqueda lineal necesita más iteraciones cada vez para encontrar un paso aceptable.

Pasos tomados por el gradiente conjugado no lineal. El camino es menos directo que en el caso de Newton.

FindMinimumPlot[Cos[x^2 - 3 y] + Sin[x^2 + y^2], {{x, 1}, {y, 1}}, Method->"ConjugateGradient"]

[Graphics:../HTMLFiles/optimizacion_111.gif]

{{-2., {x1.37638, y1.67868}}, {Steps9, Function22, Gradient22}, ⁃ContourGraphics⁃}

opción valor por defecto explicación
''Method'' ''PolakRibiere'' puede ser ''PolakRibiere'' o ''FletcherReeves''
''RestartThreshold'' 1/10 borde para la ortogonalidad del gradiente, por debajo de este se reinicia el método
''RestartIterarions'' iteraciones permitidas antes de reiniciar el método
''StepControl'' ''LineSearch'' debe ser ser : ''LineSearch'', se puede utilizar para especificar las opciones de este

Created by Mathematica  (August 9, 2004)