Aproximación de una función a un polinomio de grado n

Dada una función f(x) continua en [a,b], vamos a buscar un polinomio Pn(x) de grado n

P n (x)= a 1 x n + a 2 x n1 +...+ a n x+ a n+1

tal que la integral

E= a b ( P n (x)f(x) ) 2 dx

sea mínima. Para calcular el mínimo, se deriva respecto a a1, a2...an+1

E a i =0i=1,2,...n+1

Obtenemos el siguiente sistema de n ecuaciones con n incógnitas

1 2 E a 1 =0 a b x n ( a 1 x n + a 2 x n1 +...+ a n x+ a n+1 f(x) ) dx=0 ... 1 2 E a n =0 a b x( a 1 x n + a 2 x n1 +...+ a n x+ a n+1 f(x) ) dx=0 1 2 E a n+1 =0 a b ( a 1 x n + a 2 x n1 +...+ a n x+ a n+1 f(x) ) dx=0

o bien,

a 1 a b x 2n dx + a 2 a b x 2n1 dx +...+ a n a b x n+1 dx + a n+1 a b x n dx = a b x n f(x)dx ... a 1 a b x n+1 dx + a 2 a b x n dx +...+ a n a b x 2 dx + a n+1 a b xdx = a b xf(x)dx a 1 a b x n dx + a 2 a b x n1 dx +...+ a n a b xdx + a n+1 a b dx = a b f(x)dx

Llamando

s k = a b x 2n+1k dxk=1,2,...2n+1 b k = a b x n+1k f(x)dxk=1,2,...n+1

Escribimos el sistema de n ecuaciones con n incógnitas de forma matricial

( s 1 s 2 ... s n s n+1 s 2 s 3 .... s n+1 s n+2 ... ... ... ... ... s n s n+1 ... s 2n1 s 2n s n+1 s n+2 ... s 2n s 2n+1 )( a 1 a 2 ... a n a n+1 )=( b 1 b 2 ... b n b n+1 )

Despejamos el vector a de las incógnitas utilizando el operador división por la izquierda \

Aproximación de la función ex a un polinomio de segundo grado

Calculamos los coeficientes a1, a2 y a3 del polinomio P2(x)=a1x2+a2x+a3

El sistema de ecuaciones en forma matricial se escribe

( s 1 s 2 s 3 s 2 s 3 s 4 s 3 s 4 s 5 )( a 1 a 2 a 3 )=( b 1 b 2 b 3 )

Los elementos de la matriz sk vales

s k = 1 1 x 2n+1k dx= x 2n+2k 2n+2k | 1 1 ={ 0kpar 2 2n+2k kimpar

Para obtener los elementos del vector b, integramos por partes, o bien, con la ayuda de Math Symbolic

>> int('x^2*exp(x)',x,-1,1)
ans =exp(1) - 5*exp(-1)
>> int('x*exp(x)',x,-1,1)
ans =2*exp(-1)
>> int('exp(x)',x,-1,1)
ans =exp(1) - exp(-1)

b 1 = 1 1 x 2 e x dx = x 2 e x 2x e x +2 e x | 1 1 =e 5 e b 2 = 1 1 x e x dx = x e x e x | 1 1 = 2 e b 3 = 1 1 e x dx = e x | 1 1 =e 1 e

El sistema de ecuaciones es el siguinte

( 2 5 0 2 3 0 2 3 0 2 3 0 2 )( a 1 a 2 a 3 )=( e 5 e 2 e e 1 e )

El siguiente script representa en el intervalo [-1,1], la función ex y el polinomio P2(x)=a1x2+a2x+a3

A=[2/5,0,2/3;0,2/3,0;2/3,0,2];
e=exp(1);
b=[e-5/e;2/e;e-1/e];
a=A\b;
p=@(x) polyval(a,x);
hold on
fplot(@exp,[-1,1]);
fplot(p,[-1,1])
hold off
legend('exponencial','polinomio','location','northwest')
grid on
xlabel('x')
ylabel('y')
title('Aproximando exp(x) a un polinomio')

Como vemos en la figura hay una diferencia apreciable entre la función y el polinomio de segundo grado P2(x)=a1x2+a2x+a3, cuyos coeficientes son

a =
    0.5367
    1.1036
    0.9963

Aproximación de la función ex a un polinomio de tercer grado

Elaboramos un script que nos permita aproximar la función ex a un polinomio de grado n, Pn(x) en el intervalo [-1,1]. Sea por ejemplo, n=3

n=3; %grado del polinomio
syms x;
s=zeros(2*n+1,1);
for k=1:2*n+1
    if rem(2*n+2-k,2)==0
        s(k)=0;
    else
        s(k)=2/(2*n+2-k);
    end
end
A=zeros(n+1,n+1);
for k=1:n+1
  A(k,:)=s(k:n+k);
end
b=zeros(n+1,1);
for k=1:n+1
    f=exp(x)*x^(n+1-k);
    b(k)=int(f,x,-1,1);
end
a=A\b;
p=@(x) polyval(a,x);
hold on
fplot(@exp,[-1,1]);
fplot(p,[-1,1])
hold off
legend('exponencial','polinomio','location','northwest')
grid on
xlabel('x')
ylabel('y')
title('Aproximando exp(x) a un polinomio')

Como vemos en la figura ya no hay apenas diferencia entre la función y el polinomio de tercer grado P3(x)=a1x3+a2x2+a3x+a4, cuyos coeficientes son

a = 
    0.1761
    0.5367
    0.9980
    0.9963

Aproximación de la función sin(πx) a un polinomio de segundo grado

Aproximamos la función sin(πx) a un polinomio de segundo grado en el intervalo [0,1]

Los valores de sk y de bk se calculan del siguiente modo

s k = 0 1 x 2n+1k dx= x 2n+2k 2n+2k | 0 1 = 1 2n+2k b k = 0 1 x n+1k sin( πx )dxk=1,2,...n+1

n=2; %grado del polinomio
syms x;
s=zeros(2*n+1,1);
for k=1:2*n+1
    s(k)=1/(2*n+2-k);
end
A=zeros(n+1,n+1);
for k=1:n+1
  A(k,:)=s(k:n+k);
end
b=zeros(n+1,1);
for k=1:n+1
    f=sin(pi*x)*x^(n+1-k);
    b(k)=int(f,x,0,1);
end
a=A\b;
p=@(x) polyval(a,x);
f=@(x) sin(pi*x);
hold on
fplot(f,[0,1]);
fplot(p,[0,1])
hold off
legend('sin(\pix)','polinomio','location','northwest')
grid on
xlabel('x')
ylabel('y')
title('Aproximando sin(\pix) a un polinomio')

Como vemos en la figura ya hay poca diferencia entre la función sin(πx) y el polinomio de segundo grado P2(x)=a1x2+a2x+a3, cuyos coeficientes son

a =
   -4.1225
    4.1225
   -0.0505