You are on page 1of 10

Polinomio de interpolacin de Lagrange: C++ Linux

Publicado el 2 junio, 2010por Jos Guerrero

Si tenemos n pares ordenados correspondientes a Y como una funcin de X,


siempre es posible unirlos mediante una funcin polinmica a la cual
denominaremos polinomio de interpolacin. El procedimiento numrico de
Lagrange, que da lugar a un polinomio de grado n-1, es el que nos ocupa para el
siguiente cdigo:
1

#include <iostream>

#include <fstream>

3
4

using namespace std;

5
6

#include <iomanip>

7
8

void monomio2(int n, double *x, double *D);

9
int main () {

10
11
cout << "Polinomio de interpolacion de Lagrange\n\n";

12
13
ifstream label1 ("datos//datos.in");

14
15
16

int n, i, j, k;

17
18

label1 >> n;

19
20

double *x, *xp, *f, *L, *D, producto, sum, *P;

21
22
23

x = new double [n], xp = new double [n], f = new double [n];


L = new double [n], D = new double [n+1], P = new double [n];

24
25

cout << "Numero de pares ordenados = " << n << "\n\n";

26
cout << "Valores de x y f(x)\nx

f(x)\n";

27
28
for (i= 0; i < n; i++){

29
30
label1 >> x[i] >> f[i];

31

cout << x[i] << setw(5) << setiosflags(ios::right) << f[i] << "\n";

32
33

34
35
36

cout << endl;

37
38

for (k = 0; k < n; k++){

39
40

producto = 1;

41
for (i = 0; i < n; i++){

42
43

if (i != k) producto = producto * (x[k] - x[i]);

44
45
}

46
47

L[k] = f[k]/producto;

48
49
}

50
51
cout << "Coeficientes de interpolacion de Lagrange\n\n";

52
53

cout.setf(ios::fixed);

54
55
56

cout.precision(1);

57
58
59

for (i= 0; i < n; i++){

60

cout << "L(" << n-i-1 << ") = " << setw(4) << setiosflags(ios::right)

61
62
63

64
65

cout << endl;

66
67

for (k = 0; k < n; k++){

68
j = 0;

69
70
for (i = 0; i < n; i++){

71
72
if (i != k) {xp[j] = x[i]; j += 1;}

73
74
75
76

monomio2 (n-1, xp, D);

77
78

for (i= 0; i < n; i++){

79
80

P[i] = P[i] + L[k]*D[i];

81
82
}

83
84
85

86

cout << "Polinomio de interpolacion de Lagrange (grado " << n-1 << ")\n\n

87
88
for (i= 0; i < n; i++){

89
90

cout << "P(" << n-i-1 << ") = " << setw(4) << setiosflags(ios::right)

91
92

93
94
95
96

return 0;

97

98
99
10
0

void monomio2(int n, double *x, double *D){

double *E;

10
1
10
2
10
3

E = new double [n];

D[0] = 1;

10
4
D[1] = -x[0];

10
5
10
6
10
7

for (int i = 1; i < n; i++) {

for (int k =1; k < i+1; k++) {

10
8
E[k] = D[k] + D[k-1]*(-x[i]);

10
9
110
111

D[i+1] = D[i]*(-x[i]);

112
113

for (int j = 1; j < i+1; j++) {

114
115

D[j] = E[j];

116
117
}

118
119
}

12
0
12
1
12
2
12
3
12
4
12
5
12
6
12
7
12

delete E;

8
12
9
Lo emplearemos para encontrar el polinomio de interpolacin de Lagrange (de
grado 2) a partir de tres pares ordenados (x, f(x)) que gener usando la ecuacin de
la parbola:
f(x) = x + 2x -5
Los valores utilizados fueron los siguientes:
1

0 -5

1 -2

Estos valores, conjuntamente con el nmero de pares ordenados (colocado al


inicio), se incluyeron en el archivo datos/datos.in y se introducen desde el
programa principal. El algoritmo usa la funcin monomio2, que incluye unas
ligeras modificaciones en la ya conocida monomio, para permitir en este caso
determinar los desarrollos de (x-x1).( x-x2) (x-xn), en lugar de (x+x1).( x+x2)
(x+xn), para cada i diferente de k. Despus de copiar el cdigo y grabarlo como
lagrange.c++, abrimos una cnsola y nos vamos hacia la carpeta LAGRANGE y lo
compilamos con:
g++

lagrange.c++

-o

La ejecucin del mismo (./lagrange [Enter]) produce esta salida:


1
2

Polinomio de interpolacion de Lagrange

lagrange

Numero de pares ordenados = 3

4
5
6
7
8

Valores de x y f(x)
x f(x)
0 -5
1 -2
2 3

9
1
0

Coeficientes de interpolacion de Lagrange

11
1
2

L(2) = -2.5
L(1) = 2.0

1
3

L(0) = 1.5

1
4
Polinomio de interpolacion de Lagrange (grado 2)

1
5
1
6

P(2) = 1.0
P(1) = 2.0

1
7
1
8
1

P(0) = -5.0

9
2
0
2
1
donde se verifica que los coeficientes del polinomio cuadrtico obtenido ajustan
perfectamente a la ecuacin f(x) = x + 2x -5 ya referida. Sin embargo, no nos
emocionemos tanto por este xito. Si incluimos, por ejemplo, 10 pares ordenados
para los valores experimentales de una variable como funcin de otra, el polinomio
que obtendramos sera de grado 9 y, aunque pasar por todos los puntos
considerados, la grfica que obtendremos posiblemente se comportar de una
manera no deseada fuera de ellos. Existen tcnicas de interpolacin ms poderosas
como la de los splines pero, este caso, es vlido e interesante como ejercicio de
programacin.
Acerca de estos anuncios

You might also like