
El método de descenso por coordenadas es uno de los métodos más simples de optimización multidimensional y hace un buen trabajo al encontrar un mínimo local de funciones con una topografía relativamente suave, por lo que es mejor comenzar a familiarizarse con los métodos de optimización a partir de él.
La búsqueda del extremo se lleva a cabo en la dirección de los ejes de coordenadas, es decir. durante el proceso de búsqueda, solo se cambia una coordenada. Por lo tanto, un problema multidimensional se reduce a uno unidimensional.
Algoritmo
Primer ciclo:
- , , , ..., .
- Buscando funciones extremas . Ponga el extremo de la función en el punto .
- , , , ..., . Función extrema es igual a
- ...
- , , , ..., .
Como resultado de realizar n pasos, se encontró un nuevo punto de aproximación al extremo . A continuación, verificamos el criterio para el final de la cuenta: si se cumple, se encuentra la solución, de lo contrario, realizamos un ciclo más.
Preparación
Verifique las versiones del paquete:
(v1.1) pkg> status Status `C:\Users\User\.julia\environments\v1.1\Project.toml` [336ed68f] CSV v0.4.3 [a93c6f00] DataFrames v0.17.1 [7073ff75] IJulia v1.16.0 [47be7bcc] ORCA v0.2.1 [58dd65bb] Plotly v0.2.0 [f0f68f2c] PlotlyJS v0.12.3 [91a5bcdd] Plots v0.23.0 [ce6b1742] RDatasets v0.6.1 [90137ffa] StaticArrays v0.10.2 [8bb1440f] DelimitedFiles [10745b16] Statistics
Definimos una función para dibujar las líneas de superficie o nivel en las que sería conveniente ajustar los límites del gráfico:
using Plots plotly()
Como función modelo, elegimos un paraboloide elíptico
parabol(x) = sum(u->u*u, x) fun = parabol plotter(surface, low = [-1 -1], up = [1 1])

Descenso coordinado
Implementamos el método en una función que toma el nombre del método de optimización unidimensional, la dimensión del problema, el error deseado, la aproximación inicial y las restricciones para dibujar líneas de nivel. Todos los parámetros están configurados a valores predeterminados.
function ofDescent(odm; ndimes = 2, ε = 1e-4, fit = [.5 .5], low = [-1 -1], up = [1 1]) k = 1
A continuación, probaremos varios métodos de optimización unidimensional.
Método de Newton
La idea del método es simple como es la implementación

Newton es bastante exigente en la aproximación inicial, y sin limitación en los pasos, puede viajar fácilmente a distancias desconocidas. El cálculo de la derivada es deseable, pero se puede prescindir de una pequeña variación. Modificamos nuestra función:
function newton(i, fit, ϵ) k = 1 oldfit = Inf x = [] y = [] push!(x, fit[1]) push!(y, fit[2]) while ( abs(oldfit - fit[i]) > ϵ && k<50 ) fx = fun(fit) oldfit = fit[i] fit[i] += 0.01 dfx = fun(fit) fit[i] -= 0.01 tryfit = fx*0.01 / (dfx-fx)

Interpolación parabólica inversa
Un método que no requiere conocimiento de la derivada y tiene buena convergencia.
function ipi(i, fit, ϵ)

Si empeoramos la aproximación inicial, el método comenzará a requerir un inmenso número de pasos para cada era de descenso coordinado. En este sentido, su hermano gana
Interpolación Parabólica Secuencial
También requiere tres puntos de partida , pero en muchas funciones de prueba muestra resultados más satisfactorios.
function spi(i, fit, ϵ)

Salir de un punto de partida muy malo vino en tres pasos. Bien ... Pero todos los métodos tienen un inconveniente: convergen a un mínimo local. Ahora tomemos la función de Ackley para investigar
ekly(x) = -20exp(-0.2sqrt(0.5(x[1]*x[1]+x[2]*x[2]))) - exp(0.5(cospi(2x[1])+cospi(2x[2]))) + 20 + ℯ


ofDescent(spi, fit = [1.4 1.4], low = [-.1 -.1], up = [2.4 2.4])

Método de la proporción áurea
Teoría Aunque la implementación es complicada, el método a veces se muestra bien al saltar mínimos locales
function interval(i, fit, st) d = 0. ab = zeros(2) fitc = copy(fit) ab[1] = fitc[i] Fa = fun(fitc) fitc[i] -= st Fdx = fun(fitc) fitc[i] += st if Fdx < Fa st = -st end fitc[i] += st ab[2] = fitc[i] Fb = fun(fitc) while Fb < Fa d = ab[1] ab[1] = ab[2] Fa = Fb fitc[i] += st ab[2] = fitc[i] Fb = fun(fitc)

Eso es todo con descenso coordinado. Los algoritmos de los métodos presentados son bastante simples, por lo que implementarlos en su idioma preferido no es difícil. En el futuro, puede considerar las herramientas integradas del lenguaje Julia , pero por ahora desea sentir todo con sus manos, por así decirlo, considere métodos más complicados y eficientes, luego puede ir a la optimización global, comparándolo simultáneamente con una implementación en otro idioma.
Literatura
- Zaitsev V.V. Métodos numéricos para físicos. Ecuaciones no lineales y optimización: un tutorial. - Samara, 2005 - 86s.
- Ivanov A.V. Métodos informáticos para optimizar los sistemas ópticos. Guía de estudio. –SPb: SPbSU ITMO, 2010 - 114s.
- Popova T. M. Métodos de optimización multidimensional: directrices y tareas para el trabajo de laboratorio en la disciplina "Métodos de optimización" para estudiantes de la dirección "Matemática Aplicada" / comp. T. M. Popova. - Khabarovsk: Editorial del Pacífico. estado Universidad, 2012 .-- 44 p.