Exercícios Resolvidos de Otimização

Ver Teoria

Enunciado

A figura abaixo mostra um sistema de duas molas com uma carga F = 5   N (representado pelo desenho em linha cheia) e sem carga (desenho em linha tracejada):

Após a carga F ser aplicada no ponto A , o sistema se deforma até atingir o equilíbrio no ponto B , quando a energia potencial é mínima. A função da energia potencial ( E P ) é dada pela equação abaixo:

E P x 1 , x 2 = 0,5 k 1 x 1 2 + L 1 - x 2 2 - L 1 2 + 0,5 k 2 x 1 2 + L 2 + x 2 2 - L 2 2 - F x 1

Encontre a localização ( x 1 , x 2 ) do ponto B onde a energia potencial E P é mínima de duas maneiras:

  1. Plote a superfície e as curvas de nível da função E P x 1 , x 2 ;
  2. Use f m i n s e a r c h com um ponto inicial x 1 , x 2 = ( 1,1 ) .

Passo 1

O enunciado nos dá uma função E P x 1 , x 2 e pede para que encontremos o mínimo dela usando dois métodos.

A primeira coisa que devemos entender bem antes de atacar o exercício é qual é o problema de otimização. Para isto, devemos ter bem claro:

  • “O que eu quero minimizar?”, definindo a função objetivo;
  • “O que eu quero minimizar depende do quê?”, definindo as variáveis de projeto.

O que queremos minimizar é a energia potencial do sistema de duas molas, representada pela função dada no enunciado:

E P x 1 , x 2 = 0,5 k 1 x 1 2 + L 1 - x 2 2 - L 1 2 + 0,5 k 2 x 1 2 + L 2 + x 2 2 - L 2 2 - F x 1

Logo, a energia potencial do sistema de duas molas E P x 1 , x 2 é minha função objetivo.

A função objetivo depende das variáveis x 1 e x 2 e de algumas constantes, todas indicadas na figura:

k 1 = 8   N / c m

k 2 = 8   N / c m

L 1 = 10   c m

L 2 = 10   c m

F = 5   N

As variáveis x 1 e x 2 são as variáveis de projeto. Em outras palavras, queremos encontrar quanto x 1 e x 2 devem ser para que a energia potencial E P x 1 , x 2 seja a menor possível.

Usaremos dois métodos para encontrar as coordenadas x 1 e x 2 que minimizam E P x 1 , x 2 :

  1. Gerando a superfície e a curvas de nível: usaremos as funções s u r f c e c o n t o u r para gerar os gráficos. Se você não as conhece, não se preocupe, vamos ver tintim por tintim como elas funcionam;
  2. Usando f m i n s e a r c h , com um chute inicial x 1 , x 2 = ( 1,1 ) .

Passo 2

Vamos começar pela letra a. Em um novo script, entre as constantes listadas no passo 1:

Em seguida, vamos criar dois vetores, x 1 e x 2 , representando uma faixa de valores que x 1 e x 2 podem assumir:

Os vetores x 1 e x 2 vão de - 5 a 15 , com um passo de 1 . Eles servirão para criar os eixos X e Y dos gráficos da superfície e das curvas de nível pedidos na letra a.

Para podermos usar as funções s u r f c e c o n t o u r do MATLAB, devemos criar matrizes a partir dos vetores x 1 e x 2 , que contêm as coordenadas dos vetores. Faremos isso usando a função m e s h g r i d ( ) :

A função m e s h g r i d ( ) pega os vetores x 1 e x 2 , que têm 21 elementos, e cria duas matrizes quadradas X 1 e X 2 , de tamanho 21 × 21 . Cada linha da matriz X 1 é o vetor x 1 , repetido 21 vezes. Já cada coluna da matriz X 2 é o vetor x 2 , repetido 21 vezes.

Para ver bem direitinho como o m e s h g r i d ( ) funciona, você pode rodar o script que você escreveu até agora e pedir ao MATLAB para imprimir x 1 e X 1 e compará-los, e fazer a mesma coisa para x 2 e X 2 .

A função m e s h g r i d ( ) serve para auxiliar na criação de gráficos em três dimensões. A matriz X 1 será o eixo X do gráfico da superfície e das curvas de nível da função E P x 1 , x 2 . Já a matriz X 2 será o eixo Y.

O eixo Z dos gráficos será a energia potencial. Por isso temos que criar uma matriz de tamanho 21 × 21 com os resultados de E P x 1 , x 2 para cada elemento das matrizes X 1 e X 2 . Digite no MATLAB a função da energia potencial, substituindo x 1 e x 2 pelas matrizes X 1 e X 2 :

No print acima, eu “quebrei” a função em três linhas, para ela não ficar toda numa linha só e ficar ruim de ler. No MATLAB, fazemos quebras de linha colocando três pontos ( . . . ) onde queremos quebrar.

Repare também no uso do ponto ao lado das matrizes (por exemplo, X 1 . ^ 2 ), ele indica que queremos realizar a operação em cada elemento da matriz.

Passo 3

Após ter criado as matrizes X 1 , X 2 e E P , podemos gerar os gráficos pedidos na letra a. Vamos começar com a superfície da função E P x 1 , x 2 , que será gerada usando a função s u r f c do MATLAB. A função s u r f c tem o seguinte formato:

s u r f c ( X , Y , Z )

A s u r f c plota uma superfície tridimensional com as curvas de nível abaixo dela. Ela gera um gráfico 3D com os valores da matriz X no eixo X, da matriz Y no eixo Y e da matriz Z no eixo Z.

Vai dar para entender melhor aplicando a s u r f c no exercício. Para gerar a superfície da função E P x 1 , x 2 , adicione no script as seguintes linhas de código:

Na primeira linha, pedimos ao MATLAB para gerar uma figura com o comando f i g u r e ( 1 ) , para termos o gráfico da superfície em uma janela diferente do gráfico das curvas de nível.

Na segunda linha, o comando s u r f c ( X 1 , X 2 , E P ) cria a superfície da energia potencial, tendo X 1 no eixo X, X 2 no eixo Y e E P no eixo Z.

Na terceira linha, o comando c o l o r b a r faz com que o gráfico tenha uma barra de cores indicando a intensidade da energia potencial.

Na quarta linha, dizemos que o eixo X do gráfico corresponde à variável de projeto x 1 , com o comando x l a b e l ( ‘ x _ 1 ’ ) .

Na quinta linha, dizemos que o eixo Y do gráfico corresponde à variável de projeto x 2 , com o comando y l a b e l ( ‘ x _ 2 ’ ) .

Finalmente, na sexta linha, indicamos que o eixo Z do gráfico corresponde à energia potencial, com o comando z l a b e l ( ' E P ( x _ 1 , x _ 2 ) ' ) .

Vamos executar o programa pra ver essa superfície:

Repare que logo abaixo da superfície, no plano x 1 x 2 , temos as curvas de nível da superfície.

Para analisar a superfície e identificar o ponto de mínimo, na janela do gráfico, use o botão “Rotate 3D”, destacado abaixo, para “girar” a superfície.

Podemos ver as coordenadas dos pontos da superfície clicando neles. O ponto com menor E P que encontrei está marcado na superfície e tem coordenadas x 1 = 2 , x 2 = 0 e E P = - 9,686 . Contudo, eu não tenho certeza se esse realmente é o ponto de mínimo.

É difícil encontrar o ponto exato de mínimo olhando só a superfície. Por isso, vamos gerar as curvas de nível em um gráfico separado para ver se facilita.

Passo 4

Para gerar um gráfico de curvas de nível, usaremos a função c o n t o u r , que tem a seguinte estrutura:

c o n t o u r ( X , Y , Z )

Esse comando cria um gráfico de curvas de nível, onde as isolinhas (linhas que ligam pontos de mesmo valor) correspondem aos valores da matriz Z . As matrizes X e Y definem o eixo X e o eixo Y do gráfico de curvas de nível.

Para criar o gráfico de curvas de nível, digite no seu script os comandos:

Na primeira linha, pedimos ao MATLAB para criar uma segunda figura com o comando f i g u r e ( 2 ) , para que o gráfico de curvas de nível seja gerado em uma janela diferente da janela onde foi plotada a superfície, no passo 3.

Na segunda linha, o comando c o n t o u r ( X 1 , X 2 , E P , ' S h o w T e x t ' , ' o n ' ) cria o gráfico das curvas de nível da energia potencial, tendo X 1 no eixo X, X 2 no eixo Y e E P dando os valores para as isolinhas. As strings no final do comando ( ' S h o w T e x t ' , ' o n ' ) pedem ao MATLAB para mostrar o valor de cada curva do gráfico.

Na terceira linha, indicamos que o eixo X do gráfico do gráfico corresponde à variável de projeto x 1 , com o comando x l a b e l ( ‘ x _ 1 ’ ) .

Na quarta linha, dizemos que o eixo Y do gráfico corresponde à variável de projeto x 2 , com o comando y l a b e l ( ‘ x _ 2 ’ ) .

Bora rodar o programa pra ver as curvas de nível:

Repare que as curvas com menor E P estão mais no interior do gráfico e quanto mais afastados do centro, maior a intensidade de E P .

A curva de menor intensidade mostrada no gráfico é E P = 0 . Isto significa que as coordenadas x 1 e x 2 que dão o mínimo E P estão no interior dessa curva e que a energia potencial mínima é pelo menos 0 , mas pode assumir valores negativos. Podemos ver as coordenadas de certos pontos ao clicar sobre o ponto no gráfico. Na figura acima, achei o mesmo ponto de mínimo que encontrei no gráfico de superfície: as coordenadas x 1 = 2 , x 2 = 0 dão um E P = - 9,686 .

Passo 5

Apesar de eu ter encontrado o mesmo ponto de mínimo, pode ser que na minha busca eu tenha deixado passar algum ponto com energia potencial menor. Por isso, vamos usar o f m i n s e a r c h   para encontrar o ponto de mínimo de maneira mais precisa (e responder à letra b do exercício).

Antes de implementar o f m i n s e a r c h , vamos relembrar como ele é:

x   =   f m i n s e a r c h ( @ f u n ç ã o , x 0 )

Precisamos fornecer a ela no mínimo duas entradas:

  • @ f u n ç ã o : uma função representando a função objetivo;
  • x 0 : um vetor contendo um “chute” inicial das variáveis de projeto.

A saída de f m i n s e a r c h é um vetor x contendo os valores das variáveis de projeto que minimizam a função objetivo.

Vamos criar uma nova função no MATLAB para representar a função objetivo E P x 1 , x 2 . Abra um script novo e digite:

Chamei a função que contém a função objetivo de e n _ p o t , mas você pode chamar do que quiser. e n _ p o t tem como entrada a variável x , que é um vetor de dois elementos contendo as variáveis de projeto do problema de otimização: x 1 e x 2 . A saída de e n _ p o t é a variável E P , que é a energia potencial que queremos minimizar.

Repare que tive que entrar novamente com as constantes da função E P x 1 , x 2 , listadas no passo 1.

Após criar um script com a função objetivo, vamos implementar a f m i n s e a r c h . Em um novo script, salvo na mesma pasta onde está o script da função e n _ p o t , digite as linhas de código:

Na primeira linha, entramos com o “chute” inicial das variáveis de projeto x 1 e x 2 , armazenado no vetor x 0 . O enunciado pediu para adotarmos x 0   =   1   1   .

Na segunda linha, usamos f m i n s e a r c h . Para indicar a função objetivo em f m i n s e a r c h , usamos o nome da função criada com a função objetivo com um @ na frente. Por isso a primeira entrada de f m i n s e a r c h , neste caso, é @ e n _ p o t (caso tenha dado um nome diferente, não esqueça de trocar!). O algoritmo de otimização por trás de f m i n s e a r c h vai procurar o mínimo da função objetivo, isto é, o menor valor possível de E P , partindo de x 0 .

A saída de f m i n s e a r c h é o vetor x , de dois elementos, com os valores de   x 1   e   x 2 que dão o menor E P possível.

A terceira linha calcula o valor de E P usando a função e n _ p o t , tendo como entrada o vetor x dado por f m i n s e a r c h . Desta forma, encontramos a energia potencial mínima.

Vamos rodar o programa para ver o que o f m i n s e a r c h vai retornar e qual é a energia potencial mínima:

Encontramos que a energia potencial mínima é E P = - 15,2802 e ela ocorre em x 1 = 4,1289 e x 2 = 0 .

Nossa, bem diferente dos valores que encontramos no gráficos, né? Pelo menos temos certeza que o resultado obtido usando f m i n s e a r c h é realmente o mínimo da função.

Resposta

A energia potencial mínima é E P = - 15,2802 e ela ocorre em x 1 = 4,1289 e x 2 = 0 .