Departamento de Matemática CONTROLE ÓTIMO Aluno: João Pedro T. Brandão Orientador: Alex Castro Introdução Nesse estudo dirigido, consideramos vários exemplos concretos de programação nãolinear e tipicamente convexa para estudarmos vários métodos de aproximação para soluções ótimas. Ao longo do processo, tentamos avaliar as vantagens conceituais e computacionais de diferentes métodos tentando enfatizar como a estrutura do problema determina a escolha do método. Nosso algoritmos foram implementados em MatLab e só para fins de benchmarking que nós utilizamos alguns dos pacotes já disponíveis no MatLab. Nosso foco foi em compreender a heurística de cada método, e os truques de engenharia necessários para uma implementação bem-sucedida de cada algoritmo. Método de Newton O método visa resolver equações do tipo = 0, e é usado para achar máximos e mínimos de funções. Dado uma função derivável , e um chute inicial , achamos a reta tangente de em , e então resolvemos a equação linear para obter o próximo e o processo é repetido até que | − | < , onde é o erro aceitável. Algoritmo: 1. Dado um chute inicial , = 0. 2. Calcule o próximo valor, , = − . 3. Se | − | ≥ , repita o 2º passo com ← + 1. 4. Se | − | < , é a solução do sistema = 0 com um erro . A figura abaixo ilustra o algoritmo funcionando para duas iterações. Departamento de Matemática Figura 1 - Iterações de Newton Código MatLab: function d = newton1D( x, f ) % precision eps = 1e-7; % derivative df = diff(f); xt = x+1; while abs( x-xt ) > 1e-4 % derivative at x df_x = subs(df, x); temp = x; % verifies precision if abs(df_x) > eps xt = x - subs(f,x)/df_x; else xt = x + 01; end % updates for loop x = xt; xt = temp; end d = xt; Problemas com Convergência O método de Newton, quando converge, converge rápido para a solução. Porém há casos quando não converge. Departamento de Matemática Pode-se chegar a uma iteração de que seja um ponto crítico de e então a derivada nesse ponto, = 0, e então temos uma divisão por zero. Considere a função a baixo = − 2 + 2, com o chute inicial = 0. Iterando, obtemos = 1, = 0, assim voltamos ao chute inicial sem ter progredido muito para a solução da função. Figura 2 - Newton não converge Resolvemos isso adicionando um limite de iterações para o algoritmo, e assim recomeçamos com um novo chute inicial. Se a iteração chegue a um ponto crítico, sua derivada seria 0 no ponto e então teríamos uma divisão por 0. Pode-se resolver isso testando antes se = 0, caso seja verdadeiro, então ← + , onde é um pequeno incremento, e o algoritmo segue com o novo valor. Generalizando para n-Dimensões Pode-se generalizar usando = , … , , a derivada como a Jacobiana de no ponto , e usando a norma Euclidiana para determinar ‖ − ‖ < . O algoritmo para n-dimensões se torna: Algoritmo: 1. Dado um chute inicial , = 0. 2. Calcule o próximo valor, , = − "# . 3. Se ‖ − ‖ ≥ , repita o 2º passo com ← + 1. 4. Se ‖ − ‖ < , é a solução do sistema = 0 com um erro . Métodos Quase-Newton Um problema ainda não mencionado, é que nem sempre é barato calcular o gradiente de a cada iteração. Por isso surgiram os métodos do tipo Quase-Newton, que são métodos baseados em Newton, porém diferem na maneira de aproximar o gradiente. O método usual se baseia em diferenças finitas, onde a derivada é aproximada usando a secante de dois pontos. Departamento de Matemática Figura 3 - Iterações de Quase-Newton Utilizamos o método onde o gradiente é aproximado pela secante de dois pontos e é atualizada a cada iteração. Precisamos então de dois chutes iniciais, , , temos o seguinte algoritmo: Algoritmo: 1. Dado dois chutes iniciais , , = 0. 2. Calcule a secante: 3. Calcule o próximo valor : $= #%& #%& = − ' 4. Se ‖ − ‖ ≥ , repita o 2º passo com ← + 1. 5. Se ‖ − ‖ < , é a solução do sistema = 0 com um erro . Código MatLab: function d = quasinewton1d2( x1 , xt ) while abs(x1 - xt) > 1e-4 if (f(x1) - f(xt) == 0) xt = xt + 0.1; end %gradient of secant gd = (f(x1)-f(xt))/(x1-xt) ; xs = x1 - f(x1)/gd; %updates for loop x1 = xt; xt = xs; end Departamento de Matemática d = xt ; Exemplo: Considere = − 2 + 2, e damos o chute inicial = 0, = 1. Iterando, obtemos a seguinte sequencia de pontos: {2, 0.8, 0.5849, 2.5583, 0.4080, 0.1678, 1.1288, 3.4513, 1.0505, 0.9782, 0.0777, 1.9975, 0.7799, -3.7458, -0.9782, -1.1596, -3.0818, -1.3819, -1.5374, -1.8651, -1.7522, -1.7682, 1.7693, -1.7693} Obtendo -1.7693 como ponto crítico de . Comparamos com o resultado teórico de -1.76929, temos um erro de: |−1.7693 − −1.76929| = 0.00001, menor que a nossa tolerância que é de 0.0001. Generalizando para n-Dimensões Considerando que a Jacobiana é usada no método de Newton em n-dimensões, usamos sua aproximação: Dado uma função de n-variaveis = , … , , e = … . / . - / "=- ⋮ -/ , / ∈ ℝ , / + − . 4 / 3 /5 ≈⋱ ⋮ 3 ⋮ / 3 / - + − … / 2 , … ≡ 0, … , | |, … 0, + − 4 3 ⋱ ⋮ 3 + − 3 … 2 … :;1, … , <=,| | = | | = ⋯ = | | O valore de depende da precisão desejada, quanto menor o valor, maior a precisão. Note que a matriz da aproximação da Jacobiana tem dimensões < × <. É preciso calcular sua inversa a cada iteração, uma operação custosa a se fazer. Evitamos isso fazendo uma alteração no algoritmo. Ao invés de inverter a matriz, atualizamos diretamente a inversa da Jacobiana. Aproximamos esse incremento usando a fórmula de Sherman-Morrison que permite calcular a inversa de uma matriz perturbada. Algoritmo: 1. Dado dois chutes iniciais , , = 0. 2. Atualize a inversa da Jacobiana: ∆#B%& ∆ # D # " # = " # + ∆ C B%& %& ∆ ∆ " # %& 3. Calcule o próximo valor: (Fórmula de Sherman-Morrison) ∆ = − ∆ = − = − " # 4. Se ‖ − ‖ ≥ , repita o 2º passo com ← + 1. 5. Se ‖ − ‖ < , é a solução do sistema = 0 com um erro . Método de Lagrange O método de Lagrange é usado para maximizar ou minimizar funções com restrições de igualdade. Consideramos primeiro, para exemplificar, uma função de duas variáveis , 5 com uma restrição E, 5 = F, G = , 5, mas vale lembrar que o método vale para qualquer número de restrições. Queremos minimizar a função . O gradiente de nos dá um Departamento de Matemática vetor cuja direção aponta ao máximo, pois é um vetor que aponta para a maior taxa de crescimento da função. As curvas de níveis de , são curvas no domínio onde o valor de é constante. Consideramos a tangente da curva, a principio, a tangente nos da uma direção onde não varia. Segue que o gradiente é perpendicular à tangente da curva de nível e então perpendicular às curvas de níveis, ∇G ⊥ ;G = F=. Figura 4 - Gradiente aponta para o máximo As curvas de nível de G = F e EG = J são tangentes no ponto mínimo, G . Assim asseguramos que os gradientes, ∇EG e ∇G são paralelos, já que ambos são perpendiculares as suas respectivas curvas de nível, resultando em: K∇EG = ∇G , K ∈ ℝ Figura 5 - Curvas de Nível de f e restrição de g Podemos considerar pontos críticos ao invés de pontos de mínimo sem perda de generalidade. O Método: Departamento de Matemática Defina uma função L, 5, K ≔ , 5 + KE, 5 − F. ∇L, 5, K = 0 /L / /E ∴ = +K =0 / / / /L / /E = +K =0 /5 /5 /5 /L = E, 5 − F = 0 /K O método de Quase-Newton é usado para achar a solução, , 5 , K . O algoritmo consiste em montar a função L, 5, K e executar o método Quase-Newton para achar os valores , 5 , K . Generalizando para n-Dimensões com Várias restrições Considere G = , … , , função escalar de < variáveis, e E G = F são as restrições, = 1, … , O. Temos então: P LG, K , … , KP = G + Q K E G R É resolvido numericamente usando o método Quase-Newton. Restrições com desigualdades O método de Lagrange é útil para resolver problemas de otimização com restrições de igualdade, vamos agora considerar restrições com desigualdade também. Temos uma função G, que queremos minimizar ou maximizar com restrições de igualdade E = F , e restrições do tipo desigualdade ℎ ≤ J com = 1, … , U, e onde G ∈ V, V é o conjunto de pontos admissíveis. Consideramos dois casos Caso 1: O ponto crítico de , G , esta contido no interior do conjunto admissível, ou seja, G ∈ V. Neste caso não precisamos nos preocupar com as restrições pois podemos somente usar Quase-Newton para resolver ∇G = 0. Denotamos esse caso como vínculo inativo, já que a restrição é desnecessária. Figura 6 - Vínculo Inativo A figura acima mostra um ponto crítico que está dentro da área admissível. Departamento de Matemática Caso 2: O ponto crítico de está na fronteira de V. Nota-se que nesse caso podemos desconsiderar as restrições de desigualdade e focar somente na igualdade de ℎ . Assim chegamos ao caso que já foi resolvido: ∇G + Q W ∇ℎ G = 0,W ≥ 0 Esse caso é denominado como vínculo ativo, pois a restrição ℎ , é considerada. Figura 7 - Vínculo Ativo Modificamos a Lagrangeana para considerar os novos casos. Denotamos E funções de igualdade e ℎ de desigualdades da forma ℎ ≥ 0. LG, K, W = G − KEG − WℎG G = , … , , EG = E G, … , EP G K = K , … , KP , ℎG = ℎ G, … , ℎX G W = W , … , WX U é o número de vínculos ativos. No entanto, para resolver esse sistema, a principio, não temos como determinar quais são os vínculos ativos e inativos do sistema, então, para cada ℎ considerar ambos os casos descritos acima. Isso implica em considerar casos quando W = 0 e W ≠ 0. Se temos < restrições, temos que considerar 2 casos, ou seja, todas as combinações de vínculos ativos e inativos. Deve-se fazer uma analise mais rigorosa para determinar a maneira mais eficiente de tratar esse problema. Podemos ter duas restrições mutualmente exclusas. Ainda assim, os vínculos ativos ℎG = ℎ G, … , ℎX G no ponto crítico da função satisfazem a seguinte condição de regularidade: GZ$[Z"\FZ]\<\ = O + U Onde U é o numero de vínculos ativos, e O o número de restrições de igualdade. Note que se o vínculo não estiver ativo, seu multiplicador de Lagrange será 0. Exemplos: ℎ G ≔ > 0 e ℎ_ G ≔ < 0. Observamos então que se W ≠ 0 ≠ W_ , chegamos a uma impossibilidade. Podemos considerar um outro exemplo, onde não temos restrições suficientes para que exista um ponto de máximo nos pontos admissíveis, como no exemplo abaixo: Departamento de Matemática max = 3 − 11 − 3 − ℎ ≔ − + 7 − 3 − 7 ≥ 0 ℎ ≔ ≥ 0 ℎ ≔ ≥ 0 O conjunto dos pontos admissíveis não é compacto, e como a função considerada não tem máximo global, não é possível que exista um ponto de máximo, nesse exemplo. Função Barreira: Como o método funciona Criamos uma nova função c, a partir da função objetivo (função que desejamos minimizar/maximizar) e as restrições de desigualdade tal que, ao se aproxima das bordas de V, maior se torna o valor de c. Na borda da restrição, c = infinito. Cria-se essencialmente uma barreira tal que em todos os pontos da fronteira do domínio V de otimização, possui um gradiente que aponta para dentro. Incluímos então a função logarítmica para modelar esse efeito. cd G = G + Flnℎ + ⋯ + lnℎ Onde F, é o parâmetro da barreira. O ponto crítico de c não necessariamente corresponde ao ponto crítico de . Seja G o ponto crítico de , e Gd o ponto crítico de cd , quando F → 0, temos que Gd → G, pois a componente Flnℎ + ⋯ + lnℎ → 0 e então cd → . O algoritmo consiste em iterar sobre diferentes valores de F de tal forma que F → 0 . O algoritmo: 1. Escolha um chute inicial G , e um F inicial. 2. Monte a função cd e use o método Quase-Newton para achar o ponto crítico. 3. Escolha um outro F menor, e use o resultado do passo 2 como chute inicial, e volte ao passo 2. 4. Pare quando F for próximo suficiente de 0. Exemplo: Consideramos a função , 5 = 1 − − 5, com as restrições: ℎ : ≥ 0, ℎ : 5 ≥ 0, ℎ : 1 − ≥ 0ℎi : 1 − 5 ≥ 0 Montamos cd de tal forma: cd = , 5 − Flnℎ + lnℎ + lnℎ + lnℎi cd = 1 − − 5 + Flnx + lny + ln1 − x + ln1 − y Escolhemos , 5 = 0.5, 0.5 para o chute inicial, e iteramos sobre os seguintes valores de F = ;1, 0.5, 0.1, 0.05, 0.01, 0.001=. Após cada iteração obtemos os seguintes valores: F , 5 cd 1 0.62, 0.62 −0.2361 Tabela 1 – Exemplo Função Barreira 0.5 0.1 0.05 0.71, 0.71 0.91, 0.91 0.95, 0.95 −0.4142 −0.8198 −0.9050 0.01 0.99, 0.99 −0.9802 0.001 0.99, 0.99 −0.9980 Departamento de Matemática Figura 8 - F com valores distintos de c A figura acima mostra o desenvolvimento das linhas de contorno de c para F → 0. Note que quanto menor o valor de F, mais perto do canto superior direito fica o mínimo, conforme mostra os resultados. É importante notar que como usamos o Quase-Newton nesse método, o passo dado a cada iteração de Quase-Newton pode ser grande demais. Se ao atualizar o ponto, o ponto se encontra fora da barreira, obtemos um valor complexo, pois se temos o ponto 0.9, 0.9 e o passo a ser dado nos leva ao ponto 1.7, 1.7, a função barreira tem a componente ln1 − x + ln1 − y, como 1 − 1.7 = −0.7 e ln−0.7 é complexo. Para solucionar esse incomodo, basta diminuir o tamanho do passo dado suficientemente para que a função barreira não dê um valor complexo. Programação Sequencial Quadrática (PSQ) Dado uma função objetiva , restrições de igualdade E ( = 1, … , O e restrições de desigualdade ℎ_ ( n = 1, … , U, construímos a Lagrangeana do modo usual: LG, K, W = G − KEG − WℎG Então, no ponto mínimo, G∗ , K∗ , W ∗ , temos: ∇LG∗ , K∗ , W ∗ = 0 EG∗ = 0 Linearizamos para obter: ∇LG , K , W ≈ ∇LG , K , W + ∇ LG , K , W ∆G − ∇pG ∆K EG ≈ EG + ∇EG ∆G ∆K = K − K , ∆G = G − G , ∆W = W − W Departamento de Matemática Assim, conseguimos reduzir um problema de programação não linear a um problema de programação quadrática. Note que é preciso de um pontoG , K , W para poder fazer a aproximação. Após achar o mínimo, encontramos o próximo passo a ser dado se consideramos: K = K + ∆K W = W + ∆W G = G + ∆G Algoritmo: 1. Escolha um chute inicial G , K , W . 2. Monte a Lagrangeana. 3. Faça a aproximação quadrática da Lagrangeana do ponto G , K , W . 4. Use o método Quase-Newton para achar o passo a ser seguido. 5. Acrescente o passo a G , K , W e repita o 3º passo. Conjunto Ativo Introduzimos agora um método para ser usado em conjunção com o método PSQ. O método do conjunto ativo é usado para estimar quais vínculos são ativos. Dado um chute inicial do conjunto V, de vínculos ativos, e G , K , W , a Lagrangeana é montada de acordo. O passo ∆G, ∆K, ∆Wa ser tomado é achado seguindo o método PSQ. No entanto, ele é reduzido se há vínculos inativos que não são respeitados. Procuramos idealmente achar o maior valor que respeite todos vínculos. Denotamos q, como o tamanho do passo há ser dado. G , K , W = G , K , W + q∆G, ∆K, ∆W, 0 ≤ q ≤ 1 Note que se q for reduzido, isso implica que houve um vínculo inativo que deveria ser considerado ativo. O vínculo não respeitado é então adicionado ao conjunto V e o processo se repete. Se não houver restrições desrespeitada ainda há a possibilidade que o conjunto V tenha vínculos que deveriam ser inativos. Olhamos então para os multiplicadores de Lagrange, W , se todos forem positivos, o mínimo foi achado e o método termina, caso contrário, o vínculo com o menor multiplicador de Lagrange é removido do conjunto e o processo se repete. Algoritmo: 1. Escolha um chute inicial G , K , W e um conjunto inicial V. 2. Use uma iteração do método PSQ. 3. Determine q. 4. G , K , W = G , K , W + q∆G, ∆K, ∆W 5. Se q < 1, adicione o vínculo limitante à V e repita o 2º passo com os novos valores. 6. Se existe multiplicadores de Lagrange, W < 0, então remova o vínculo com o menor multiplicador de Lagrange de V, e repita o 2º passo com os novos valores. 7. Término. Código: function [X] = SQP(F, active_eq, active_ineq, inactive, var, x1) % active set active = [active_eq active_ineq]; while true if ~isempty(active) lambda = sym('lambda%d', size(active)); Departamento de Matemática var2 = [var lambda]; else var2 = var; end PQ = F ; % objective function for i = 1:length(active) PQ = PQ - lambda(i)*active(i); end PQ_jac = jacobian(PQ, var2); % finds minimum of objective's quadratic approximation x2 = quasi_newtonND_QP(x1, PQ_jac, var2, 50) ; % step xp = x2 - x1; alpha = 1; if ~isempty(inactive) % heuristics for getting maximum allowed size of step (alpha) A_top = subs(inactive, var2, x1); A_bot = jacobian(inactive, var2); A_bot = xp*subs(A_bot, var2, x1).'; alpha = -A_top./A_bot; % checks if alpha is valid (alpha > 0 && minimum -> alpha) A_min = alpha > 1e-10 ; A_min = alpha(A_min) == min(alpha(A_min)); alpha = alpha(A_min); if(isempty(alpha) ) alpha = 1; end end % take step x2 = x1 + alpha*xp; x1 = x2; if alpha < 1 % if full step isnt possible due to one of the inactive constraints % add it to the the active set active = [active inactive(A_min)]; inactive = inactive(~A_min); x1 = [x1 0]; else % if full step is possible % get the negative Lagrange multipliers del = x2 <= 0; Departamento de Matemática del(1:(length(var)+length(active_eq))) = 0; if ~isempty(x2(del)) % there are negative multipliers % remove from the active set the constraint with the most negative % multiplier del = x2((length(var)+length(active_eq))+1:end); del = del == min(del); inactive = [inactive active(del)]; active = active(~del); del = [1:(length(var)+length(active_eq)) del]; del(1:length(var)) = 0; x1 = x1(~del); else % all multipliers are positive % terminate X = x2; break; end end end Exemplo Consideramos a função = + 5 , com as restrições ;F = + 5 − 2 ≥ 0, F = 4 − − 5 ≥ 0=. Podemos escolher aleatoriamente V, e , 5 , W , porem é valido ressaltar que o chute inicial de V é proporcional a iterações necessárias para o fim do algoritmo, pois a cada alteração feita no conjunto, terá que fazer mais uma iteração do método PSQ. Escolhemos então V = ;F =, e , 5 , W = 4,0,0. Montamos a Lagrangeana: 2 L, 5, W = + 5 − W4 − − 5 3 #d t Determinamos q utilizando da seguinte heurística: q = min s∆t∇d tu v, onde F ∈ Vd e ∆G é o passo a ser tomado. Segue os valores obtidos das iterações: u Tabela 2 - Exemplo Programação Sequencial Quadrática Iteração Conjunto Ativo 5 W W 0 4 0 0 F 1 2,7692 1,8462 -5,5385 F é removido 2 1,2 0,8 F é adicionado 3 1 1 2 F Departamento de Matemática F F Figura 9 - Programação Sequencial Quadrática A figura ilustra as iterações feitas, mostrando os pontos admissíveis de , e o caminho percorrido do algoritmo mostrando as direções e tamanhos dos passos dados. Conclusão O estudo verticalizado constituiu uma experiência prática e bastante ilustrativa do poder da modelagem matemática e computação científica na solução de problemas práticos. Fomos bem-sucedidos em entender o uso e a implementação de várias ferramentas de otimização aproximada, e adquirimos a sensibilidade de ponderar sobre o tipo de ferramenta a ser utilizado dependendo da estrutura matemática do problema. Dentre os vários algoritmos estudados, o ponto alto foi algoritmo de Programação Sequencial Quadrática: de largo escopo computacional, e adequado para amplas classes de problemas, ele também mostrou-se conceitualmente interessante por incorporar praticamente toda a teoria linear e não-linear de otimização visitada nesse estudo verticalizado. Uma de nossas tarefas (bem-sucedida) foi implementar uma simples versão do PSQ para problemas de programação quadrática. Também investimos uma farta quantidade de tempo entendendo os meandros de pacotes de otimização de porte profissional, como o fmincon do MatLab. Referências Bibliográficas 1. BRINKHUIS, J.; TIKHOMIROV, V. Optimization: Insights and Applications. Princeton University Press, 2005. (Princeton Series in Applied Mathematics). 2. BORTOLOSSI, J.H. Cálculo Diferencial a Várias Variáveis: Uma Introdução à Teoria de Otimização. Rio de Janeiro, Editora PUC-Rio, 2002. 3. PRESS, W. H. et al. Numerical Recipes in C: The Art of Scientific Computing. 2nd. ed. New York, NY.: Press Syndicate of the University of Cambridge, 2002. 4. BETTS, J. T. Practical Methods for Optimal Control and Estimation Using Nonlinear Programming. Second Edition, SIAM, 2009.