
O método de descida por coordenadas é um dos métodos mais simples de otimização multidimensional e faz um bom trabalho em encontrar um mínimo local de funções com uma topografia relativamente suave; portanto, é melhor começar a se familiarizar com os métodos de otimização a partir dele.
A busca pelo extremo é realizada na direção dos eixos das coordenadas, ou seja, durante o processo de pesquisa, apenas uma coordenada é alterada. Assim, um problema multidimensional se reduz a um problema unidimensional.
Algoritmo
Primeiro ciclo:
- , , , ..., .
- Procurando funções extremas . Coloque o extremo da função no ponto .
- , , , ..., . Função Extremum é igual a
- ...
- , , , ..., .
Como resultado da execução de n etapas, foi encontrado um novo ponto de abordagem ao extremo . Em seguida, verificamos o critério para o final da conta: se for atendida, a solução será encontrada, caso contrário, realizaremos outro ciclo.
Preparação
Verifique as versões do pacote:
(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 uma função para desenhar as linhas de superfície ou de nível nas quais seria conveniente ajustar os limites do gráfico:
using Plots plotly()
Como função de modelo, escolhemos um parabolóide elíptico
parabol(x) = sum(u->u*u, x) fun = parabol plotter(surface, low = [-1 -1], up = [1 1])

Descida de coordenadas
Implementamos o método em uma função que leva o nome do método de otimização unidimensional, a dimensão do problema, o erro desejado, a aproximação inicial e as restrições para desenhar linhas de nível. Todos os parâmetros são definidos para os valores padrão.
function ofDescent(odm; ndimes = 2, ε = 1e-4, fit = [.5 .5], low = [-1 -1], up = [1 1]) k = 1
Em seguida, tentaremos vários métodos de otimização unidimensional.
Método de Newton
A ideia do método é simples, assim como a implementação

Newton é bastante exigente na aproximação inicial e, sem limitação nos degraus, pode facilmente partir para distâncias desconhecidas. O cálculo da derivada é desejável, mas pequenas variações podem ser dispensadas. Modificamos nossa função:
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)

Interpolação parabólica inversa
Um método que não requer conhecimento da derivada e tem boa convergência
function ipi(i, fit, ϵ)

Se piorarmos a aproximação inicial, o método começará a exigir um imenso número de etapas para cada era de descida de coordenadas. Nesse sentido, seu irmão ganha
Interpolação Parabólica Sequencial
Também requer três pontos de partida , mas em muitas funções de teste mostra resultados mais satisfatórios.
function spi(i, fit, ϵ)

Sair de um ponto de partida muito ruim foi feito em três etapas! Bom ... Mas todos os métodos têm uma desvantagem - eles convergem para um mínimo local. Agora vamos assumir a função de Ackley para pesquisa
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 da proporção áurea
Teoria Embora a implementação seja complicada, o método às vezes se mostra bem pulando os mínimos locais
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)

Isso é tudo com descida coordenada. Os algoritmos dos métodos apresentados são bastante simples, portanto, implementá-los no seu idioma preferido não é difícil. No futuro, você poderá considerar as ferramentas integradas da linguagem Julia , mas, por enquanto, deseja tocar em tudo, por assim dizer, com suas mãos, considerar os métodos mais complicados e mais eficientes, para ir para a otimização global, comparando simultaneamente com a implementação em outro idioma.
Literatura
- Zaitsev V.V. Métodos numéricos para físicos. Equações não lineares e otimização: um tutorial. - Samara, 2005 - 86s.
- Ivanov A.V. Métodos de computador para otimizar sistemas ópticos. Guia de estudo. –SPb: SPbSU ITMO, 2010 - 114s.
- Popova T. M. Métodos de otimização multidimensional: diretrizes e tarefas para trabalhos de laboratório na disciplina "Métodos de otimização" para estudantes da direção "Matemática Aplicada" / comp. T. M. Popova. - Khabarovsk: Editora do Pacífico. estado Universidade, 2012 - 44 p.