Escolar Documentos
Profissional Documentos
Cultura Documentos
11. Interpolação
Helio J. Rocha-Pinto
v.2019/2
OVL232
Razões para interpolar dados
OVL232
Interpolação polinomial I
A interpolação polinomial consiste em obter uma função polinomial
g (x) tal que
g (xj ) : pn (xj ) = f (xj ), ∀xj , j = 0, . . . , n
g (x) será o polinômio de grau ≤ n tal que a condição acima valha.
Por ser um polinômio de grau n, sua forma será
pn (x) = a0 + a1 x + a2 x 2 + . . . + an x n
Assim, devemos obter os coeficientes aj , j = 0, . . . , n. Da condição
acima, temos
a0 + a1 x0 + a2 x02 + . . . + an x0n = f (x0 )
a0 + a1 x1 + a2 x12 + . . . + an x1n = f (x1 )
.. .. .. .. ..
. . . . .
a0 + a1 xn + a2 xn2 + . . . + an xnn = f (xn )
OVL232
Interpolação polinomial II
X ~a ~
fx
z }| { z }| { z }| {
x02 . . . x0n
1 x0 a0 f (x0 )
1 x1 x12 . . . x1n a1 f (x1 )
.. = ..
.. .. .. . . .
. ..
. . . . .
1 xn xn2 . . . xnn an f (xn )
n = len(data)
dados desde que no
formato xy) de um
# construcao da matriz X e vetor fx
for i in range(0,n): arquivo (formatado sob a
linha = []
for j in range(0,n):
forma de colunas)
linha.append(data[i][0]**float(j)) 2 Grafique, via comandos
x.append(linha)
fx.append(data[i][1]) Matplotlib, os pontos
# adaptacao da lista para um array numpy originais a serem
x = array(x)
fx = array(fx)
interpolados e a função
interpoladora.
a = linalg.solve(x,fx)
OVL232
Interpolação de Lagrange I
OVL232
Interpolação de Lagrange II
onde
(x − x0 )(x − x1 ) . . . (x − xk−1 )(x − xk+1 ) . . . (x − xn )
Lk (x) =
(xk − x0 )(xk − x1 ) . . . (xk − xk−1 )(xk − xk+1 ) . . . (xk − xn )
OVL232
Interpolação de Lagrange III
OVL232
Exemplo de interpolação pelo Método de Lagrange
f (x) x −1 0 2
f (x) 4 1 −1
• 4.0 –
p2 (x) = y0 L0 (x) + y1 L1 (x) + y2 L2 (x)
3.0 – y0 L0
(x − x1 )(x − x2 ) x 2 − 2x
2.0 – L0 (x) =
(x0 − x1 )(x0 − x2 )
=
3
y1 L1
1.0 •– p2 (x) (x − x0 )(x − x2 ) x2 − x − 2
L1 (x) = =
(x1 − x0 )(x1 − x2 ) −2
| | | | | x (x − x0 )(x − x1 ) x2 + x
L2 (x) = =
y2 L2 1.0 2.0 3.0 4.0 (x2 − x0 )(x2 − x1 ) 6
• 7 2
p2 (x) = 1 − x + x 2
3 3
OVL232
Interpolação de Lagrange em Python
import numpy as np
import matplotlib.pyplot as plt
plt.plot(xList,yList,’ob’)
plt.xlim(xList.min()-4,xList.max()+4) ; plt.ylim(yList.min()-4,yList.max()+4)
plt.plot(xinterp,yinterp,’r--’) ; plt.show()
def LagrangePol(x,i):
mult = 1
for j in range(n):
if j != i:
mult *= (x - xList[j]) / float(xList[i] - xList[j])
return mult
def Pn(x):
total = 0
for i in range(n):
total += yList[i] * LagrangePol(x,i)
return total
OVL232
Fórmula interpoladora de Newton I
Newton propõe a seguinte fórmula interpoladora:
pn (x) = d0 +d1 (x −x0 )+d2 (x −x0 )(x −x1 )+. . .+dn (x −x0 )(x −x1 ) . . . (x −xn−1 ),
d0 = f [x0 ] = f (x0 )
f [x1 ] − f [x0 ]
d1 = f [x0 , x1 ] =
x1 − x0
f [x1 , x2 ] − f [x0 , x1 ]
d2 = f [x0 , x1 , x2 ] =
x2 − x0
f [x1 , x2 , x3 ] − f [x0 , x1 , x2 ]
d3 = f [x0 , x1 , x2 , x3 ] =
x3 − x0
..
.
f [x1 , x2 , . . . , xn ] − f [x0 , x1 , . . . , xn−1 ]
dn = f [x0 , x1 , . . . , xn ] =
xn − x0
OVL232
Fórmula interpoladora de Newton II
Dizemos que f [x0 , x1 , . . . , xn ] é a diferença dividida de ordem
k da função f (x) sobre os k + 1 pontos x0 , x1 , . . . , xn . Assim,
de posse de n + 1 pares de valores (xi , f (xi )) podemos
construir a tabela
OVL232
Fórmula interpoladora de Newton III
OVL232
Fórmula interpoladora de Newton IV
f [x0 , x] − f [x1 , x0 ]
f [x0 , x1 , x] = f [x1 , x0 , x] =
x − x1
f (x) − f (x0 )
− f [x1 , x0 ]
x − x0
=
x − x1
f (x) − f (x0 ) − (x − x0 )f [x1 , x0 ]
=
(x − x0 )(x − x1 )
Assim
OVL232
Fórmula interpoladora de Newton V
OVL232
Erro de interpolação I
OVL232
Erro de interpolação II
f (n+1) (ξx )
En (x) = f (x) − pn (x) = (x − x0 )(x − x1 ) . . . (x − xn )
(n + 1)!
onde ξx ∈ [x0 , xn ].
Uma vez que não sabemos o valor de ξx , podemos encontrar
um limitante para o erro:
Mn+1
|En (x)| ≤ |(x − x0 )(x − x1 ) . . . (x − xn )| ·
(n + 1)!
onde Mn+1 = max f (n+1) (x), I = [x0 , xn ].
x∈I
OVL232
Erro de interpolação III
f (n+1) (ξx )
= f [x0 , x1 , . . . , xn , x]
(n + 1)!
OVL232
Exemplo de interpolação de Newton I
OVL232
Exemplo de interpolação de Newton II
x Ordem 0 Ordem 1 Ordem 2 Ordem 3
0.2 0.16
0.4286
0.34 0.22 2.0235
0.8333 -17.8963
0.4 0.27 -3.7033
0.1667 18.2494
0.52 0.29 1.0415
0.3750 -2.6031
0.6 0.32 0.2085
0.4167
0.72 0.37
OVL232
Exemplo de interpolação de Newton II
x Ordem 0 Ordem 1 Ordem 2 Ordem 3
0.2 0.16
0.4286
0.34 0.22 2.0235
0.8333 -17.8963
0.4 0.27 -3.7033
0.1667 18.2494
0.52 0.29 1.0415
0.3750 -2.6031
0.6 0.32 0.2085
0.4167
0.72 0.37
OVL232
Exemplo de interpolação de Newton II
OVL232
Recursão na interpolação de Newton
n
P f (xk )
sendo f [x0 , x1 , . . . , xn+1 ] = n
k=0
Q
(xk − xj )
j=0
j6=k
OVL232
Interpolação de Newton em Python
OVL232
Interpolação inversa
Dada a tabela
x x0 x1 x2 · · · xn
f (x) y0 y1 y2 · · · yn
queremos obter qual o valor de x̄ que produz um determinado
ȳ .
Há duas formas de resolver o problema:
1 Obter pn (x) que interpola f (x) em x0 , x1 , . . . , xn e, em
seguida, encontrar x̄ tal que pn (x̄) = ȳ .
2 Se f (x) for inversı́vel no intervalo que contém ȳ , pode-se fazer
a interpolação x = f −1 (y ).
OVL232
Fenômeno de Runge
OVL232
Interpolação por splines
OVL232
Interpolação por splines vs. interpolação polinomial
OVL232
Interpolação por splines via Python I
OVL232
Interpolação por splines via Python II
OVL232