# Aproximación por mínimos cuadrados

Miguel Piñar, 8 de Marzo de 2011

## Minimos cuadrados contínua

Aproximar exp(x) en P_2 con el producto escalar dado por <f,g>=integrate(f*g,x,-1,1)

G: genmatrix(lambda([i,j], integrate(x^(i-1)*x^(j-1),x,-1,1)), 3, 3);

b: genmatrix(lambda([i,j], integrate(x^(i-1)*exp(x),x,-1,1)), 3, 1);

a:float(invert(G).b);

invert(G);

u(x):=[1,x,x^2].a;

u(x);

plot2d([exp(x),u(x)], [x,-1,1],
 [plot_format, gnuplot],
 [gnuplot_preamble, "set zeroaxis;"])$

Definimos un producto escalar

pe (expr1,expr2) :=integrate(expr1*expr2,y,-1,1);

Método de Gram-Schmidt

N:2;

base:makelist(y^j,j,0,N);

load (eigen)$

  baseo:gramschmidt(base, pe);

Los polinomios obtenidos coinciden con los polinomios de Legendre salvo factor de normalización

load(orthopoly);

leg:makelist(expand(legendre_p(n,y)),n,0,2);

expand(leg[3]*2/3);

Aproximar exp(x) en P_2 usando: 1) la base ortogonal obtenida por Gram-Schmidt y 2) la base de polinomios de Legendre 

1) con la base ortogonal obtenida por Gram-Schmidt

a1(k):=pe(exp(y),baseo[k+1])/pe(baseo[k+1],baseo[k+1]);

coeff1:makelist(a1(k),k,0,2);

float(expand(coeff1));

u1(y):=coeff1.baseo;

float(expand(u1(y)));

2) con polinomios de Legendre

a2(k):=pe(exp(y),leg[k+1])/pe(leg[k+1],leg[k+1]);

coeff2:makelist(a2(k),k,0,2);

u2(y):=coeff2.leg;

float(expand(u2(y)));

Ejercicio: Aproximar sin(2*%pi*x) en P_5 con el producto escalar dado por <f,g>=integrate(f*g,x,-1,1) 
usando la base usual y una base ortogonal obtenida por Gram-Schmidt

## Mínimos cuadrados discreta

Aproximar exp(x) en P_2 con el producto escalar dado por 

<f,g>=f(1)*g(1)+f(1/3)*g(1/3)+f(-1/3)*g(-1/3)+f(-1)*g(-1)

kill(all);

sum(f(-1+2*k/3)*g(-1+2*k/3),k,0,3);

ped(expr1,expr2):=sum(subst(-1+2*k/3,y,expr1)*subst(-1+2*k/3,y,expr2),k,0,3);

f(x):=exp(x);

Gd: genmatrix(lambda([i,j], ped(y^(i-1),y^(j-1))), 3, 3);

bd: genmatrix(lambda([i,j], ped(y^(i-1),f(y))), 3, 1);

invert(Gd);

a:float(invert(Gd).bd);

u(x):=[1,x,x^2].a;

u(x);

data:makelist([-1+2*k/3,exp(-1+2*k/3)],k,0,3);

plot2d([[discrete,data],exp(x),u(x)],[x,-1,1],
[style,points,lines,lines]);

Aproximar exp(x) en P_2 con producto escalar ped usando la base ortogonal obtenida por Gram-Schmidt

N:2;

based:makelist(y^j,j,0,N);

load (eigen)$

  baseod:gramschmidt(based, ped);

ad(k):=ped(exp(y),baseod[k+1])/ped(baseod[k+1],baseod[k+1]);

coeffd:makelist(ad(k),k,0,2);

float(expand(coeffd));

u(y):=coeffd.baseod;

float(expand(u(y)));

Ejercicio: Aproximar sin(2*%pi*x) en P_5 con el producto escalar discreto  
<f,g>=f(1)*g(1)+f(2/3)*g(2/3)+f(1/3)*g(1/3)+f(0)*g(0)+f(-1/3)*g(-1/3)+f(-2/3)*g(-2/3)+f(-1)*g(-1) 
usando la base usual y una base ortogonal obtenida por Gram-Schmidt