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

Interpolação unidimensional por partes e splines

4acc58a03aa964e2f04b538836f2d468?s=47 Paulo Bordoni
December 04, 2013

Interpolação unidimensional por partes e splines

Iniciamos com o espaço das funções contínuas e lineares por partes e a base de funções chapéu (de bruxa). Depois analisamos as funções contínuas e quadráticas por partes, com sua base de funções chapéu coco (de Charlie Chaplin). Em seguida olhamos para interpolação de Hermite e usamos os métodos interp1d( ) e a classe PiecewisePolynomial da scipy.interpolate. Encerramos com splines interpoladores para funções reais a valores reais e curvas no plano.

4acc58a03aa964e2f04b538836f2d468?s=128

Paulo Bordoni

December 04, 2013
Tweet

Transcript

  1. Interpolação unidimensional por partes e splines Prof. Paulo R. G.

    Bordoni UFRJ
  2. Iniciamos revendo o exemplo do fenômeno de Runge, no qual

    o erro cresceu assustadoramente com o grau. O erro disparou nos extremos!
  3. DIVIDIR PARA CONQUISTAR! Troquem um gigante por muitos anões! E

    aí Mestres, como faremos para matar esse leão?
  4. A ideia é muito simples: 1. Dividimos o intervalo [,

    ] em vários subintervalos. 2. Em cada sub-intervalo usamos uma polinomial de grau baixo. Dividir para conquistar é um mantra da computação.
  5. Troquei o gigante por 5 anões. Melhorou muito nos extremos,

    mas piorou um pouco no centro. Poucos anões!
  6. Sim, quanto mais anões, melhor:

  7. Foi uma das primeiras lições que aprendemos na MatPlotLib. Lembro-me

    perfeitamente!
  8. Com mais de 50 pontos as curvas ficam suaves.

  9. Passaremos a analisar uma classe de espaços vetoriais importantíssima em

    teoria de aproximação.
  10. Um desses espaços é o ℒ( , ). ℒ ,

    é o subespaço de , constituído pelas funções que são lineares em cada sub-intervalo de uma partição [, ] = { = 0 < 1 < ⋯ < = } do intervalo [, ].
  11. Veja a cara de uma função do espaço ℒ(9 0,2

    ) no qual 9 0,2 = {0. , 0.25, 0.5, 0.75, 1. , 1.25, 1.5, 1.75, 2. }
  12. O programa que produziu esse gráfico. Em vermelho a função

    da scipy.interpolate que gera a interpoladora. Já, já vamos estudá-la.
  13. Todo espaco vetorial tem, ao menos, uma base. Mostre-nos uma

    base desse espaco, Mestra. Ah, minha filha, é uma coleção de chapéus de bruxa!.
  14. Chapeus de bruxa, Mestra? Amei! Sim Loirinha. A base canônica

    de ℒ( , ) e’ a colecao ℋ = {ℎ0 , ℎ1 , … , ℎ } constituída pelas N+1 “hat functions” que vou te mostrar na próxima transparência.
  15. ℎ3 3 1 As funções chapéu, “hat functions”, formam uma

    base para esse espaço.
  16. 3 1 4 3 4 Nesta figura mostro uma combinação

    linear de duas delas: = 3 ℎ3 + 4 ℎ4
  17. Você sabe porque o chamei aqui, Mr. Charlie Chaplin? Sei

    sim, Mestre. Para mostrar meu chapéu coco!
  18. Eu explico, Surfista. Chapéus de bruxa são pontudos, mas chapéus

    coco são arredondados – como parábolas. E dá para explicar porque, Mr. Chaplin?
  19. Faremos interpolações quadráticas por partes em subintervalos sucessivos definidos por

    ternas de pontos de uma partição [, ] = { = 0 < 1 < ⋯ < = } de , .
  20. O programa que faz o gráfico das interpoladoras quadráticas.

  21. Anotaremos o espaço de funções quadráticas por partes por (

    , ). , e’ o subespaço de , constituído pelas funções que são quadráticas em cada sub-intervalo de uma partição [, ] = { = 0 < 1 < ⋯ < = } do intervalo [, ].
  22. Saquei Mestre! As funções básicas agora serão como chapéus coco.

    2 2 1 1
  23. Observem a grande melhoria na aproximação por polinomiais quadráticas por

    partes com relação à brincadeira de trocar um gigante por vários anões. Incrível, é a mesma função do leão!
  24. O programa da interpolação quadrática por partes. Ele é uma

    pequena modificação do anterior.
  25. A continuação do programa.

  26. Vamos começar com a interpolação polinomial por partes de Lagrange

    e de Hermite.
  27. Mestres, vamos ver o que há mais na scipy.interpolate!

  28. Assinalei outros dois métodos disponibilizados pela scipy.interpolate:

  29. Um deles.

  30. E o outro: a classe PiecewisePolynomial.

  31. p() q() 2 2 3 1 Na interpolação polinomial por

    partes, de Lagrange, a única exigência é a continuidade da interpolação. No gráfico: 2 = 2 = (2 ).
  32. p() q() 2 2 3 1 Observem que, no extremo

    comum, (2 , 2 ), a “colagem” entre p e q não é suave. Matematicamente (2 ) ≠ (2 ). Ondas abruptas, mas surfistas com curvas suaves...
  33. p() q() 2 2 3 1 A imposição da condição

    2 = 2 suaviza a colagem, pois obriga a coincidência das retas tangentes. A interpolação polinomial por partes, de Hermite, exige, em cada ponto, a igualdade tanto do valor da função, como do valor da derivada da função. O dobro de condições.
  34. Para efetuar a interpolação de com o método ( )

    o parâmetro é um array unidimensional com tamanho n, o número de pontos da partição do − . Já o parâmetro é um array bidimensional, com tamanho n x k, com ≥ 2. Para interpolar uma função f, o parâmetro será constituído por n pares , . Entretanto poderiam ser dois valores quaisquer.
  35. A interpolação de Hermite. O programa a seguir sorteia 7

    pontos e 7 direções tangentes e constrói a interpoladora.
  36. O parâmetro “orders” é mandatário com relação à condição de

    tangência. Sim, basta conferir os graus e os gráficos das polinomiais em cada sub-intervalo.
  37. O programa que traçou o gráfico da transparência anterior .

  38. = = 3 O default = é uma polinomial de

    grau 3 em cada sub-intervalo.
  39. Repetindo, quando não especificamos o parâmetro orders, ele assume o

    valor 3. Em outras palavras, as polinomiais são de grau 3 em cada sub-intervalo.
  40. O programa que traça o gráfico da função e da

    interpoladora, com = 3.
  41. É só usar = 0. A interpoladora constante por partes

    usando a função ( ) do pacote interpolate da SciPy.
  42. Agora usando = 1 temos a interpolação linear por partes.

  43. Com = 2 temos interpolação quadrática em cada sub-intervalo. Neste

    caso a tangência só ocorre no extremo direito de cada subintervalo.
  44. A interpolação de Hermite Especificando o parâmetro = 3 ou

    deixando = .
  45. p() q() 2 2 3 1 A imposição da condição

    ′′ 2 = ′′ 2 obriga a mesma curvatura local para as duas curvas p e q que possuem o ponto (2 , 2 ) em comum. A curvatura local é o inverso do raio da circunferência osculadora – procure um livro de computação gráfica para mais detalhes. Observação
  46. Para usar = 4 precisamos fornecer também as derivadas 2ªs.

    A polinomial, sua derivada e sua derivada 2ª são iguais em cada nó.
  47. Observe que agora são 3n condições para n pontos. Neste

    exemplo 12.
  48. Agora vamos examinar outro tipo de interpolação polinomial por partes,

    conhecido como “splines”.
  49. p() q() 2 2 3 1 Observem que, no extremo

    comum, (2 , 2 ), a “colagem” entre p e q não é suave. Matematicamente temos ′(2 ) ≠ ′(2 ). Na interpolação polinomial por partes, de Lagrange, a única exigência é a continuidade na "colagem” das interpoladoras p e q. No gráfico: 2 = 2 = (2 ).
  50. p() q() 2 2 3 1 A imposição da condição

    ′ 2 = ′ 2 suaviza a colagem, pois obriga a coincidência das retas tangentes. Já vimos que a interpolação por partes, de Hermite, exige, em cada ponto, a igualdade tanto do valor da função, como do valor da derivada da função. O dobro de condições.
  51. p() q() 2 2 3 1 A imposição da condição

    ′′ 2 = ′′ 2 obriga a mesma curvatura local para as duas curvas. Nessa interpolação por partes de Hermite, são necessárias 3n informações para interpolar n pontos.
  52. A interpolação polinomial spline, é obtida “forçando a barra”. Uma

    régua “spline”, muito usada antigamente (antes da computação gráfica) por desenhistas, projetistas e arquitetos para traçar curvas suaves.
  53. Já explico. Suponha que pretendemos interpolar uma função ∶ ,

    → ℝ usando uma spline () constituída por polinomiais quadráticas em cada subintervalo em cada um dos 4 subintervalos definidos pela partição = 0 < 1 < 2 < 3 < 4 = () 1 2 0 3 4 Como assim?
  54. 1 2 0 3 4 2 1 3 4 Assim,

    nossa spline () será constituída por 4 polinomiais de grau 2: 1 = 0 + 1 + 2 2, 2 = 0 + 1 + 2 2, 3 = 0 + 1 + 2 2, 4 = 0 + 1 + 2 2. Ao todo 4 × 3 = 12 coeficientes a determinar.
  55. () 1 2 0 3 4 1 2 0 3

    4 Para aliviar a notação, vou escrever (0 ) = 0 , (1 ) = 1 , (2 ) = 2 , (3 ) = 3 , (4 ) = 4 , como mostro na figura.
  56. Como queremos que spline () interpole a função f, teremos

    8 condições (8 equações lineares) para as 12 incógnitas. Nelas já estão incluídas 3 condições de continuidade da spline () nos nós internos 1 2 0 3 4 1 2 3 4 1 2 0 3 4 1 0 = 0 1 1 = 1 2 1 = 2 2 2 = 2 , 3 2 = 2 , 3 3 = 3 , 4 3 = 3 , 4 4 = 4 . 8 equações
  57. 1 2 3 4 E a continuidade para as derivadas

    da interpoladora nos nós internos fornece outras três. 1 2 0 3 4 1 ′ (1 ) = 2 ′ (1 ) 2 ′ (2 ) = 3 ′ (2 ) 3 ′ (3 ) = 4 ′ (3 )
  58. Ao todo temos 11 condições para determinar as 12 incógnitas

    0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 . Falta uma condição, que pode ser escolhida impondo uma condição sobre o valor da derivada da última polinomial 4 () no ponto 4 = . Por exemplo, 4 ′′ 4 = 0.
  59. Então é só resolver o sistema linear para obter a

    spline interpoladora.
  60. Seja () uma função definida num intervalo [, ]. Uma

    função () é um spline de grau p, com nós nos pontos = 0 , < 1 , < ⋯ < = , quando satisfaz as condições: • Em cada subintervalo , +1 é uma polinomial de grau p, • () é de classe −1 , . () é um spline interpolante quando, além dessas duas condições, satisfaz também: • = , = 0,1, ⋯ , . A definição geral de “spline”. Acabamos de detalhar a construção de um spline quadrático.:
  61. Uma “spline” cúbica interpolante: É uma função : [, ]

    → ℝ, de classe 2[, ] que, restrita a cada subintervalo , +1 , = 1,2, ⋯ , é uma polinomial de grau 3. De forma mais explícita, ela satisfaz: 1) = () para ∈ . +1 , k = 1,2, ⋯ , 2) = , = 1,2, ⋯ , 3) = +1 , = 1,2, ⋯ , − 1 4) ′ = ′+1 , = 1,2, ⋯ , − 1 5) ′′ = ′′+1 , = 1,2, ⋯ , − 1
  62. O classe interp1d ...

  63. O parâmetro kind permite escolhermos interpolação constante, linear, quadrática e

    cúbica por partes.
  64. O resto dos parâmetros. Observem a indicação de outro método,

    mais recente.
  65. Duas polinomiais do 2º grau (5 pontos).

  66. Note que com 3 polinomiais do 2º grau (7 pontos),

    já temos uma aproximação razoável.
  67. Com 5 polinomiais do 2º grau (9 pontos), a aproximação

    já é muito boa.
  68. Esse é o código do programa. Marquei em vermelho as

    linhas de código envolvidas na definição da polinomial quadrática por partes.
  69. Usando 2 polinomiais cúbicas, verificamos que o erro já é

    muito pequeno. O código é muito parecido.
  70. Usando 3 polinomiais cúbicas, já não distinguimos, visualmente, a função

    da interpoladora por partes!
  71. Agora vamos usar a classe dos splines da scipy.

  72. Mais detalhes, que usaremos agora!

  73. Esta função retorna a representação tck da spline cúbica (default).

  74. Esta função avalia a spline representada por tck no array

    x.
  75. Os gráficos da função = 2 e da spline cúbica

    passando por pontos escolhidos.
  76. O programa. Marquei em vermelho as linhas de código envolvidas

    na definição e na avaliação da spline.
  77. O parâmetro der da função splev( ) permite mostrar a

    derivada 1ª ou 2ª da spline interpolante.
  78. O código do programa. Observe as chamadas a splev( )

  79. A spline cúbica paramétrica, para curvas definidas parametricamente no plano

    x-y, p/ex.
  80. A interpolação da borboleta com uma spline cúbica paramétrica.

  81. Vejam, são necessários mais pontos para melhorar a precisão:

  82. Este é o programa que interpola a borboleta.

  83. Para interpolar a espiral de Arquimedes, basta mudar a definição

    da curva paramétrica!
  84. Com 20 pontos a interpolação com a spline paramétrica já

    está boa:
  85. Tchau! Até a próxima.