Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Método diretos para problemas inversos e a NumPy

Método diretos para problemas inversos e a NumPy

Paulo Bordoni

April 09, 2019
Tweet

More Decks by Paulo Bordoni

Other Decks in Education

Transcript

  1. A resolução de sistemas de equações lineares é um problema

    inverso extremamente importante em Engenharia.
  2. 11 1 + 12 2 + ⋯ + 1 =

    1 21 1 + 22 2 + ⋯ + 2 = 2 ⋯ 1 1 + 2 2 + ⋯ + = Surfista, confira que o sistema de equações lineares acima pode ser escrito como o produto = , abaixo e vice-versa. 11 12 ⋯ 1 21 22 ⋯ 2 ⋮ 1 ⋮ 2 ⋱ ⋮ ⋯ 1 2 ⋮ = 1 2 ⋮ =
  3. 11 12 ⋯ 1 1 2 ⋮ = 11 1

    + 12 2 + ⋯ + 1 Sim, e isso vale para todas as outras linhas, gerando todas as equações do sistema ! Claro Mestra, ao multiplicar a 1ª linha da matriz pelo vetor , obtenho exatamente o lado esquerdo da 1ª equação:
  4. Mestre, por quê a resolução de sistemas lineares é um

    problema tão importante em engenharia? Porque, conforme veremos, ela é usada para obter a solução aproximada de muitos outros problemas.
  5. Para começar, Surfista, mostre como você resolveria uma equação do

    1º grau + b = 0, O sistema linear mais simples de todos, apenas uma equação = − com uma incógnita .
  6. = = + Τ − E no caso de =

    0 a reta é paralela ao eixo-x, cortando o eixo-y no ponto = , ou coincidindo com o eixo-x, caso = 0. Geometricamente a solução, = − Τ , é o ponto onde a reta de equação = + corta o eixo-x.
  7. E tirou um zero redondo, Surfista. Seu programa admite a

    divisão por zero e pipoca em seguida:
  8. Ela não só fornece a solução como trata corretamente as

    duas possibilidades de divisão por zero (impossível e indeterminado), Loirinha:
  9. Por exemplo para ≈ 10−7, o que pode ocorrer ?

    Quando é muito pequeno, realmente próximo de zero, a reta definida por = + é praticamente paralela ao eixo-x, isto trará algum problema ?
  10. Fui buscar os limites da IEEE 754/2008 para testarmos o

    programa da Mestra, que usou float32.
  11. Vamos explorar um pouco do que há na scipy.linalg para

    resolução de sistemas de equações lineares via métodos diretos. Depois veremos métodos iterativos.
  12. Os sistemas lineares mais simples de resolver são aqueles cuja

    matriz é diagonal. 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 3 0 0 0 4 0 0 0 5 1 2 3 4 5 = 1 2 3 4 5 Sim, a solução do sistema acima é: 1 2 3 4 5 = 1 /1 2 /2 3 /3 4 /4 5 /5
  13. = 1 0 0 0 0 0 2 0 0

    0 0 0 0 0 0 0 3 0 0 0 4 0 0 0 5 E o determinante de uma matriz diagonal é o produto dos termos da diagonal: det = 1 × 2 × ⋯ × Claro, é só pensar no desenvolvimento por linhas, ou por colunas !
  14. Ele vai detonar uma bomba atômica ! O Torquinho vai

    armar uma bruta confusão com determinantes e sistemas lineares !
  15. Se A é uma matriz ordem n, então det =

    det(). Um sistema linear = possui uma única solução quando, e apenas, quando det() ≠ 0. Os dois teoremas abaixo, são fatos sobejamente conhecidos sobre sistemas lineares e determinantes. Torno a avisar, o Torquinho é traiçoeiro !
  16. 0 ⋮ 0 ⋯ 0 ⋮ ⋱ 0 0 0

    0 1 2 ⋮ = 1 2 ⋮ Para = 0.0001 e 1 = 2 = ⋯ = = 0.001 a solução do sistema linear acima é, obviamente, 1 = 2 = ⋯ = = 10.
  17. Afinal, o determinante é nulo ou não ? E o

    sistema, tem ou não tem solução ?
  18. Observem que, de fato, det = 0.000112 = 10−48 entretanto,

    no programa det _32 = 0.0 e det _64() = 1. −48 ≪ tiny32 Trata-se de um problema de precisão, jovens !
  19. Para a NumPy agora o determinante é zero mesmo !

    Entretanto o sistema tem solução. Ele cumpriu a ameaça !
  20. Observem que det = 0.000184 = 10−336 ≪ tiny64 e

    portanto, no programa, det_ 64 = 0.0 Mas, ainda assim, det > 0 .
  21. Não há o que fazer. Teremos que aprender a lidar

    com a finitude do computador! Quem ele detonou foi a NumPy!
  22. Mestres, tentei melhorar o programa “sistema diagonal”, compararando o vetor

    diag com o vetor nulo e obtive esse erro : Como deveremos proceder ?
  23. A mensagem de erro já traz sua resposta Loirinha: use

    any( ) or all( ) . Mestra, analise a situação.
  24. A B Em: • Em (A) criamos um aviso com

    o valor False; caso algum elemento de diag for nulo, mudamos aviso para True. • Em (B) testamos aviso e mostramos o resultado segundo seu valor. No programa “sistema diagonal” procedemos como na linguagem C:
  25. Com a NumPy trocamos (A) e (B) pelo código abaixo

    usando a função any( ), que é vetorizada ! Conferimos ainda a igualdade com outra função vetorizada, a equal( ).
  26. A rotina equal( ) da numpy e suas irmãs, que

    permitem comparar dois arrays elemento a elemento.
  27. Usei o novo código do Mestre e repeti os dados

    da “explosão do mundo” !
  28. Entretanto, comparar números de ponto flutuante visualmente ou com igualdade

    frequentemente conduz a erros! Mestre, você está procurando cabelos na testa de um ovo!
  29. Quando estudarmos “Algoritmos e estabilidade”, Surfista ! Veremos em breve

    que o computador é uma luneta rapidíssima, mas defeituosa!
  30. Vocês nunca deverão comparar números de ponto flutuante IEEE 754/2008

    visualmente ou via igualdade, mas sim por proximidade!
  31. Mas e com os inteiros ? Com números inteiros você

    pode usar testes de igualdade sem nenhum problema.
  32. Jamais esqueçam a fala do Mestre: Nunca comparem números de

    ponto flutuante IEEE 754/2008 via igualdade! Vamos refazer o exemplo anterior usando as isclose() e allclose().
  33. Eis Escher tentando nos enganar visualmente, a verdade logo em

    seguida, e a comparação por proximidade recuperando o “quase igual”.
  34. Repetindo Surfista: os Mestres compararam dois vetores y e b

    componente a componente, perguntando se elas diferiam por um erro minúsculo ! Exatamente, da ordem de 32 . E isto foi feito com: