This repository contains a collection of MATLAB scripts that implement some of the classical optimization methods for unconstrained optimization models: Steepest-Descent, Newton method, Gauss-Newton, Conjugate Gradient method, Fibonacci search, Golden-section search, Dichotomous search and Exhaustive search.
A otimização irrestrita lida com o problema de encontrar o ponto de mínimo (ou máximo) de uma função-objetivo sem a imposição de quaisquer restrições sobre os valores das variáveis de decisão. O foco aqui são os problemas de otimização unidimensional irrestrita, que buscam minimizar uma função de uma única variável,
Uma premissa fundamental para a garantia de convergência desses métodos de busca é que a função-objetivo seja unimodal no intervalo de busca inicial. Uma função unimodal é aquela que possui apenas um mínimo (ou um pico) em um dado intervalo, permitindo que partes do intervalo sejam eliminadas a cada iteração.
Os algoritmos de busca operam sobre um intervalo inicial de incerteza,
Todos os scripts de métodos de busca neste repositório foram aplicados para encontrar o ponto de mínimo da seguinte função-objetivo no intervalo
A seguir, são descritos os métodos implementados.
Este é o método de busca mais fundamental. Ele funciona dividindo o intervalo de incerteza inicial n
subintervalos equidistantes. A função é então avaliada em cada um dos n+1
pontos gerados, e o ponto que resulta no menor valor da função é considerado a aproximação do mínimo. O número de divisões n
é escolhido para satisfazer uma tolerância pré-definida. O princípio que rege a precisão do método é: se o ponto médio do intervalo final de incerteza for tomado como o ponto ótimo aproximado, o desvio máximo pode ser n
é o número de intervalos em que

A busca Dichotomous aprimora a busca exaustiva ao reduzir o intervalo de forma mais inteligente. A cada iteração, dois pontos de teste são posicionados muito próximos um do outro, em torno do ponto médio do intervalo atual. A distância entre eles é definida por um valor muito pequeno,

O método de busca Fibonacci é conhecido por ser o mais eficiente entre os métodos de busca em termos do número de avaliações da função para atingir uma dada precisão[cite: 613]. Ele utiliza a sequência de Fibonacci para determinar a posição dos pontos de teste a cada iteração. Uma característica única é que o número total de iterações, n
, deve ser definido a priori. A grande vantagem é que, a partir da segunda iteração, apenas uma nova avaliação da função é necessária para reduzir o intervalo de incerteza, reutilizando um dos pontos da iteração anterior. O gráfico a seguir mostra o ponto de mínimo encontrado:

A busca Golden-section é muito semelhante à busca de Fibonacci, mas com uma vantagem prática importante: ela não exige que o número de iterações seja conhecido antecipadamente. O método utiliza a razão áurea,

Para validar e comparar os resultados dos algoritmos implementados, foi utilizado o otimizador fminbnd
do Optimization Toolbox™ do MATLAB. Esta função é um padrão da indústria para otimização unidimensional irrestrita em um intervalo e tipicamente combina métodos robustos como a busca Golden-section e a interpolação parabólica para encontrar o mínimo de forma rápida e precisa. O gráfico a seguir mostra o ponto de mínimo encontrado:

Esta seção do repositório é dedicada aos métodos de gradiente (ou métodos de descida) para resolver problemas de otimização irrestrita multidimensional. Estes problemas são definidos pela busca do ponto mínimo de uma função
A estratégia central por trás desses métodos é a de um método de descida, que gera uma sequência de pontos
onde
Todos os scripts de métodos de gradiente neste repositório foram aplicados para encontrar o ponto de mínimo da seguinte função-objetivo quadrática:
A seguir, são descritos os métodos de gradiente implementados.
Este é um dos métodos de gradiente mais antigos e fundamentais. Sendo um método de primeira ordem, ele utiliza apenas as derivadas primeiras da função. A direção de busca é a do gradiente negativo,

O método de Newton é um método de segunda ordem, pois utiliza tanto o gradiente (derivadas primeiras) quanto a matriz Hessiana (derivadas segundas) da função. Ele se baseia em uma aproximação quadrática da função-objetivo em torno do ponto atual. A direção de busca, conhecida como "direção de Newton", é calculada como

O método de Gauss-Newton é uma modificação do método de Newton, desenvolvido especificamente para resolver problemas de mínimos quadrados, onde a função-objetivo é uma soma de quadrados de funções não-lineares:

Nota-se que este método não alcançou um ponto de mínimo similar aos demais métodos para a função objetivo deste exemplo. Pode-se dizer que o método de Gauss-Newton não é a ferramenta certa para este trabalho, enquanto a aplicação do método de Newton clássico resolve o problema de forma muito mais direta e eficiente.
O método do Gradiente Conjugado é um dos algoritmos mais eficientes para otimização irrestrita de larga escala. Ele melhora a convergência lenta do método de Descida Íngreme sem incorrer no alto custo do método de Newton. A ideia é que as direções de busca sucessivas sejam mutuamente conjugadas em relação à matriz Hessiana. A nova direção de busca é uma combinação linear do gradiente negativo atual e da direção de busca anterior:

[1] [Antoniou, 2007] Antoniou, A. and Lu, W.S. Practical Optimization: Algorithms and Engineering Applications, Springer, 2007
[2] [Rao, 2009] Singiresu S. Rao. Engineering Optimization: Theory and Practice, Fourth Ed., 2009, Wiley
[3] [Luenberger 2008] D.G. Luenberger, Y. Ye, Linear and Nonlinear Programming, Third Ed., Addison Wesley, 2008, Springer
[4] Stephen Boyd, Lieven Vandenberghe. Convex Optimization. Cambridge University Press 2004