Interpolação Polinomial

Prof. Doherty Andrade –\url{www.metodosnumericos.com.br}

\section{Interpolação}
Suponha que temos $(n+1)$ pontos distintos $x_0,x_1,\ldots, x_n$,
chamados de nós, e que os pontos $y_0, y_1, \ldots, y_n$ foram
obtidos por meio de alguma função $f$ que é desconhecida ou é
difícil de manusear algebricamente, isto é, $y_i=f(x_i),
i=0,1,\ldots, n$. Queremos estimar $f(x_r)$ para algum
valor $x_r$ não tabelado. Podemos fazer isto interpolando $f$ por
uma função polinomial $g$.

Vamos tratar aqui apenas de interpolação polinomial.

Antes de continuarmos, apenas dois comentários. Poderíamos pensar
no polinômio de Taylor como uma aproximação para a função, mas o
polinômio de Taylor aproxima $f(x)$ em torno de um ponto $x=a$,
fora daí a aproximação não é boa.

É natural esperar que um tal polinômio interpolador exista, pois o Teorema \ref{weierstrass} garante que toda função contínua pode ser uniformemente aproximada por um polinômio.
\begin{thm}[Aproximação de Weierstrass]\label{weierstrass}
Seja $f:[a,b]\rightarrow \mathbb{R}$ uma função contínua e $\epsilon >0$. Então, existe um polinômio $p(x)$ com a seguinte propriedade
$$|f(x)-p(x)|< \epsilon, \mbox{ para todo } x \in [a,b].$$
\end{thm}

\section{Existência do polinômio interpolador}

Suponha que temos $(n+1)$ pontos distintos $x_0,x_1,\ldots, x_n$ e
os $n+1$ pontos $(x_0,f(x_0)),(x_1,f(x_1)),\ldots,
(x_n,f(x_n))$. Queremos determinar uma função polinomial $p_n(x)$
de grau máximo $n$ que satisfaça

\begin{equation}\label{interp1}
f(x_i)= p_n(x_i),i=0,1,\ldots,n.
\end{equation}

Como $p_n(x)$ tem a forma
$$p_n(x)= a_nx^n+a_{n-1}x^{n-1}+ \cdots + a_1x +a_0,$$
então \eqref{interp1} se transforma em

\begin{matrix}a_nx_0^n+a_{n-1}x_0^{n-1}+ \cdots + a_0&=0&\\a_nx_1^n+a_{n-1}x_1^{n-1}+ \cdots + a_0&=0&\\a_nx_2^n+a_{n-1}x_2^{n-1}+ \cdots + a_0&=0&\\ \vdots \qquad\qquad\qquad\qquad\qquad \qquad \vdots& = &\vdots \\a_nx_n^n+a_{n-1}x_n^{n-1}+ \cdots + a_1x_n +a_0 &=& f(x_n)\end{matrix}

Escrevendo o sistema acima na forma matricial $Ax=b$, em que
\begin{bmatrix}
1 & x_0 & x_0^2 & \ldots & x_0^n \\
1 & x_1 & x_1^2 & \ldots & x_1^n \\
\vdots & \vdots & \vdots & \cdots & \vdots \\
1 & x_n & x_n^2 & \ldots & x_n^n \\
\end{bmatrix}

\begin{bmatrix}a_0\\a_1\\ \vdots \\ a_n \end{bmatrix}

e

\begin{bmatrix}
f(x_0) \\f(x_1)\\
\vdots \\f(x_n)
\end{bmatrix}

Notemos que $\det A \neq 0$, pois os pontos $x_0,x_1,\ldots, x_n$
são distintos e $A$ é uma matriz de Vandermonde.

Assim, o sistema linear admite uma única solução $a_0, a_1,\ldots, a_n$. Isto é, existe um único polinômio $p_n(x)= a_nx^n+ a_{n-1}x^{n-1}+ \cdots a_1x+a_0$ de grau máximo $n$ que interpola $f$.

Podemos então enunciar o seguinte resultado:
\begin{thm}Dados $x_0,x_1,\ldots, x_n$ pontos distintos existe
um único polinômio $p_n(x)$ de grau máximo $n$ que interpola $f$
nos pontos $(x_i,f(x_i)),i=0,\ldots, n.$
\end{thm}

\section{Como obter o polinômio interpolador?}
Como vimos na seção anterior, já temos um método para determinar o
polinômio interpolador: basta resolver o sistema de equações
lineares \eqref{interp1}. Existem outros métodos, mais simples, de
obter o polinômio interpolador:

1i) O método de Lagrange,

2i) O método de Newton.

\subsection{O Método de Lagrange}
Consideremos dados $(n+1)$ pontos distintos $x_0,x_1,\ldots, x_n$
e $y_i=f(x_i), i=0,1,\ldots, n$. Para cada $k=0,1,\ldots, n$
sejam
$$L_k(x)= \frac{(x-x_0)(x-x_1)\ldots (x-x_{k-1})(x-x_{k+1})\ldots (x-x_n)}
{(x_k-x_0)(x_k-x_1)\ldots (x_k-x_{k-1})(x_k-x_{k+1})\ldots
(x_k-x_n)}.$$

Ou resumidamente,
\begin{equation} \displaystyle
L_k(x)= \prod_{i=0,i\neq k}^n\frac{x-x_i}{x_k-x_i},
k=0,1,\ldots,n.\end{equation}

É fácil observar que

(1i) $L_k(x_k)=1$,

(2i) $L_k(x_j)=0$, se $j \neq k$,

(3i) $L_k(x)$ é um polinômio de grau $n$.

Seja $p_n(x)$ o polinômio dado por
\begin{equation} p_n(x)= y_0L_0(x)+y_1L_1(x)+ \dots + y_nL_n(x). \end{equation}

Podemos verificar que $p_n(x)$ satisfaz $p_n(x_i)= y_i,
i=0,1,\ldots, n,$ isto é, $p_n(x)$ é um polinômio que interpola
$f$ nos pontos $x_i$. Como o polinômio interpolador é único, segue
que este é o polinômio interpolador.

Resumindo temos o seguinte teorema:
\begin{thm}[Lagrange]Sejam $x_0,x_1,\ldots, x_n$ pontos distintos e
$y_i=f(x_i),i=0,1,\ldots,n$ dados. Então, existe um polinômio
$p_n(x)$ de grau $\leq n$ que interpola $f$ nesses pontos. Além
disso, $p_n(x)$ é dado por
$$\displaystyle p_n(x)= y_0L_0(x) + y_1L_1(x)+
\dots + y_nL_n(x),$$ onde
$$L_k(x)= \prod_{i=0,i\neq k}^n\frac{x-x_i}{x_k-x_i}, k=0,1,\ldots,n.$$
\end{thm}

\section{O Método de Newton}
No cálculo do polinômio interpolador pelo método de Lagrange, a
adição de mais um ponto $(x_{n+1}, y_{n+1})$ nos obriga a refazer
todos os cálculos dos novos polinômios $L_k(x), i = 0, 1,\ldots,
n+1$. É muito frequente que se testem diferentes pontos de
interpolação, variando o número de pontos considerados, de modo a
satisfazer às condições de erro de interpolação. O polinômio
interpolador de Newton com diferenças divididas permite contornar
esse problema. Este polinômio interpolador surge de uma construção
recursiva, extremamente simples, a partir da definição de operador
diferença dividida.

Para obtermos a forma de Newton para o polinômio interpolador
$p_n(x)$ que interpola $f$ nos pontos $x_0,x_1,\ldots, x_n$
precisamos do operador de diferenças divididas que passaremos a
expor agora.

O operador diferenças divididas é definido por: $$f[x_0]= f(x_0) \mbox{ (ordem 0)}$$

$$f[x_0,x_1]=\frac{ f[x_1]-f[x_0]}{x_1-x_0},\mbox{(ordem 1)} $$

$$ f[x_0,x_1,x_2]=\frac{ f[x_1,x_2]-f[x_0,x_1]}{x_2-x_0},\mbox{(ordem 2)} $$ $$f[x_0,x_1,x_2,x_3]=\frac{ f[x_1,x_2,x_3]-f[x_0,x_1,x_2]}{x_3-x_0},\mbox{(ordem 3)} $$ $$ \vdots = \vdots$$

$$f[x_0,x_1,x_2,x_3,\ldots, x_n]=\frac{ f[x_1,x_2,x_3,\ldots, x_n] -f[x_0,x_1,x_2, \ldots, x_{n-1}]}{x_n-x_0} ,\mbox{(ordem $n$)}$$

Chamamos de $f[x_0,x_1,x_2,\ldots, x_k]$ de diferença dividida de
ordem $k$ entre os $k+1$ pontos $x_0,x_1,x_2,\ldots, x_k$.

As diferenças divididas $f [x_0, x_1, x_2, \ldots , x_k]$ são
invariantes para qualquer permutação dos índices, isto é, são
funções simétricas nos seus argumentos.

Dados $x_0,x_1,x_2,\ldots, x_n$ pontos distintos, podemos supor
que estejam ordenados em ordem crescente. Podemos construir a
seguinte tabela de diferenças divididas

Preste atenção aos coeficientes $d_0,d_1, d_2, \ldots, d_n$. Eles são importantes.

Temos o seguinte resultado.
\begin{thm}A forma de Newton para o polinômio $p_n(x)$ que
interpola $f(x)$ em $x_0,x_1,x_2, \ldots, x_n$ pontos distintos é
dado por
$$p_n(x)= d_0+d_1(x-x_0)+ d_2(x-x_0)(x-x_1)+ \cdots +$$ $$
d_n(x-x_0)(x-x_1)\cdots (x-x_{n-1})$$ onde $d_k$ são as diferenças
divididas de ordem $k$ dadas por
$$d_k=f[x_0,x_1,x_2,\ldots, x_k].$$
\end{thm}

\section{Interpolação em Pyhton}

\section{Interpolação em MatLab}

MatLab já algum tempo não tem rotina para determinar o polinômio interpolador (ficou obsoleto). Atualmente, a interpolação é feita por splines cúbicas.

Um exemplo ANTIGO é

X = [1 2 3 4 5 6 7 8];
Y = [0 1 0 1 0 1 0 1];
[P,R,S] = lagrangepoly(X,Y);

Para este exemplo, ilustramos o polinômio interpolador em azul e em verde a spline cúbica. Note como o polinômio oscila muito mais e, portanto, o erro de aproximação é maior.

O pacote de matemática simbólica do MatLab, MuPAD, oferece ainda interpolação polinomial. Para ver como acessar o MuPAD, no prompt do MatLab digite mupad (vai abrir um ambiente de notebook do mupad) e execute o exemplo:

xList := [1, 2, 3]:
yList := [2, 5, 7]:
P := interpolate(xList, yList, x)

\section{Interpolação em Maple}

Como fazer Interpolação Polinomial diretamente no Maple
Dado os pontos [x0, x1, …, xn]
distintos, a rotina PolynomialInterpolation retorna o polinômio de grau máximo n que interpola os pontos {(x0,y0),(x1,y1), ( x2,y2), .., (xn, yn)}.

Esta rotina faz parte do pacote CurveFitting. Portanto, é necessário iniciar com o comando “with(CurveFitting).”
A sintaxe é: PolynomialInterpolation(xydata, x, opts),

aceita lista, array ou matriz com os dados.
Se desejamos o polinômio interpolador na forma de Lagrange, declaramos esta opção como no exemplo
>>PolynomialInterpolation([0, 2, 4, 7], [2, 5, 1, 3], x,form=Lagrange)

Se x é um valor numérico, a rotina retorna o valor do polinômio interpolador neste ponto.

Exemplo:

with(CurveFitting);
PolynomialInterpolation([[0, 1], [1, 3], [2, 5], [3, 10]], x);
PolynomialInterpolation([0, 1, 2, 3], [1, 3, 5, 10], x);
PolynomialInterpolation([0, 1, 2, 3], [1, 3, 5, 10], x, form = Lagrange);

Tags :

Compartilhe:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *