Exercícios Resolvidos de Otimização

Ver Teoria

Enunciado

A figura abaixo mostra um sistema de molas em posição não-deformada sem cargas (linha tracejada) e em posição deformada com cargas nas juntas entre as molas (linha cheia.)

A rigidez da mola i é k i e é definida por:

k i = 450 + 225 M 3 - i 2       N / m i = 1 , … , 6

Onde M = 5 é o número de cargas. O peso W j é definido por

W j = 60 j j = 1 , … , 5

O comprimento de cada mola antes da aplicação das cargas é L i = 7,5   m . As coordenadas das juntas das molas (pontos 2 - 6 ) são representadas por dez variáveis de projeto: ( X i ,   Y i ) , i = 2 , … , 6 . Para encontrar a posição de equilíbrio, a seguinte função de energia potencial é minimizada:

E P = 0,5 ∑ i = 1 6 k i Δ L i 2 + ∑ j = 1 5 W j Y j + 1

Onde

Δ L i = X i + 1 - X i 2 + Y i + 1 - Y i 2 - L i

Determine as posições de equilíbrio usando fminsearch, isto é, as posições das juntas para o sistema com as molas deformadas. Use o ponto inicial X 2 , X 3 , X 4 , X 5 , X 6 , Y 2 , Y 3 , Y 4 , Y 5 , Y 6 = ( 7,5 ; 15 ; 22,5 ; 30 ; 37,5 ; 0 ; 0 ; 0 ; 0 ; 0 ) .

Passo 1

O enunciado nos dá uma função E P e pede para que encontremos o mínimo dela usando f m i n s e a r c h .

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 molas, representada pela função dada no enunciado:

E P = 0,5 ∑ i = 1 6 k i Δ L i 2 + ∑ j = 1 5 W j Y j + 1

Logo, a energia potencial do sistema E P é minha função objetivo.

A função objetivo depende das coordenadas das juntas das molas e de algumas constantes, como o número de cargas e o comprimento das molas relaxadas, dadas pelo enunciado:

L i = 7,5   m

M = 5

As coordenadas X i ,   Y i das juntas 2 a 6 são as variáveis de projeto. Em outras palavras, queremos encontrar qual a posição das juntas 2 a 6 que dê a menor energia potencial E P possível.

Passo 2

Para vermos por onde vamos começar o exercício, vamos relembrar a sintaxe de f m i n s e a r c h :

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

A função f m i n s e a r c h precisa de 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.

O vetor x 0 nos foi dado no enunciado, falta definirmos a função objetivo dada pelo enunciado no MATLAB. Vamos começar fazendo isso. Em um script novo, crie uma função chamada e p _ m o l a s (ou dê o nome que você quiser), que tem como entrada um vetor x de 10   elementos, representando as 10 variáveis de projeto.

Entre com as constantes listadas no passo 1: o número de cargas M e o comprimento das molas L i :

Existe outra informação que podemos tirar do enunciado, principalmente da imagem: as coordenadas das juntas 1 e 7 . Ambas as juntas são fixas, logo, suas coordenadas não vão mudar com a adição das M = 5   cargas.

Repare que o sistema de referência X Y está bem em cima da junta 1 na figura do enunciado, logo, as coordenadas da junta 1 são: X 1 ,   Y 1 = 0,0 .

Para a junta 7 , ela se encontra exatamente sobre o eixo X do sistema de referência X Y , logo, Y 7 = 0 . Já a sua coordenada em X é determinada pelo comprimento L i das molas sem carga: entre a junta 1 e a junta 7 , existem 6 molas, logo X 7 = 6 L i .

Digite as coordenadas das juntas 1 e 7 na função e p _ m o l a s :

Passo 3

Tendo as coordenadas das juntas 1 e 7 , vamos criar dois vetores, um com as coordenadas em X das 7 juntas do sistema, e outro com a coordenada Y , para nos ajudarem a construir a função objetivo. Esses vetores seriam assim:

X = X 1   X 2   X 3   X 4   X 5   X 6   X 7      

Y = Y 1   Y 2   Y 3   Y 4   Y 5   Y 6   Y 7      

Para criar esses vetores na nossa função, vamos usar as coordenadas X 1 , Y 1 , X 7 e Y 7 definidas no passo anterior e o vetor x , que é a entrada da função que contém as 10 variáveis de projeto, que são as coordenadas das juntas 2 a 6 . O vetor x é assim:

x = [ X 2         X 3         X 4         X 5         X 6         Y 2         Y 3         Y 4         Y 5         Y 6 ]

Logo, para gerar os vetor X e Y no MATLAB, vamos usar essas duas linhas de código:

Na primeira linha de código, o primeiro elemento do vetor X é X 1 , que é seguido da primeira metade de x , isto é, das coordenadas em X das juntas 2 a 6 . O último elemento de X é X 7 .

Da mesma forma, na segunda linha de código, o primeiro elemento do vetor Y é Y 1 , que é seguido da segunda metade de x , isto é, das coordenadas em Y das juntas 2 a 6 . O último elemento de Y é Y 7 .

Passo 4

Com os vetores X e Y definidos, podemos começar a entrar com a função obejtivo:

E P = 0,5 ∑ i = 1 6 k i Δ L i 2 + ∑ j = 1 5 W j Y j + 1

Vamos dividir E P em duas partes: o primeiro somatório se refere à energia potencial elástica e o segundo, à energia potencial gravitacional. Vamos calcular cada parte separadamente e no final, as juntamos para termos E P .

Vamos começar pelo primeiro somatório:

∑ i = 1 6 k i Δ L i 2

Para construi-lo, vamos precisar de um laço f o r , para calcular k i e Δ L i para cada i e somar o produto k i Δ L i 2 ao produto obtido com valores de i anteriores. Por isso, adicione em sua função as linhas de código:

Na primeira linha de código, criamos uma variável s o m a _ d e f e a fazemos igual a 0 . É ela quem vai representar o resultado do somatório ∑ i = 1 6 k i Δ L i 2 .

Na segunda linha, inicia-se o laço f o r , com uma variável de controle i que vai de 1 a 6 (como no somatório da energia potencial elástica).

Na terceira e na quarta linha, calculamos a rigidez k e a deformação d e l t a L da mola i . Note que usamos os vetores X e Y criados no passo anterior para calcular d e l t a L , pois a deformação depende das coordenadas das juntas.

Na quinta linha, atualizamos a variável s o m a _ d e f , fazendo-a igual à soma dela mesma com o produto k * d e l t a L ^ 2 . Desta forma, somamos k * d e l t a L ^ 2 ao valor de s o m a _ d e f da iteração anterior, para no final, com i = 6 , termos o resultado do somatório ∑ i = 1 6 k i Δ L i 2 .

Passo 5

Tendo concluído a criação do primeiro somatório, vamos partir para o segundo, o da energia potencial gravitacional:

∑ j = 1 5 W j Y j + 1

Para construi-lo, também usaremos um laço f o r , para calcular W j para cada j , multiplicá-lo pela coordenada Y da junta j + 1 e somar o produto W j Y j + 1 ao produto obtido com valores de j anteriores. Por isso, adicione em sua função as linhas de código:

Na primeira linha de código, criamos uma variável s o m a _ p e s o e a fazemos igual a 0 . É ela quem vai representar o resultado do somatório ∑ j = 1 5 W j Y j + 1 .

Na segunda linha, inicia-se o laço f o r , com uma variável de controle j que vai de 1 a 5 (como no somatório da energia potencial gravitacional).

Na terceira, calculamos o peso W .

Na quarta linha, atualizamos a variável s o m a _ p e s o , fazendo-a igual à soma dela mesma com o produto W * Y ( j + 1 ) . Desta forma, somamos W * Y ( j + 1 ) . ao valor de s o m a _ p e s o da iteração anterior, para no final, com j = 5 , termos o resultado do somatório ∑ j = 1 5 W j Y j + 1 .

Note que aqui usamos o vetor Y criado no passo 3, pois a energia potencial gravitacional depende da posição Y das cargas.

Após os dois laços f o r , podemos calcular E P , a nossa função objetivo:

No final, a função e p _ m o l a s ficou assim:

Passo 6

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 p _ m o l a s , digite as linhas de código:

Na primeira linha, entramos com o “chute” inicial das coordenadas das juntas, armazenado no vetor x 0 , fornecido pelo enunciado.

Na segunda linha, definimos uma variável o p t i o n s por meio de o p t i m s e t , uma função que serve para mudar alguns parâmetros do algoritmo de otimização. Nesta linha, aumentamos o número de vezes que E P é calculado por meio da função e p _ m o l a s , alterando o parâmetro ' M a x F u n E v a l s ' . Por padrão, o MATLAB calcula a função objetivo 200 vezes o número de variáveis de projeto (que no nosso caso é 10 , logo, seria 2000 vezes). Contudo, esse valor não é o suficiente para o algoritmo achar um ponto de mínimo, por isso, aumentei para 700   vezes.

O número máximo de iterações do algoritmo também foi aumentado, mexendo no parâmetro ' M a x I t e r ' . Por padrão, o número máximo de iterações também é 200 vezes o número de variáveis de projeto, o que também não foi o suficiente para encontrar um ponto de mínimo. Por isso, aumentei para 500 .

Na terceira linha, usamos f m i n s e a r c h . Note que dessa vez ela tem três entradas: a função objetivo, o “chute” inicial e o p t i o n s , que é a variável criada para mexer em alguns parâmetros do algoritmo de otimização. A saída de f m i n s e a r c h é o vetor x com as posições das juntas 2 a 6 que dão o menor E P possível.

Vamos rodar o programa para ver o que o f m i n s e a r c h vai retornar:

Para ver qual é o valor mínimo de E P , acrescente no código o comando:

Com este comando, calculamos E P usando a função e p _ m o l a s , tendo como entrada o resultado de f m i n s e a r c h .

Execute o programa para ver o E P mínimo:

Resposta

As posições de equilíbrio das juntas para o sistema de molas é:

X 2 , X 3 , X 4 , X 5 , X 6 , Y 2 , Y 3 , Y 4 , Y 5 , Y 6 = ( 7,7676 ; 15,6506 ; 23,4477 ; 30,8581 ; 38,4876 ; 2,9202 ; - 0,1105 ; - 1,8992 ; - 4,1636 ; - 3,9213 )

A energia potencial para essas coordenads é - 1,7596 ∙ 10 3   J .