3.1.4 Aproximação de Funções — Interpolação — Interpolação de Hermite
1. Interpolação de Hermite
Seja a fórmula geral da interpolação
consideramos para , isto é, supomos que a primeira derivada também é uma função conhecida em dos pontos tabulares. Ou seja, a fórmula acima, quando desenvolvida até a primeira derivada, terá a forma
portanto, desprezando o erro da aproximação, temos interpolada por
onde e são polinômios. Novamente, usando o critério da aproximação exata, queremos minimizar o erro tal que . Utilizando a interpolação de Lagrange, podemos utilizar as seguintes condições para satisfazerem e :
nestas condições, temos que é
h_{j_\alpha}(x) = \left\{
\begin{array}{lcl}
t_j(x) l_{jn}(x) l_{jr}(x) & ~ & j = 1,\ldots ,r \\
l_{jn}(x) \frac{p_r(x)}{p_r(a_j)} & ~ & j = r + 1, \ldots, n
\end{array}
\right.
$$
onde é um polinômio de primeiro grau tal que é de grau . Para satisfazer as condições de convergência, precisamos ter e .
De maneira semelhante, fazemos para :
onde é um polinômio de primeiro grau com e .
Tomando e , temos que
\begin{array}{lcl}
\left[ 1 – (x – a_j)[l_{jn}'(a_j) + l_{jr}'(a_j)] \right] l_{jn}(x)l_{jr}(x) & ~ & j = 1,\ldots ,r \\
l_{jn}(x) \frac{p_r(x)}{p_r(a_j)} & ~ & j = r + 1, \ldots, n
\end{array} \right| $$
e
Ou seja, a Fórmula Interpoladora de Hermite é
\sum_{j=1}^{n} h_{j_\beta}(x) f'(a_j)
$$
com e .
2. Implementação
def interpolation_hermite(x, x_j, f_j, diffF_j, n=0):
"""
Return x evaluated in Hermite interpolation function.
interpolation_hermite(x, x_j, f_j, diffF_j, n=0)
INPUT:
* x: evalue at this point
* x_j: LIST, tabular points
* f_j: LIST, tabular points (must be same size of x_j)
* diffF_j: LIST, derivative points of x_j (f'(x_j))
* n: polynomial degree (optional)
return:
* y(x): interpolated and evaluated x value
Author: Pedro Garcia [sawp@sawp.com.br]
see: http://www.sawp.com.br
License: Creative Commons
http://creativecommons.org/licenses/by-nc-nd/2.5/br/
Dec 2010
"""
if type(x_j) != type(f_j) or type(x_j) != type([]):
print "Error: wrong type parameters"
return float("NaN")
if len(x_j) != len(f_j) or len(x_j) != len(diffF_j):
print "Error: the tabular points must have same size"
return float("NaN")
if n < = 0:
n = len(x_j)
else:
n = n + 1
p = 0.0
for j in xrange(n):
# lagrange polinomial
xj = x_j[j]
ljn_num = 1.0
ljn_den = 1.0
for i in xrange(n):
xi = x_j[i]
if i != j:
ljn_num *= (x - xi)
ljn_den *= (xj - xi)
ljn = ljn_num / ljn_den
# hermite interpolation
diff_ljn = 0
for i in xrange(n):
xi = x_j[i]
if i != j:
diff_ljn += 1.0 / (xj - xi)
hjn = (1.0 - 2 * (x - xj) * diff_ljn) * (ljn * ljn)
hjn_ = (x - xj) * (ljn * ljn)
p += hjn * f_j[j] + hjn_ * diffF_j[j]
return p
Esta função está disponível em http://www.sawp.com.br/code/interpolation/interpolation_hermite.py assim como um exemplo de como utilizá-la.
3. Copyright
Este documento é disponível sob a licença Creative Commons. As regras dos direitos de cópia deste conteúdo estão acessíveis em http://creativecommons.org/licenses/by-nc-nd/2.5/br/.