Vous êtes sur la page 1sur 4

Diferencias divididas

A continuación vamos a construir con Matlab la tabla de diferencias divididas


de una función en unos nodos x(0), x(1), ..., x(N-1), x(N). (Ref: Diez
lecciones de Cálculo Numérico. J. M. Sanz Serna.) (Ref: Numerical methods
using Matlab. J. H. Mathews y K. D. Fink.)

Construiremos una tabla como la que se muestra, donde xN-1 es el nodo x(N-
1), xN-2 el nodo x(N-2), etc.
x0 f[x0]
x1 f[x1] f[x0,x1]
x2 f[x2] f[x1,x2] f[x0,x1,x2]
. . . . .
. . . . .
. . . . .
xN f[xN] f[xN-1,xN] f[xN-2,xN-1,xN] ... f[x0,...,xN]

Definimos los nodos, N y los valores de la función.


nodos=[1 2 3 4];
N=length(nodos)-1;
fnodos=[1, 1, 2, 6];

Inicializamos una matriz con NaN.


M=NaN(N+1,N+2);
% Rellenamos la primera columna
M(:,1)=nodos;
% Rellenamos la segunda columna
M(:,2)=fnodos;

Calcularemos las diferencias divididas de orden i=2, 3, ..., N+1 que


colocaremos en la columna i+1 de la matriz.
for i=2:N+1
% Las diferencias divididas de orden i comienzan en la fila i y
acaban
% en la fila N+1.
for j=i:N+1
%
% Reproducimos una parte de la matriz M, necesaria para hallar el
elemento
% M(j,i+1)
%
% M(j-i+1,1) M(j-i+1,2)
% .
% .
% .
% M(j-1,i)
% M(j,1) . . . . . M(j,i) M(j,i+1)
%
% Puede comprobarse que siguiendo el elemento M(j-i+1,2) en diagonal
(esto
% es, sumando i-2 al indice de las filas y de las columnas) se llega
al
% elemento M(j-1,i) .

M(j,i+1)=(M(j,i) - M(j-1,i)) / (M(j,1) - M(j-i+1,1) );


end
end

La matriz M contiene la tabla de diferencias divididas.


M
M =

1.0000 1.0000 NaN NaN NaN


2.0000 1.0000 0 NaN NaN
3.0000 2.0000 1.0000 0.5000 NaN
4.0000 6.0000 4.0000 1.5000 0.3333

Ej 3. Construya la matriz de diferencias divididas correspondiente al


polinomio que interpola la función coseno en los nodos 0, 1 ,2, 3, 4. Localice
el valor de f[0, 1 ,2] en la matriz construida. (Sol. Diferencias divididas =
1.0000 , -0.4597 , -0.2484 , 0.1466 , -0.0147) (Ref: Numerical methods using
Matlab. J. H. Mathews y K. D. Fink.)

Forma de Newton

Con las diferencias divididas calculadas podemos construir el polinomio de


interpolación en la forma de Newton, donde xN-1 es el nodo x(N-1): P(x)
=f[x0] + f[x0,x1]*(x-x0) + f[x0,x1,x2]*(x-x0)*(x-x1) + ... +
f[x0,x1,...,xN]*(x-x0)*(x-x1)* ... *(x-xN-1) .

En primer lugar veremos como construir el polinomio q(x)=(x-x0)*(x-x1)* ...


*(x-xN) a partir de los valores x=[x0, x1, x2, ..., xN]. Usaremos un
acumulador de producto, que comenzará valiendo el polinomio constante [1],
y le iremos multiplicando los monomios (x-xj) que se expresan en forma de
vectores como [1, -xj].
q=[1];
for i=2:N+1
monomio=[1, -nodos(i-2+1)]
q=conv(q,monomio)
end
monomio =

1 -1

q =

1 -1

monomio =
1 -2

q =

1 -3 2

monomio =

1 -3

q =

1 -6 11 -6

Sin embargo, la forma de Newton se expresa mediante una suma de


polinomios, cuyos sumandos son los polinomios q que se calculan en el bucle,
multiplicados por la correspondiente diferencia dividida. Observe en el
siguiente bucle cómo la forma de Newton se calcula mediante un acumulador
de suma.
newton=[fnodos(1)];
q=[1];
for i=2:N+1
monomio=[1, -nodos(i-2+1)]
q=conv(q,monomio)
newton=[0, newton] + M(i,i+1)*q
end
monomio =

1 -1

q =

1 -1

newton =

0 1

monomio =

1 -2

q =

1 -3 2

newton =
0.5000 -1.5000 2.0000

monomio =

1 -3

q =

1 -6 11 -6

newton =

0.3333 -1.5000 2.1667 0

Vous aimerez peut-être aussi