Física Computacional - FSC-5705

só um divisor

Interpolação e aproximação polinomial

Interpolação e extrapolação

Suponhamos que obtenhamos dados referente à medida de uma grandeza $\textbf{X}$ e $\textbf{Y}$. Sejam estes dados os pontos $(x_1,y_1), (x_2,y_2), \ldots, (x_n,y_n)$. Por interpolação entendemos o método que permite obter um ou mais ponto novos dentro do intervalo onde os ponto previamente conhecido estão distribuídos, em quanto que por extrapolação entendemos aquele método que permite obter pontos fora do intervalo dos dados conhecidos.

Antes de iniciarmos o estudo de interpolação e extrapolação é necessário que seja entendido que ainda que os métodos que serão apresentados nesta seção são de grande valia para a análise de dados, devemos ter sumo cuidado com sua utilização.

Evidentemente utilizar um método para extrapolar qualquer conjunto de dados requer uma profunda análise previa a fim de ter alguma "esperança" de que o comportamento do fenômeno ao qual estes dados fazem referencia seja aquele que o método de extrapolação está sugerindo. Por exemplo se analisamos o comportamento de um mola ao ser aplicada uma força obtermos uma relação linear entre a força aplicada e o deslocamento da mola, assim então poderíamos estar sujeitos a pensar que este comportamento é eterno, contudo sabemos que fora da região plástica essa relação linear entre força $\textbf{F}$ e deslocamento $\textbf{X}$ não é mais valida.

Comportamento patológico de uma função em pi

No caso da interpolação também deve de se cuidar ao se aplicar os métodos na análise de dados. Por exemplo vejam a curva da figura em anexo, a primeira mão pensaríamos que os dados poderiam ser interpolados usando uma função potencial, contudo estes dados tem um problema. Como esses dados foram obtidos a partir da função

$\displaystyle{ f(x) = 3x^2 + \frac{(\ln (\pi - x))^2}{\pi ^4} + 1 }$

sabemos que ela apresenta um comportamento patológico perto de $\pi$ (que é apresentado no requadro da figura).

Finalmente é importante dizer que ao ser utilizado um método de interpolação polinomial a um conjunto de dados devemos procurar utilizar polinômios da menor ordem possível. Isto porque, ainda que os polinômios de ordem superior permitam se aproximar cada vez mais de um número maior de dados a serem interpolados, em geral o aumento da ordem do polinômio implica em se obter comportamentos cada vez mais oscilatório entre os pontos conhecidos, além do mais devemos lembrar que um polinômio de grau $n$ tem $n$ raízes e pode não ser esta a realidade física do problema analisado.

A base matemática para se tentar interpolar um conjunto de dados utilizando um polinômio está fincada no Teorema de aproximação de Weierstrass que nos assegura que dada una função definida num intervalo fechado, podemos encontrar um polinômio que "se aproxime" a esta função tanto como queiramos.

Polinômio interpolador de Lagrange de n-ésimo grau

Se $x_0, x_1, \cdots, x_n$ são $n+1$ números distintos e $f$ é uma função cujos valores são dados nesses números, então existe polinômios $P_n(x)$ de grau máximo $n$, que passa por todos os $n + 1$ pontos , isto é:

$\displaystyle{ }$ $\displaystyle{ f(x_k) = P_n(x_k) }$

Esse polinômio é dado por uma combinação linear dos chamados polinômios de Lagrange de ordem $n$, $L_{n,k}$:

$\displaystyle{ P_n(x) = f(x_0) + f(x_1)L_{n,1} + f(x_2)L_{n,2} +\cdots + f(x_n)L_{n,n}=\sum_{k=0}^n f(x_k)L_{n,k}(x) }$

onde, os polinômios de Lagrange se definem como

$\displaystyle{ \begin{array}{ccl} L_{n,k} & = & \frac{(x-x_0)(x-x_1)\cdots(x-x_{k-1})(x-x_{k+1})\cdots(x-x_n)}{(x_k-x_0)(x_k-x_1)\cdots(x_k-x_{k-1})(x_k-x_{k+1})\cdots(x_k-x_n)} \\ & = & \prod_{i=0,\, i \neq k}^n \frac{(x-x_i)}{(x_k-x_i)} \\ \end{array} }$

Como exemplo vejamos os polinômios de Lagrange que passam pelos pontos da tabela a seguir

   x       y   
   0.0       0.0   
   1.0       2.0   
   2.0       3.0   
   3.0       1.0   
   3.0       1.0   
   4.0       4.0   

O resultado da aplicação do método nos dados está no gráfico mostrado a continuação

Calculo de alguns polinômios de Lagrange

O programa

      
      #!/usr/bin/env
      #-*- coding: utf-8 -*-
      
      def Lnk(k, x, xi):
        l_nk = 1.0
        n   = len(xi)
        for i in xrange(n):
          if (i != k):
            l_nk = l_nk * ( (x - xi[i]) / (xi[k] - xi[i]) )
        
        return l_nk

      #-------------------------------------------
            
      x = 2.0
      xi = np.array([1.0, 4.0, 6.0])
      yi = np.log(xi)
      n  = len(xi)
      #Ou pode ler os dados de um arquivo como em
      #xi, yi = loadtxt('dados.dat', unpack=True)
      
      P = 0.0
      for k in range(n):
        P = P + yi[k]*Lnk(k, x, xi)
        
      print P
      
[usuario@pclabfis: ]# python lagrange.py
0.565844346901

Tarefa