Newton Neville
Newton Neville
Newton Neville
May 1, 2014
cn+1 = f [x1 ]
f [x2 ] − f [x1 ]
cn = = f [x1 , x2 ]
x2 − x1
cn−k+1 = f [x1 , x2 , . . . xk+1 ]
Hay que tener en cuenta que, en general, las diferencias de orden k vienen definidas por:
Si calculamos todas las diferencias divididas las podemos almacenar en una matriz triangular inferior. De
dicha matriz los elementos de la diagonal principal son los coeficientes de nuestro polinomio interpolador de
Newton.
1
2.0.1 EJEMPLO:
Consideremos la siguiente tabla de valores:
Out[6]: 0 1 2 3 4 5
x 0.15000 2.30000 3.1500 4.85000 6.25000 7.95000
y 4.79867 4.49013 4.2243 3.47313 2.66674 1.51909
Vamos a aplicar en dichos datos el polinomio interpolador de Newton y el algoritmode Neville. Tendremos
πx
en cuenta que los datos de la tabla son aproximaciones de la función f (x) = 4.8 cos Para ello hemos
20
creado un módulo python en el que hemos definido mediante funciones los dos métodos vistos aquı́. Dibujamos
a parte la función de la que tenemos sus aproximaciones en la tabla.
fig, ax = plt.subplots(1)
fig.set_size_inches(10, 10)
x = np.linspace(0., 8., 100)
plt.plot(x, f(x), ’b-’)
ax.axis([0, 8, 0, 5])
ax.set_title(’$f(x)$’, color=’blue’, fontsize=18)
vector_legend = [’$f(x)$’]
mylegend = ax.legend(vector_legend, loc=4, ncol=3, fancybox=True,
prop={’size’:8}, title=’$FUNCION REAL$’)
plt.setp(mylegend.get_title(),fontsize=’18’, color=’red’)
plt.setp(mylegend.get_texts(),fontsize=’14’, color=’black’)
frame = mylegend.get_frame()
frame.set_facecolor(’0.95’)
ax.set_xlabel(’$Abscisa\; x$’, color=’blue’, fontsize=16)
ax.set_ylabel(’$Ordenada\; y$’, color=’blue’, fontsize=16)
xtcks = np.arange(0, 8)
xtckslatex = []
for i in xtcks:
xtckslatex.append(’$’ + str(i) + ’$’ )
ytcks = np.arange(0, 5)
ytckslatex = []
for i in ytcks:
ytckslatex.append(’$’ + str(i) + ’$’ )
ax.set_xticks(xtcks, xtckslatex)
ax.set_yticks(ytcks, ytckslatex)
ax.grid(’on’)
plt.show()
plt.close()
2
In [7]: %load diferencias.py
Éste es el código del módulo que utilizaremos para resolver el ejemplo. Consta de 4 funciones que están
debidamente documentadas siguiendo los estándares para la creación de la documentación en Python.
#/usr/bin/env python3
# -*- coding: utf-8 -*-
3
x = symbols(’x’)
4
Q = np.zeros((len(x), len(x)), dtype=float)
for k in range(0, len(x)):
Q[k][0] = y[k]
#/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
from numpy import array, cos, pi
from sympy import symbols, init_printing, lambdify, horner, expand, pprint
from diferencias import diferencias, polnewton, polnewtonsym, polneville
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams[’text.latex.unicode’] = True
rcParams[’text.usetex’] = True
rcParams[’text.latex.preamble’] = ’\\usepackage{amsthm}’,
’\\usepackage{amsmath}’, ’\\usepackage{amssymb}’,
’\\usepackage{amsfonts}’, ’\\usepackage[T1]{fontenc}’, ’\\usepackage[utf8]{inputenc}’
x = symbols(’x’)
init_printing(use_unicode=True)
5
P = lambdify(x, polnewtonsym, ’numpy’)
ax1.xaxis.label.set_fontsize(20)
ax1.yaxis.label.set_fontsize(20)
ax1.set_xlabel(r’$Datos\; x$’, color=’blue’)
ax1.set_ylabel(r’$Datos\; y$’, color=’blue’)
ax2.xaxis.label.set_fontsize(20)
ax2.yaxis.label.set_fontsize(20)
ax2.set_xlabel(r’$Datos\; x$’, color=’blue’)
ax2.set_ylabel(r’$Datos\; y$’, color=’blue’)
ax1.grid(’on’)
ax2.grid(’on’)
xtcks = np.arange(0, 9)
xtckslatex = []
for i in xtcks:
xtckslatex.append(’$’ + str(i) + ’$’ )
ytcks = np.arange(-2, 6)
ytckslatex = []
for i in ytcks:
ytckslatex.append(’$’ + str(i) + ’$’ )
6
ax1.set_xticklabels(xtckslatex, fontsize=18)
ax1.set_yticklabels(ytckslatex, fontsize=18)
ax2.set_xticklabels(xtckslatex, fontsize=18)
ax2.set_yticklabels(ytckslatex, fontsize=18)
plt.show()
plt.close()
2
0.0590145616002341·x - 0.00018014557743914·x + 4.80002509447959
7
Conclusión En el código anterior lo hemos ejecutado para calcular el valor aproximado interpolador 3.5
para ambos métodos. Vemos que por ambos métodos obtenemos una muy buena aproximación de la función
π · x
f (x)4.8 · cos en f (3) . Como polinomio interpolador de Newton hemos obtenido la expresión: P (x) =
20
−2.30081527502247·10−6 ·x5 +0.000142856446368703·x4 −9.39713572923442·10−5 ·x3 −0.0590145616002341·
x2 −0.00018014557743914·x+4.80002509447959 En la primera gráfica de la imagen de arriba si la comparamos
con la gráfica de la función f (x) vemos que es prácticamente la misma, con lo que el Método de Newton nos
da resultados satisfactorios. En la segunda gráfica comparamos Neville y Newton con el valor aproximado
que obtenemos para 3.5. Apreciamos que ambos convergen a la misma solución (decimal arriba, decimal
abajo), pero Neville converge mucho más suave y monótonamente que Newton. Con lo que todo nos hace
indicar que para interpolar más valores de nuestro ejemplo nos decantarı́amos por Neville. Cosa que no
deberı́a extrañarnos, ya que en condiciones normales, Neville es una mejora de Newton.
8
2.1 REFERENCIAS:
[1] http://en.wikipedia.org/wiki/Newton polynomial [2] http://en.wikipedia.org/wiki/Neville%27s algorithm
[3] http://en.wikipedia.org/wiki/Category:Interpolation
In []: