CONTROLE ÓTIMO Aluno - PUC-Rio

Propaganda
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.
Download