Está en la página 1de 50

UNIVERSIDAD POLITÉCNICA DE MADRID

ESCUELA TÉCNICA SUPERIOR DE


INGENIEROS DE MINAS
DEPARTAMENTO DE MATEMÁTICA APLICADA Y
MÉTODOS INFORMÁTICOS

TITULACIÓN: INGENIERÍA DE MINAS

ASIGNATURA: PROGRAMACIÓN Y MÉTODOS


NUMÉRICOS

PRÁCTICA Nº 8: INTERPOLACIÓN POLINÓMICA


DE LAGRANGE (III): Definición de funciones a
trozos. INTERPOLACIÓN POLINÓMICA A TROZOS
CURSO 2006-07
PRÁCTICA ELABORADA POR:
Prof. Carlos Conde Lázaro
Prof. Arturo Hidalgo López
Prof. Alfredo López Benito
Depto. de Matemática Aplicada y Métodos Informáticos
Escuela Técnica Superior de Ingenieros de Minas
Universidad Politécnica de Madrid

Mayo 2007
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

OBJETIVOS DE LA PRÁCTICA
1º. Definir y representar funciones definidas por tramos.
2º. Estudiar diferentes casos de interpolaciones polinomiales por tramos.

FORMA DE DESARROLLAR ESTA PRÁCTICA.


El desarrollo de la práctica consistirá en la realización de ejemplos resueltos
(epígrafe de EJEMPLOS) y tras ello se propone al alumno el desarrollo de algunos
ejercicios (epígrafe de EJERCICIOS PROPUESTOS) que deberá desarrollar
individualmente.

DURACIÓN ESTIMADA DE ESTA PRÁCTICA


El tiempo estimado para la realización de esta práctica es de 2 horas.

BIBLIOGRAFÍA
Algunos de los ejercicios de esta práctica están basados en los recogidos en:

C. Conde, A. Hidalgo y A. López (2007) Interpolación polinómica. Apuntes


disponibles en el Open Course Ware de la Universidad Politécnica de Madrid.

1
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

EJEMPLOS
Primer ejemplo: Definición de funciones a trozos.
A) Primera opción: Mediante un procedimiento.

En MAPLE puedes elaborar un procedimiento para definir una funciónutilizando


distintas expresiones en diferentes tramos. Por ejemplo, en el procedimiento
siguiente se define una función llamada ftroz que entre 0 y 3 tiene la expresión x2,
entre 3 y 6 tiene la expresión (x+6) y entre 6 y 10 tiene la expresión (18-x). La
función no estaría definida fuera del intervalo (0, 10).

> restart;
> with(linalg):with(plots):with(plottools):
Warning, the protected names norm and trace have been redefined and
unprotected

Warning, the name changecoords has been redefined

Warning, the name arrow has been redefined

> ftroz:= proc(x)


if (x>=0 and x<=3) then
x^2:
elif (x>3 and x<=6) then
x+6:
elif (x>6 and x<=10) then
18-x:
fi:
end:

Una vez definida, podemos usar la función de la misma manera que las que
vienen predefinidas en MAPLE. Por ejemplo, podremos evaluar el valor que toma
la función en diferentes puntos así,

Para x=3:

> ftroz(3);
9
Para x=5:

> ftroz(5);

2
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

11

Pero no podremos evaluarla en x = -6 pues, recuerda, no habíamos definido la


función fuera del intervalo (0, 10).

> ftroz(-6);

Modifiquemos el procedimiento anterior introduciendo una opción en la que se


asigne a la función el valor "0" fuera del intervalo (0, 10).

> ftroz:= proc(x)


if (x>=0 and x<=3) then
x^2:
elif (x>3 and x<=6) then
x+6:
elif (x>6 and x<=10) then
18-x:
else
0
fi:
end:

Ahora:

> ftroz(-6);
0
Podemos representar la función:

> plot(ftroz,-5..15,color=red,thickness=3);

3
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Pero no podrías utilizar la expresión ftroz(x) si a la variable x no le asignas valor.


Por ejemplo:

> ftroz(x);
Error, (in ftroz) cannot determine if this expression is true or false: -
x <= 0 and x-3 <= 0

> plot(ftroz(x),-5..15,color=red,thickness=3);
Error, (in ftroz) cannot determine if this expression is true or false: -
x <= 0 and x-3 <= 0

Al no tener valor "x" MAPLE intenta ejecutar el procedimiento y no puede realizar


las comparaciones que figuran en sus if.

> fin;

4
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

fin

B) Segunda opción: Mediante el comando piecewise.

MAPLE dispone de una instrucción específica para definir funciones por tramos.
Esta instrucción es el comando piecewise, cuya estructura es:

piecewise (rango 1 de x, expresión 1 de la función, rango 2 de x, expresión 2 de


la función, rango i de x, expresión i de la función, ........., expresión fuera de los
rangos anteriores):

Escribamos algún ejemplo. Comencemos con la misma función que definíamos


mediante un procedimiento anteriormente

> f:=piecewise(x>=0 and x<3, x^2,x>=3 and x<=6, (x+6) ,x>6


and x<=10, 18-x, 0);
⎧ x
2
−x ≤ 0 and x < 3

⎪ x+6 3 − x ≤ 0 and x − 6 ≤ 0
f := ⎪⎨⎪
⎪ 18 − x −x < -6 and x − 10 ≤ 0

⎪ 0
⎩ otherwise
> plot(f(x),x=-5..15,color=blue,thickness=3);

5
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Definamos otra función a trozos

> ff:=piecewise(x<0 ,sin(x) ,x<3 , 1/(1+x), exp(-x/3));


⎧ sin( x ) x<0

⎪ 1
⎪ x<3
ff := ⎪⎨⎪ 1 + x

⎪ ⎛⎜ − x ⎞⎟
⎪ ⎜⎝ 3 ⎟⎠
⎪e
⎩ otherwise
> plot(ff(x),x=-10..10,thickness=3,color=khaki);

6
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> fin;
fin

Segundo ejemplo: Definición de funciones de base


para la interpolación de Lagrange por tramos de
primer grado.

A modo de ejemplo de funciones a trozos, partiendo de una partición realizada


sobre un intervalo:

x0 = 0, x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5, x6 = 6

7
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

se desea representar una función que valga:

⎧ x − x0
⎪ si x0 ≤ x ≤ x1
φ (0) = ⎨ x1 − x0
⎪0
⎩ en otro caso

⎧ x − xi −1
⎪x − x si xi −1 ≤ x ≤ xi
⎪ i i −1

⎪ x − xi +1
φ (i ) = ⎨ si xi ≤ x ≤ xi +1 (i=2,",n-1)
⎪ xi − xi +1
⎪0 en otro caso

⎧ x − xn−1
⎪ si xn−1 ≤ x ≤ xn
φ (n) = ⎨ xn − xn−1
⎪0
⎩ en otro caso

> restart;
> with(linalg):with(plots):
Warning, the protected names norm and trace have been redefined and
unprotected

Warning, the name changecoords has been redefined

> n := 6:
> xn[0]:=0;
h:=1;
xn 0 := 0

h := 1
> for i from 1 by 1 to n do
xn[i] := xn[i-1]+h:
od;
xn 1 := 1

xn 2 := 2

8
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

xn 3 := 3

xn 4 := 4

xn 5 := 5

xn 6 := 6

> fun0 := (x-xn[1])/(xn[0]-xn[1]):


> for i from 1 by 1 to n-1 do
fun1[i] := (x-xn[i-1])/(xn[i]-xn[i-1]):
fun2[i] := (x-xn[i+1])/(xn[i]-xn[i+1]):
od:
> funn := (x-xn[n-1])/(xn[n]-xn[n-1]):
> phi[0]:= piecewise(xn[0]<=x and x<=xn[1],fun0, 0);
−x + 1 0 ≤ x and x ≤ 1
φ 0 := {
0 otherwise
> for i from 1 by 1 to n-1 do
phi[i]:= piecewise(xn[i-1]<=x and x<=xn[i],fun1[i],xn[i]<=x
and x<=xn[i+1],fun2[i],0);
od;
⎧ x 0 ≤ x and x ≤ 1

φ 1 := ⎪⎪⎨ −x + 2 1 ≤ x and x ≤ 2
⎪⎪ 0
⎩ otherwise

⎧ x−1 1 ≤ x and x ≤ 2

φ 2 := ⎪⎪⎨ −x + 3 2 ≤ x and x ≤ 3
⎪⎪ 0
⎩ otherwise

⎧ x−2 2 ≤ x and x ≤ 3

φ 3 := ⎪⎪⎨ −x + 4 3 ≤ x and x ≤ 4
⎪⎪ 0
⎩ otherwise

⎧ x−3 3 ≤ x and x ≤ 4

φ 4 := ⎪⎨⎪ −x + 5 4 ≤ x and x ≤ 5
⎪⎪ 0
⎩ otherwise

⎧ x−4 4 ≤ x and x ≤ 5

φ 5 := ⎪⎪⎨ −x + 6 5 ≤ x and x ≤ 6
⎪⎪ 0
⎩ otherwise
> phi[n]:= piecewise(xn[n-1]<=x and x<=xn[n],funn);
x−5 5 ≤ x and x ≤ 6
φ 6 := {
0 otherwise

9
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Observa en la definición anterior que al explicitarse sólo una expresión en un


tramo, MAPLE asume que fuera de ese tramo la función es nula.
Dibujémos las funciones de base en el intervalo (xn[1] , xn[n])

> for i from 0 by 1 to n do

plot(phi[i](x),x=xn[0]..xn[6],scaling=constrained,thickness=3
);
od;

10
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

11
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

12
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

13
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

14
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

15
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Representemos todas las funciones de base juntas. En el proceso siguiente


utilizamos un código de color RGB (rojo (Red) - verde (Green) - azul (Blue)) en el
que para cada índice "i" se asocia una proporción (en tanto por uno) de color rojo,
verde y azul respectivamente. Con ello logramos dar color distinto a cada curva.
Te dejamos a tí que con la ayuda de MAPLE, indagues con mayor detalle en el
funcionamiento del código de color RGB.

> for i from 0 by 1 to n do


indice:=evalf(i/n):
if (indice < 0.33) then
colorin:=COLOR(RGB,indice,2*(1-indice)/3 ,(1-
indice)/3):
elif (indice < 0.67) then

16
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

colorin:=COLOR(RGB,indice,(1-indice)/4 ,3*(1-
indice)/4):
else
colorin:=COLOR(RGB,indice,(1-indice)/2 ,(1-
indice)/2):
fi:

dibu[i]:=plot(phi[i](x),x=xn[0]..xn[6],scaling=constrained,
thickness=3,color= colorin):
od:
> display(seq(dibu[i],i=0..n));

Tercer ejemplo: Obtención de la función


interpoladora a trozos de segundo grado.

17
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

En este ejemplo se va a interpolar un función definida de manera discreta:

x 0 1 3 5 6 7 8
f(x) 4 2 3 3 1 6 2

> restart;
> with(linalg):with(plots):
Warning, the protected names norm and trace have been redefined and
unprotected

Warning, the name changecoords has been redefined

Comenzamos introduciendo el número de puntos. Por seguir con una notación


similar a ejemplos precedentes,
el número de puntos vendrá dado por n+1. Así pues, introducimos n (que debe
ser par para la interpolación por tramos con polinomios de grado menor o igual a
2).

> n := 6;
n := 6

Con n+1 puntos, el número de subintervalos será: n/2. Llamaremos numint a la


variable que almacena dicho número.

> numint := n/2;


numint := 3
Construímos el vector fval, que almacena el valor de que toma la función a
interpolar en los puntos del soporte.
>
xn[0]:=0:xn[1]:=1:xn[2]:=3:xn[3]:=5:xn[4]:=6:xn[5]:=7:xn[6]:=
8:
>
fval[0]:=4:fval[1]:=2:fval[2]:=3:fval[3]:=3:fval[4]:=1:fval[5
]:=6:fval[6]:=2:

Diseñamos ahora un procedimiento en el que se calculan las funciones de base de


Lagrange asociadas a la partición anterior.

Se tendrá una función de base (a tramos polinómicos de segundo grado en cada


subintervalo) asociada a cada nodo del soporte (en ese nodo toma valor unidad
y en los demás nodos del soporte tomará valor nulo).

18
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Las funciones de base obtenidas se almacenarán en un vector, denominado phi,


que tendrá tantas componentes como puntos haya en el soporte de interpolación.
En el cálculo que se realiza en el procedimiento siguiente, además de la primera y
última de las funciones de base, se diferencia el cálculo de las asociadas a nodos
internos a los subintervalos (nodos con subíndice impar) del correspondiente a los
nodos que separan subintervalos (nodos con subíndice par).

> fbase_tramos2:=proc(n,s,phi)
local i:
phi[0]:=piecewise(x>= s[0] and x<=s[2],(x-s[1])*(x-
s[2])/((s[0]-s[1])*(s[0]-s[2])),0):
for i from 1 to (n-1) by 2 do
phi[i]:=piecewise(x>=s[i-1] and x<=s[i+1],(x-s[i-
1])*(x-s[i+1])/((s[i]-s[i-1])*(s[i]-s[i+1])),0):
od:
for i from 2 to (n-2) by 2 do
phi[i]:=piecewise(x>=s[i-2] and x<=s[i],(x-s[i-2])*(x-
s[i-1])/((s[i]-s[i-2])*(s[i]-s[i-1])),
x>s[i] and x<=s[i+2],(x-s[i+1])*(x-
s[i+2])/((s[i]-s[i+1])*(s[i]-s[i+2])),0):
od:
phi[n]:=piecewise(x>=s[n-2] and x<=s[n],(x-s[n-2])*(x-
s[n-1])/((s[n]-s[n-2])*(s[n]-s[n-1])),0):
end proc:
> save fbase_tramos2,"fbase_tramos2.m":

Ahora llamamos al procedimiento anterior, para que lo ejecute y escriba los


resultados. Empleamos la instrucción expand para que escriba los polinomios, de
manera simplificada y ordenado según potencias decrecientes de x:

> fbase_tramos2(n,xn,phi):
> for i from 0 by 1 to n do
expand(phi[i]);
od;
⎧ 1 x2 − 4 x + 1 −x ≤ 0 and x − 3 ≤ 0

⎪⎨ 3 3


⎩ 0 otherwise

⎧ −1 x2 + 3 x −x ≤ 0 and x − 3 ≤ 0

⎪⎨ 2 2


⎩ 0 otherwise

19
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

⎧ 1 x2 − 1 x −x ≤ 0 and x − 3 ≤ 0

⎪ 6 6

⎪1
⎨⎪⎪ x2 − 11 x + 5 −x < -3 and x − 6 ≤ 0
⎪6 6

⎪⎪
⎩ 0 otherwise

⎧ −1 x2 + 9 x − 9 3 − x ≤ 0 and x − 6 ≤ 0

⎪⎨ 2 2


⎩ 0 otherwise

⎧ 1 x2 − 8 x + 5 3 − x ≤ 0 and x − 6 ≤ 0

⎪ 3 3

⎪1
⎪⎨ 2 15
⎪ x − x + 28 −x < -6 and x − 8 ≤ 0
⎪2 2

⎪⎪
⎩ 0 otherwise
−x2 + 14 x − 48 6 − x ≤ 0 and x − 8 ≤ 0
{
0 otherwise

⎧ 1 x2 − 13 x + 21 6 − x ≤ 0 and x − 8 ≤ 0

⎪⎨ 2 2


⎩ 0 otherwise
Dibujamos los polinomios de base

> for i from 0 by 1 to n do

plot(phi[i],x=xn[0]..xn[n],scaling=CONSTRAINED,thickness=3);
od;

20
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

21
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

22
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

23
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

24
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

25
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

26
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Dibujamos todas las funciones de base juntas

> for i from 0 by 1 to n do


indice:=evalf(i/n):
if (indice < 0.33) then
colorin:=COLOR(RGB,indice,2*(1-indice)/3 ,(1-
indice)/3):
elif (indice < 0.67) then
colorin:=COLOR(RGB,indice,(1-indice)/4 ,3*(1-
indice)/4):
else
colorin:=COLOR(RGB,indice,(1-indice)/2 ,(1-
indice)/2):
fi:

27
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

dibu[i]:=plot(phi[i](x),x=xn[0]..xn[6],scaling=constrained,
thickness=3,color= colorin):
od:
> display(seq(dibu[i],i=0..n));

Calculemos ahora la función interpoladora. Usamos el comando add para sumar


los productos de los valores nodales de la función (almacenados en el vector fval)
por la función de base asociada al respectivo nodo. Asimismo utilizamos el
comando simplify para que MAPLE simplifique la expresión resultante y nos la
muestre de forma fácilmente visible.

> u:=x->simplify(add(fval[i]*phi[i],i=0..n)):
> u(x);

28
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

⎧ 0 x<0

⎪ 5 2 17

⎪ 6x − 6 x+4 x≤3



⎪ −2 x2 + 16 x − 7 x≤6
⎪⎨
⎪ 3 3

⎪ 9
⎪ 127
⎪ − x2 + x − 218 x≤8
⎪ 2 2

⎪⎪
⎩ 0 8<x
Por último, representemos gráficamente la función interpoladora

> plot(u(x),x=xn[0]..xn[n],thickness=4);

29
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> fin;
fin

Cuarto ejemplo: Comparación entre la


interpolación de Lagrange con polinomio único y la
interpolación de Lagrange a trozos.

30
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> restart;
> with(plots):
> with(linalg):
Warning, the name changecoords has been redefined

Warning, the protected names norm and trace have been redefined and
unprotected

Calculemos la función interpoladora por tamos polinómicos de segundo grado y el


polinomio interpolador de Lagrange de la función f siguiente:

> f := x-> sin(Pi*x**2);


f := x → sin( π x2 )

Recordemos algunos de los procedimientos escritos en prácticas anteriores. El


primero de ellos calcula la posición de los nodos de un soporte equidistante (se
hizo en la práctica nº 6).

Procedimiento de cálculo de los puntos de un soporte


equidistante

> soporte:=proc(a,b,n,puntos)
local i, h:
h:= evalf((b-a)/n):
for i from 0 to n by 1 do
puntos[i]:=a+i*h:
od:
end proc:
> save soporte, "soporte.m":

Procedimiento de cálculo de los polinomios de base de


Lagrange
> polbasei:=proc(n,s,i,g)
g:=x->mul((x-s[k])/(s[i]-s[k]),k=0..i-1)*mul((x-
s[k])/(s[i]-s[k]),k=i+1..n):
end:

Procedimiento en el que se llama, para que se ejecute, al


de cálculo de los polinomios de base de Lagrange

31
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> polbase:=proc(n,s,P)
local i:
read "polbasei.m":
P:=array(0..n):
for i from 0 to n by 1 do
polbasei(n,s,i,P[i]):
od:
end:

Procedimiento de cálculo de la función interpoladora a


trozos

> pLagrange:=proc(n,f,s,p)
local L, valor, i:
read "polbase.m";
L:=array(0..n):
valor:=array(0..n):
polbase(n,s,L):
for i from 0 to n by 1 do
valor[i]:=evalf(f(s[i])):
od:
p:=x->sum(valor[j]*L[j](x),j=0..n):
end:
> save polbasei,"polbasei.m":
save polbase, "polbase.m":
save pLagrange, "pLagrange.m":

Los tres procedimientos anteriores serán utilizados para el cálculo del polinomio
interpolador buscado. Si ya los tuvieses salvados de prácticas anteriores sólo
tendrías que leerlos.

> read "soporte.m":


read "interp_polinomicaL.m":
> n:=24:xn := array(0..n):
> soporte(0.,4.,n,xn):

Calculemos el valor de la función en los puntos del soporte

> fval := array (0..n):


for i from 0 by 1 to n do
fval[i] := evalf(f(xn[i])):
od:

Evaluamos el polinomio interpolador de Lagrange con el nombre p24

32
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> pLagrange(n,f,xn,p24):

Evaluamos ahora la función interpoladora de por tramos de segundo grado

> read "fbase_tramos2.m":


> fbase_tramos2(n,xn,phi):
> u:=x->simplify(add(fval[i]*phi[i],i=0..n)):

Representamos la función f, el polinomio y la función interpoladora (todo ello en


una "ventana" de ordenadas de -2 a 2 para poder ver con algún detalle el proceso
>
dibuf:=plot(f(x),x=xn[0]..xn[n],thickness=3,numpoints=1000,co
lor=blue):
dibup:=plot(p24(x),x=xn[0]..xn[n],-
2..2,thickness=3,numpoints=1000,color=red):
dibuu:=plot(u(x),x=xn[0]..xn[n],thickness=3,numpoints=1000,co
lor=brown):
> display(dibuf, dibup);

33
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> display(dibuf, dibuu);

34
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> display(dibuf, dibup, dibuu);

35
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> fin;
fin

36
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

EJERCICIOS
Primer ejercicio propuesto: Interpolación
polinomial a trozos de primer orden
Se desea realizar una interpolación polinomial a trozos de primer orden de la
función: f ( x ) = e sen( x) tomando como soporte de interpolación el formado por
x

los puntos:

x0 = 0
π
x j = x j −1 + (j = 1,...,8)
8

Para ello, se obtendrán en primer lugar las funciones de base de Lagrange sobre
el soporte dado.

A continuación, se evaluará la función interpoladora a partir de las funciones de


base previamente calculadas.

Se escribirán las expresiones de las funciones de base y de la función


interpoladora. Asimismo se representarán gráficamente todas las funciones de
base en colores distintos en una misma gráfica. En otra gráfica debe
representarse a la función f(x) y a la función interpoladora. Todas las
representaciones gráficas se realizarán en el intervalo de abscisas x[0] ... x[8].
Represéntese también el error de interpolación cometido.

> restart;
>
>
>
>
>
> fin;
fin

37
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Segundo ejercicio propuesto: Interpolación spline


cuadrática

Obtener el polinomio interpolador de spline de segundo grado de la función:

x 0 1 2 3
-----------------------------------
f(x) 0 1 32 243

Imponiendo, como condición adicional: f '(0) = 0

La interpolación de spline cuadrática es un tipo de interpolación a trozos en la que


se busca obtener una función polinomial a trozos, definida por polinomios de grado
2 en cada intervalo.

Se realiza una partición del intervalo de trabajo, y sobre cada subintervalo


generado se define una función de segundo grado del tipo ax + bx + c . El
2

problema consistirá en determinar los coeficientes a, b, c en cada subintervalo.


Así, si se tienen n+1 puntos, el número de intervalos será n, con lo que el número
de incógnitas será 3n. Para evaluarlas se imponen las siguientes condiciones:

Igualdad de valor de la función cuadrática, a izquierda y derecha de los puntos


intermedios del soporte: n-1 condiciones.

Igualdad de valor de la derivada de la función cuadrática, a izquierda y derecha de


los puntos intermedios del soporte: n-1 condiciones.

Igualdad de valor de la función a interpolar y de la función cuadrática en los puntos


del soporte de interpolación: n+1 condiciones.

Tendremos en total 3n-1 condiciones para resolver 3n incógnitas. Nos faltará, por
lo tanto, una condición. Dicha condición se obtendrá a partir de la condición inicial
dada por el enunciado sobre la primera derivada en el punto 0.

38
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

NOTA:
De este ejercicio propuesto se proporciona la solución pues no se incluye en
los apuntes la información proporcionada a los estudiantes en relación a la
interpolación spline cuadrática.

> restart;
> with(linalg):with(plots):with(plottools):
Warning, the protected names norm and trace have been redefined and
unprotected

Warning, the name changecoords has been redefined

Warning, the name arrow has been redefined

Definimos, en primer lugar, el soprte de interpolación

> n := 3:
> h := 1:
> xn[0] := 0;
xn0 := 0

> for i from 1 by 1 to n do


xn[i] := xn[i-1] + h
od;
xn1 := 1

xn2 := 2

xn3 := 3

Introducimos los valores de la función a interpolar

> f(xn[0]):=0;f(xn[1]):=1;f(xn[2]):=32;f(xn[3]):=243;
f( 0 ) := 0
f( 1 ) := 1
f( 2 ) := 32
f( 3 ) := 243

En la interpolación de spline de segundo grado, definimos, entre cada dos puntos


del soporte, una función cuadrática, s

39
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> for i from 1 by 1 to n do


s[i] := unapply(a[i]+b[i]*x+c[i]*x^2,x);
od;
s1 := x → a 1 + b 1 x + c1 x2

s2 := x → a 2 + b 2 x + c2 x2

s3 := x → a 3 + b 3 x + c3 x2

Tendremos, por lo tanto, que resolver 3n incógnitas (los coeficientes a[i], b[i], c[i], i
= 1...n) para lo cual necesitaremos 3n ecuaciones.

Las ecuaciones las iremos almacenando en un vector que llamaremos eq

Las (n-1) primeras ecuaciones las obtendremos al imponer continuidad de la


función interpoladora en los (n-1) puntos intermedios del soporte:
s[i+1](xn[i])=s[i](xn[i]) (i = 1...(n-1)).

> for i from 1 by 1 to n-1 do


eq[i] := s[i+1](xn[i])=s[i](xn[i]):
od:

Las (n-1) siguientes condiciones las obtendremos al imponer la continuidad de las


derivadas primeras de la función interpoladora a izquierda y derecha de cada
punto del soporte.

Hay que tener, además, en cuenta, que las nuevas ecuaciones que se obtengan
deberán almacenarse en el vector eq pero a partir de la última posición que
se ocupó previamente. Por ello, ahora será necesario emplear un índice,
independiente del que controla el bucle, que se incremente en cada iteración.

> j:=1:
> for i from n by 1 to 2*n-2 do
eq[i] := evalf(D(s[j+1])(xn[j]))=evalf(D(s[j])(xn[j])):
j:=j+1:
od:

Las (n+1) condiciones siguientes las obtendremos imponiendo la igualdad de valor


de la función aproximadora y de la función a interpolar en los puntos del soporte.

40
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Al igual que antes, las nuevas ecuaciones que se obtengan deberán almacenarse
en el vector eq pero a partir de la última posición que se ocupó previamente.

> for j from 0 by 1 to n-1 do


eq[2*n-1+j]:=evalf(s[j+1](xn[j]))=evalf(f(xn[j])):
od:
> eq[3*n-1]:=s[n](xn[n])=f(xn[n]):

Hasta el momento, disponemos de (n-1) + (n-1) + (n+1) = 3n - 1 ecuaciones para


resolver 3n incógnitas.

Por lo tanto, nos falta una ecuación, que la obtendremos a partir de la condición
adicional dada por el enunciado:
f '(0) = 0

> eq[3*n]:=evalf(D(s[1])(xn[0]))=0:

Escribimos ahora el sistema de 3*n ecuaciones con 3*n incógnitas que se ha


generado

> for i from 1 by 1 to 3*n do


eq[i];
od;
a 2 + b 2 + c2 = a 1 + b 1 + c1

a 3 + 2 b 3 + 4 c3 = a 2 + 2 b 2 + 4 c2

b 2 + 2. c2 = b 1 + 2. c1

b 3 + 4. c3 = b 2 + 4. c2

a 1 = 0.

a 2 + b 2 + c2 = 1.

a 3 + 2. b 3 + 4. c3 = 32.

a 3 + 3 b 3 + 9 c3 = 243

b1 = 0

> for i from 1 by 1 to n do


inc[i] := a[i]:
od:

41
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> j:=n+1:
> for i from 1 by 1 to n do
inc[j] := b[i]:
j := j+1:
od:
>
> for i from 1 by 1 to n do
inc[j] := c[i]:
j := j+1:
od:
> for i from 1 by 1 to 3*n do
inc[i];
od;
a1

a2

a3

b1

b2

b3

c1

c2

c3

Ahora tendremos dos vectores: eq , inc, en los que estrán almacenadas las
ecuaciones y las incógnitas respectivamente.

Para resolver el sistema de ecuaciones, construímos dos secuencias, una para las
ecuaciones y otra para las incógnitas, a las que llamaremos sistema e incogn.

> sistema := seq(eq[m],m=1..3*n);


sistema := a 2 + b 2 + c2 = a 1 + b 1 + c1, a 3 + 2 b 3 + 4 c3 = a 2 + 2 b 2 + 4 c2,
b 2 + 2. c2 = b 1 + 2. c1, b 3 + 4. c3 = b 2 + 4. c2, a 1 = 0., a 2 + b 2 + c2 = 1.,
a 3 + 2. b 3 + 4. c3 = 32., a 3 + 3 b 3 + 9 c3 = 243, b 1 = 0

> incogn := seq(inc[r],r=1..3*n);


incogn := a 1, a 2, a 3, b 1, b 2, b 3, c1, c2, c3

Resolvemos el sistema anterior mediante el comando solve

42
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

> spline2:=solve({sistema},{incogn});
spline2 :=
{ a 1 = 0., a 3 = 516., b 3 = -544., a 2 = 28., b 2 = -56., c3 = 151., c1 = 1., b 1 = 0., c2 = 29. }

> for i from 1 by 1 to 3*n do


spline2[i];
od;
a 1 = 0.

a 3 = 516.

b 3 = -544.

a 2 = 28.

b 2 = -56.

c3 = 151.

c1 = 1.

b 1 = 0.

c2 = 29.

Costruimos tres vectores: vecta, vectb y vectc donde almacenaremos las


compnentes de a, b y c

> for i from 1 by 1 to n do


vecta[i]:=subs(spline2,a[i]);
od;
vecta1 := 0.

vecta2 := 28.

vecta3 := 516.

> for i from 1 by 1 to n do


vectb[i]:=subs(spline2,b[i]);
od;
vectb1 := 0.

vectb2 := -56.

vectb3 := -544.

> for i from 1 by 1 to n do


vectc[i]:=subs(spline2,c[i]);
od;

43
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

vectc1 := 1.

vectc2 := 29.

vectc3 := 151.

Construimos los tramos cuadráticos, definiéndolos como funciones a trozos

> for i from 1 by 1 to n do


spl[i]:=piecewise(xn[i-1]<=x and
x<=xn[i],vecta[i]+vectb[i]*x+vectc[i]*x^2):
od;
1. x2 −x ≤ 0 and x − 1 ≤ 0
spl1 := {
0 otherwise
28. − 56. x + 29. x2 1 − x ≤ 0 and x − 2 ≤ 0
spl2 := {
0 otherwise
516. − 544. x + 151. x2 2 − x ≤ 0 and x − 3 ≤ 0
spl3 := {
0 otherwise
Dibujamos los tramos cuadráticos

> for i from 1 by 1 to n do


plot(spl[i](x),x=xn[0]..xn[n]);
od;

44
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

45
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

46
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Sumamos todos los tramos para obtener la función interpoladora

> pspline := 0:
> for i from 1 by 1 to n do
pspline := pspline + spl[i]:
od:

Escribimos la función interpoladora

> pspline;
⎛ 1. x
2
−x ≤ 0 and x − 1 ≤ 0 ⎞ ⎛ 28. − 56. x + 29. x2 1 − x ≤ 0 and x − 2 ≤ 0 ⎞
⎜⎜ { ⎟⎟ + ⎜⎜ { ⎟⎟
⎝ 0 otherwise ⎠ ⎝ 0 otherwise ⎠
⎛ 516. − 544. x + 151. x 2 − x ≤ 0 and x − 3 ≤ 0 ⎞
2
+ ⎜{ ⎟⎟

⎝ 0 otherwise ⎠

47
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Dibujamos la función interpoladora

> plot(pspline(x),x=xn[0]..xn[n],color=black);

NOTA: MAPLE-7 dispone del comando spline() que permite calcular funciones
spline. Te dejamos como ejercicio propuesto consultar el uso de este comando.

> Fin;
Fin

48
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 8: Interpolación de Lagrange (III) ETSI Minas de la Univ. Politécnica de Madrid

Calcula el polinomio interpolador de Hermite p(x) de la función f(x) = sen(5·x)


sobre un soporte formado por 3 puntos {s0 , s1, s2} verificándose las siguientes
condiciones:
p(s0) = f(s0) , p’(s0) = f’(s0) , p”(s0) = f”(s0)
p(s1) = f(s1) , p’(s1) = f’(s1)
p(s2) = f(s2)

Toma como puntos de soporte para verificar el programa MAPLE que realices:
s0 = 0, s1 = π/2 , s2 = π

Representa la función interpoladora junto al polinomio interpolador. Asimismo


realiza un gráfico conel error de interpolación cometido.

> restart;
>
>
>
>
>
> fin;

49