## Interpolación polinómica de Lagrange

kill(all);

Introducimos los datos del problema

xx : [-1.0,0.0,1.0, 2.0] $
yy : [2.0, 1.0, 2.0, 5.0] $
n : length(xx) $

Visualizamos los datos:

xy : create_list([xx[i],yy[i]],i,1,n);

wxplot2d([discrete,xy],[style,points])$

### Fórmula de Lagrange

Base de Lagrange

l(i,x) := product((x-xx[j])/(xx[i]-xx[j]),j,1,i-1) * product((x-xx[j])/(xx[i]-xx[j]),j,i+1,n)$

Polinomio interpolante

pol1(x) := sum(yy[i]*l(i,x),i,1,n)$

pol1(x);

 Aquí podemos observar los redondeos internos:

expand(pol1(x));

Representación gráfica de los datos y el polinomio interpolador:

wxplot2d( [[discrete,xy], pol1], [x, xx[1], xx[n]], 
        [style, [points,3,2], [lines,1,1]]) $

### Fórmula de Newton

Construimos la tabla de diferencias divididas

tdd : zeromatrix(n, n) $
tdd[1] : yy $
tdd : transpose(tdd) $

for j : 2 thru n do(
    for i : j thru n do(
    tdd[i,j] : (tdd[i-1, j-1]-tdd[i,j-1])/(xx[i-j+1]-xx[i])
    )
)$

tdd;

pol2(x) := sum(tdd[i,i]*prod((x-xx[j]),j,1,i-1),i,1,n)$

pol2(x);

expand(pol2(x));

Representación gráfica de los datos y el polinomio interpolador:

wxplot2d( [[discrete,xy],pol2], [ x, xx[1], xx[n]], 
        [style, [points,3,1], [lines,1,3]]) $

## Interpolación con funciones Spline

### Potencias truncadas

potr(x, x0, m) := if x<x0 then 0 else (x-x0)^m $

dpotr(x, x0, m) := if x<x0 then 0 else m*(x-x0)^(m-1) $

### Spline cúbico sujeto

keepfloat : true $

c3 : makelist(c3[i],i,1,n+2)$

s3(x) := c3[1] + c3[n]*x + c3[n + 1]*x^2 + c3[n + 2]*x^3 + 
    sum(c3[i]*potr(x, xx[i], 3), i, 2, n - 1)$

ds3(x) := c3[n] + 2*c3[n+1]*x + 3*c3[n+2]*x^2 + sum(c3[i]*dpotr(x,xx[i],3),i,2,n-1)$

eqn3 : append(makelist(s3(xx[i])= yy[i], i, 1, n), 
        [ds3(xx[1])= 0, ds3(xx[n])=0])$

coef3 : linsolve(eqn3,c3)$

Representación gráfica de los datos y el sline:

ss3(x) := subst(coef3,s3(x)) $
wxplot2d( [[discrete,xy],ss3], [x, xx[1], xx[n]], [y,-2,6],
        [style,[points,3,1],[lines,1,3]]) $