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

Algoritmos e estabilidade

Algoritmos e estabilidade

...

Paulo Bordoni

April 10, 2015
Tweet

More Decks by Paulo Bordoni

Other Decks in Education

Transcript

  1. Números E IEEE 754 Algoritmos e estabilidade Relações E funções

    Problemas e condicionamento No mapa da mina, assinalei em roxo, verde, laranja e azul o que já vimos. Em vermelho o que veremos agora. Operações elementares O mapa da mina Matemática do contínuo
  2. Repito o que já dissemos antes: Algo como uma receita

    de bolo. Um algoritmo é um procedimento passo-a-passo para efetuar cálculos. Uma sequência finita de instruções para resolver um problema Mestra, o que é mesmo um algoritmo?
  3. O algoritmo de Euclides, para calcular o mdc (máximo divisor

    comum) de dois números inteiros, é o mais antigo que se tem notícia na história da humanidade. Ele aparece como a Proposição II do Livro VII dos “Elementos”, de Euclides, 300 aC.
  4. Para seu conhecimento, Loirinha, sua pergunta é uma das mais

    difíceis que a humanidade já se fez, e foi respondida, na década de 30 dos anos 1.900. Uma das respostas é a definição de função computável, dada através de uma máquina de Turing.
  5. Allan M Turing 1912-1954 Este é artigo onde Turing apresenta

    sua forma de entender algoritmos. Ela passou a ser referida como “Máquina de Turing”, por envolver uma descrição mecânica de um algoritmo.
  6. Você pode descobrir mais sobre o conceito de algoritmo e

    outros atores que participaram ativamente do seu estabelecimento no livro:
  7. Loirinha, chamo sua atenção para um “detalhe”: A formalização do

    conceito de algoritmo é anterior ao ENIAC - o 1º computador digital.
  8. • Início do projeto – 1942 • Iniciou atividades –

    1946 • Local - Moore School of Electrical Engineering – Un. da Pensilvânia • Idealizadores - J. P. Eckert e John Mauchly • Tamanho – 5,50 por 24,40 metros • Consumo – 150 Kw • 17.468 válvulas eletrônicas • 70.000 resistências • 10.000 capacitores • 1.500 relés • 6.000 comutadores manuais Alguns dados sobre o ENIAC:
  9. 1 2 3 4 5 6 7 8 Courtesy of

    Michael John Muuss 1. J. P. Eckert 2. J. G Brainerd 3. S. Feltman 4. H. H. Goldstine 5. J.W. Mauchly 6. H. Pender 7. Gen. G. M. Barnes 8. Cor. P. N. Gillon John von Neumann
  10. × f = () Não confundam função com uma expressão

    que permite calculá-la. Podem haver diversas. Por exemplo = ( − 1)2 e = 2 − 2 + 1.
  11. Nada a ver, ( − 1)2 = 2 − 2

    + 1, é uma identidade! Apressadinho! Do lado esquerdo 2 operações elementares, do lado direito 4. O dobro!
  12. Calma Surfista, você verá que a fala do Filósofo faz

    sentido. O valor = () de uma função : → pode ser calculado de diversas formas. Cada uma estabelece um algoritmo para calcular y em ∈ .
  13. f Y f 1 X f n Y 1 X

    2 X n Y n-1 Qualquer função computável : → é computada através de uma sucessão finita de operações elementares. Incluindo as do IEEE 754. Diagramaticamente:
  14. Então, Loirinha: Um algoritmo é, essencialmente, uma descrição dessa cadeia

    finita de funções elementares (incluindo aí comparações, e decisões lógicas) para computar uma outra função. Esta ideia independe do IEEE 754. Um algoritmo nada mais é que uma composição de operações elementares ∘ ⋅⋅⋅ ∘ 2 ∘ 1 = que computam uma função f associada ao problema.
  15. Pois é Surfista, você está cansado de saber que (

    − 1)3= 3 − 32 + 3 − 1. Claro, Mestre, a igualdade é pela expansão do binômio de Newton!
  16. 0 1 2 3 4 5 6 7 0 1

    - - - - - - - 1 1 1 - - - - - - 2 1 2 1 - - - - - 3 1 3 3 1 - - - 4 1 4 6 4 1 - - 5 1 5 10 10 5 1 - 6 1 6 15 20 15 6 1 7 - - - É, no 2º grau você deve ter visto que os coeficientes do binômio de Newton podem ser calculados, por recorrência, pelo esquema indicado abaixo. Sim, Mestra e com ele obtenho: ( + )3 = 3 + 32 + 32 + 3
  17. Portanto você concorda que = ( − 1)5 e =

    5 + −54 + 103 − 102 + 5 − 1 representam funções iguais, só os algoritmos são diferentes. Claro, Mestre, pelo do binômio de Newton temos = , ∀ ∈ ℝ.
  18. Há duas lições a aprender com este exemplo, Surfista. A

    1ª delas é que algoritmos distintos para resolver o mesmo problema podem conduzir a resultados computacionais diferentes.
  19. É, o algoritmo que gera o gráfico em vermelho não

    é estável. Ele envolve muitas operações elementares e alguma delas é mau condicionada.
  20. Como 2ª lição de hoje, Surfista: Não exija além das

    possibilidades do IEEE 754. Volte lá nos dois gráfico e atente para a escala vertical do 1º e a do 2º.
  21. “Forcei a barra” com d_t = 0.001. Veja o desastre!

    A escala vertical está no limite da precisão double.
  22. O desastre só aconteceu devido à aritmética finita do IEEE

    754. Insisto Mestre, ambos resultam na mesma função = ( − 1)5 = = 5 + −54 +103 − 102 + 5 − 1
  23. No estudo de algoritmos, o 1º aspecto a considerar é

    o número de operações elementares utilizadas pelo algoritmo.
  24. Quando dois algoritmos resolvem o mesmo problema, em princípio devemos

    escolher o mais rápido. Se é o tempo para efetuar a operação e para efetuar a operação deveremos comparar =1 ( ) com =1 ( ) .
  25. Mas outros tempos computacionais devem ser considerados para decidir. Por

    exemplo, o tempo gasto para buscar dados em armazenamento secundário (do HD para a RAM). A menor delas deve fornecer o algoritmo mais rápido.
  26. Surfista, no 2º grau você aprendeu a utilizar o algoritmo

    de Briot-Rufini-Horner? Aprendi sim, Mestre. Só não entendi prá que serve!
  27. Um exemplo típico de analfabetismo funcional... É o algoritmo mais

    rápido para calcular o valor de uma função polinomial num ponto = 0 .
  28. 1 4 -7 3 -5 - 2×1 2×6 2×5 2×13

    1 2+4 12-7 10+3 26-5 2 x + Surfista, deu certinho, 2 = 21 ! Mas eu lembro que, para calcular o valor da polinomial = 4 + 43 − 72 + 3 − 5, em = 2 usávamos o seguinte esquema:
  29. 2 x O algoritmo é extendido, da mesma forma, para

    calcular o valor das derivadas 1ª, 2ª, ... da polinomial num ponto = 0 . Vejam: 1 4 -7 3 -5 - 2 12 10 26 1 6 5 13 21 - 2 16 42 1 8 21 55 - 2 20 1 10 41 2 x 2 x (2) (2) 2(2)
  30. Certo Loirinha, e no caso geral de = 4 4

    + 3 3 + 2 2 + 1 + 0 os cálculos ficam {[(4 0 + 3 )0 + 2 ]0 + 1 }0 + 0 Deu 21 porque as contas do esquema foram as seguintes: 1 × 2 + 4 × 2 − 7 × 2 + 3 × 2 − 5
  31. A descrição, passo a passo do esquema (algoritmo) usado é

    a seguinte: Entre com os coeficientes 4 , 3 , 2 , 1 , 0 da polinomial e com 0 . 1º passo Defina 4 = 4 2º passo Para = 3,2,1,0 calcule = +1 0 + 3º passo
  32. • 4 = 4 • 3 = 4 0 +

    3 • 2 = 3 0 + 2 • 1 = 2 0 + 1 • 0 = 1 0 + 0 Confira Surfista que os cálculos efetuados com o algoritmo foram os dessa caixinha. Vou implementar o algoritmo. Vai ser mais rápido! No cálculo direto são 10 multiplicações e 4 adições e o Briot precisa só de 4 adições e 4 multiplicações.
  33. No estudo de algoritmos, o 2º aspecto a considerar é

    a estabilidade de cada operação elementar utilizada pelo algoritmo.
  34. Perante a matemática finita do IEEE 754 o que distingue

    dois algoritmos para resolver um problema associado a uma função f são composições diferentes: = ∘ ⋅⋅⋅ ∘ 2 ∘ 1 e = ∘ ⋅⋅⋅ ∘ 2 ∘ 1 Obviamente: Cada algoritmo poderá envolver uma quantidade diferente de operações elementares! 1º Cada operação elementar possui a sua sensibilidade – seu número de condicionamento! 2º
  35. O 2º aspecto só aparece porque não vale o axioma

    de existência do supremo na representação de ponto flutuante do IEEE 754. É alguns algoritmos serão estáveis. Outros não.
  36. Sim Loirinha, como vimos no exemplo gráfico da função ↦

    ( − 1)5 , compostas = ∘ ⋅⋅⋅ ∘ 2 ∘ 1 e = ∘ ⋅⋅⋅ ∘ 2 ∘ 1 podem responder de forma diferente face à propagação de erros do IEEE 754. Estabilidade?!
  37. A f pode ser ser bem ou mau condicionada. Idem

    para cada uma das operações elementares e . Cada uma pode ser bem ou mau condicionada. Pois é Loirinha, lembre-se que: tanto a f como cada operação elementar e cada possui seu número de condicionamento.
  38. f Y X Y 1 f 1 X 2 Uma

    situação altamente indesejável é a f ser bem condicionada, mas uma das operações elementares (ou ) ser mau condicionada. Então o algoritmo será instável. f n X n Y n-1
  39. Podemos ter problemas no cálculo (algoritmo!) da hipotenusa. Algo tão

    simples como o teorema de Pitágoras. a b c = 2 + 2
  40. Como? Veja no código, no algoritmo novo: • Antes de

    elevar ao quadrado cada componente do vetor X calculei = max(). • Depois montei o vetor = /. Os elementos de Y satisfazem | | ≤ 1. Logo, elevá-los ao quadrado e somá-los não causará “overflow”.
  41. Quem quiser mais detalhes sobre este, e outros problemas, leia

    o artigo abaixo, que está no site do Mestre.
  42. Será instrutivo examinar alguns exemplos simples. De erros causados por

    assumir que algoritmos distintos, que resolvem o mesmo problema, conduzem à mesma solução computacional.
  43. Pois é Filósofo, algo simplérrimo. Mas são dois algoritmos distintos.

    A ordem das parcelas não altera a soma: + + = + ( + ).
  44. A lei do cancelamento, na adição, está escondida na sequência

    de propriedades: 1. Associatividade, 2. Definição de oposto, 3. Existência do neutro. Como diria o Sherlock: “Elementar meu caro Watson, elementar”: + − = + − = + 0 =
  45. Neste programa, eu sorteio valores para e y no intervalo

    (0, 1), testo a lei do cancelamento. No caso de falha, emito uma mensagem e mostro os resultados.
  46. Você já ouviu falar que: “De grão em grão, a

    galinha enche o papo” Ah, Mestra, não acontece sempre. Quando aparecem são errinhos minúsculos, lá na última casa!
  47. Mestra, uma situação assim, com milhares de repetições, não acontece

    na prática. O erro cresceu porque você forçou a barra! Veja como deixei ela feliz!
  48. Não é a mesma coisa, mas repeti seu programa para

    = 100 × 60 × 60 × 10 = 3.600.000
  49. A ordem dos fatores não altera o produto: ∗ ∗

    = ∗ ( ∗ ). Apesar da igualdade, como na adição, são dois algoritmos distintos, que podem conduzir a resultados diferentes!
  50. Mestra, é isso mesmo! Meu programa mostra que pode ocorrer

    erro na associatividade da multiplicação.
  51. No estudo de algoritmos, o 2º aspecto a considerar é

    a estabilidade de cada operação elementar utilizada pelo algoritmo.
  52. O Sherlock está se referindo a subentendidos do tipo 235.0

    = 235 Meu caro Watson Surfista, você poderá ser gravemente punido ao fazer conversões ingênuas, do tipo ⟷
  53. Na próxima transparência, mostro um 3º exemplo de erro, que

    causou um prejuízo enorme. Apesar de que, nesse caso, o erro foi na utilização do Método dos Elementos Finitos. De qualquer forma, um erro de Cálculo Numérico.
  54. Uma questão fundamental na Análise Numérica é a sensibilidade da

    solução aos dados do problema. A solução é calculada pela implementação de algoritmos no computador (IEEE 754). Como vimos alguns algoritmos são estáveis e outros instáveis.
  55. Y X Vamos analisar um problema (direto) definido por uma

    função : → que, para um ∈ dado, associa um único = ∈ , via ↦ = ∈ . f
  56. Y X É de fundamental importância entender que usaremos um

    algoritmo ∗ = ∘ ⋯ ∘ 1 ∘ 0 para calcular a solução. Então obteremos ∗ = ∗() ∈ e, normalmente, ∗ ≠ . f ∗ = ∘ ⋯ ∘ 1 ∘ 0 ∗
  57. X X Usualmente a 1ª operação da composta, a 0

    , é a operação de entrada de dados no computador, 0 = , isto é: ↦ ∗ = (). 0 = ∗ E, já vimos que ∗ = () com − ∗ < ().
  58. Y X f ∗ = ∘ ⋯ ∘ 1 ∗

    ∗ ∆ ∆ Poderá ser vantajoso pensar num caso mais geral em que ∗ é uma perturbação de com ∆ = − ∗ . Então ∗ = ∗(∗) será o valor calculado pelo algoritmo ∗ = ∘ ⋯ ∘ 1 em ∗.e queremos estimar ∆ = − ∗ . Aqui cabem parênteses. Uma observação deveras importante!
  59. Mas por que, Mestre? Por que, em muitas situações, o

    valor ∗ proveio de outros cálculos já realizados por algum outro algoritmo.
  60. ∆ ∗ ∗ = ∗() = () f Forward error

    Mas, voltando à situação inicial, o erro direto (forward error), é o erro ao calcular a solução para o dado (input) pelo algoritmo: ∆ = − ∗ = − ∗(∗) Solução do problema Solução calculada pelo algoritmo
  61. Para a aproximação ∗ = 1.41 obtida ao calcular =

    2, por um determinado algoritmo, o erro direto (forward) é |∆| = ∗ − | = |1.41 − 1.41421 … ≅ 0.00421 … O problema em avaliar o erro forward é que a solução exata (no caso = 2) usualmente é desconhecida.
  62. Claro Mestre! E é para isto que usamos o computador,

    onde o algoritmo foi implementado. E fornece uma aproximação com ~7 casas decimais no caso de float32. Portanto, calcular o erro forward é algo apenas teórico. Como faremos na prática?
  63. Wilkinson, no final dos anos 1950, bolou uma forma ingênua

    de contornar o problema: Descobrir qual aproximação de fornece o valor ∗ = ∗(∗) calculado pelo algoritmo e medir ∆ = − . Aproximação a descobrir f ( ) é a solução exata na aproximação . A solução exata do problema = () A solução calculada pelo algoritmo ∗ = ∗()
  64. 2 1.414 Como a inversa de ↦ é ↦ 2,

    calcule 1.4142 = 1.999396. Então o erro backward será ∆ = 2 − 1.999396 = 0.000604 1.999396 2 Mestre usei um algoritmo para calcular 2 e obtive 2 ≅ 1.414. Como calculo o erro backward?
  65. Sim, é o conhecimento de (solução do problema inverso) que

    permite calcular ∆ = − , o erro reverso (backward error) do algoritmo ∗ em . ∗ f A solução exata do problema Aproximação a descobrir −1 Solução exata na aproximação . A solução calculada pelo algoritmo ∆ Backward error
  66. E quando o erro reverso é pequeno, o algoritmo é

    backward estável. Quando o erro direto é pequeno, o algoritmo é forward estável.
  67. Um algoritmo ∗ para calcular a solução de um problema

    f num ponto ∈ é estável quando existe ∈ tal que os erros backward, ∆, e forward, ∆, são pequenos. ∆ f ∗ ∆ ∗() ( ) Backward error Forward error
  68. Em outras palavras quando, para cada ∈ a solução calculada

    com o algoritmo, (), é uma boa aproximação (∆ é pequeno) para a solução ( ) de um problema aproximado (∆ é pequeno). ∆ f ∆ = () = ( ) Solução calculada com o algoritmo Solução do problema aproximado
  69. f Y X ( ) () f ∆x () Se

    um problema f é bem condicionado e um algoritmo para calcular a solução é estável poderemos garantir que a solução computada () e a solução real () estarão próximas. Problema bem condicionado Algoritmo estável
  70. Mestres, se entendi bem, na prática são dois passos: 1.

    Garantir que o problema é bem condicionado; 2. Usar um algoritmo estável para calcular a solução. Exatamente, Surfista. Então você terá certeza que a solução computada estará próxima da solução real.
  71. Como garantir a estabilidade? Não tenho a mínima ideia, Mestra!

    A 1ª parte é fácil. Achar o número de condicionamento envolve apenas uns cálculos de derivada.
  72. Como vimos, são três as possibilidades, Loirinha: • forward •

    backward • total. Mostrarei um exemplo de análise do erro forward.
  73. Considere o problema de calcular o valor de = 1

    + − 1 para próximo de 0. Vamos considerar o algoritmo natural, descrito pela composição = 3 ∘ 2 ∘ 1 na qual: • 1 = 1 + , para próximo de 0, • 2 = , para próximo de 1, • 3 = 1 − , para próximo de 1.
  74. De cara precisamos saber se o problema é bem ou

    mal condicionado em = 0. Temos = 1 2 1 + de forma que: • , = 1/2 1 + , • , = ( 1 + + 1) 2 1 + . Logo o problema é bem condicionado em = 0: • , 0 = 1/2, • , 0 = 1.
  75. ∆ = () = () f 0 Forward error Solução

    do problema Solução calculada pelo algoritmo = 3 ∘ 2 ∘ 1 Para estimar o erro forward, precisamos saber do condicionamento relativo das 1 , 2 , 3 .
  76. E os números de condicionamento relativo são calculados a partir

    de: • 1 , = (1 + ), em = 0, • 2 , = 1/2, em = 1, • 3 , = (1 − ), em = 1. As derivadas são: • 1 = 1, para = 0, • 2 = 1/2 , para = 1, • 3 = −1, para = 1.
  77. A conclusão é que o algoritmo é forward instável, pois:

    • 1 é bem condicionada em = 0, • 2 é bem condicionada em = 1, • Entretanto 3 é mal condicionada em = 1 pois lim →1 3 , = +∞.
  78. Como o problema é bem condicionado existem algoritmos estáveis para

    calcular a solução. Um outro algoritmo (estável) para calcular f é obtido da identidade = 1 + − 1 = ( 1 + − 1)( 1 + + 1) 1 + + 1 = /( 1 + + 1).
  79. Lembrem-se: um algoritmo para calcular a solução de um problema

    f é “backward “ estável quando “calcula de forma exata a solução de um problema aproximado” Ah Mestre, como eu faço uma análise do erro backward?
  80. Surfista, a ideia a perseguir é: ”A solução calculada (com

    o algoritmo) é a solução exata de um problema aproximado”. A análise backward objetiva explicar o erro do algoritmo quantificando o erro nos dados.
  81. O erro backward é mais fácil de estimar que o

    erro forward. Mais adiante, no curso, veremos alguns exemplos. A solução obtida com o algoritmo é boa quando é a solução exata de um problema aproximado!