Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sesion 2 - Interpolacion Diferenciable y Polinomios Ortogonales (Matlab) PDF
Sesion 2 - Interpolacion Diferenciable y Polinomios Ortogonales (Matlab) PDF
Departamento de Matemática
Laboratorio de Computación para las Aplicaciones de la Matemática en
Ingeniería
Vq=interp1(X,V,Xq,method)
Donde
X = Datos del dominio
V = Datos del recorrido f(x)
Xq = Cantidad de puntos donde se evalua el interpolante
Vq = Valor del polinomio interpolante en los puntos “Xq”
Methdod = Método de interpolación a utilizar
clear
N=25;
X=linspace(0,5,N);
Y=sin(X);
Paso=0.2;
evaldom=X(1):Paso:X(end);
Val=interp1(X,Y,evaldom);
plot(X,Y,' o ',evaldom,Val,' - ')
pp.coef
En esta matriz cada fila representa un polinomio, mientras que las columnas contienen los
coeficientes ordenados de mayor a menor orden, ejecute el siguiente código para verlo
explícitamente
Nr=size(pp.coefs,1);
for i=1:Nr
Pol(i,1)=vpa(poly2sym(pp.coefs(i,:)));
end
Pol
Del resultado en pantalla, cada una de las filas representa un polinomio lineal que
interpola cada par de puntos entregados como datos. Para evaluar en un arreglo de puntos
se utiliza el comando ppval, por ejemplo:
Eval=X(1):0.2:X(end);
Valores=ppval(pp,Eval)
Notar además que las derivadas de las interpolantes no son continuas en los extremos de
cada una
Ejercicio.
En lugar de la función observe el mismo fenómeno con otras funciones: Bessel,
log, raíz, etc… varíe la cantidad de datos y puntos de muestreo
Primero generamos una tabla, en este caso de los cuadrados de los números de 1 hasta n .
clear
n = 15;
i = 1:n;
z=[0.5*i' sin(0.5*i')]
figure(1);
plot(z(:,1), z(:,2),'bo'); grid on;
title('Gráfica de la tabla'); xlabel('x'); ylabel('y');
Ahora se define una función que da las diferencias divididas de primer orden y
evaluemos en i=1, j=2:
(Esto es lo que en teoría se denota como f xi , xi .)
d=inline('(z(i,2)-z(j,2))/(z(i,1)-z(j,1))','i','j','z')
temp=d(1,2,z)
p1=inline('z(1,2)+temp*(x-z(1,1))','x','z','temp')
a = z(1,1);
b = z(2,1);
[a p1(a,z,temp) ]
temp=d(1,2,z)
[b p1(b,z,temp)]
temp=d(2,3,z);
p2=inline('z(2,2)+temp*(x-z(2,1))','x','z','temp')
[b p2(b,z,temp)]
[z(3,1) p2(z(3,1),z,temp)]
Tracemos:
clf;
figure(1);
plot(dib1(:,1), dib1(:,2),dib2(:,1),dib2(:,2)); grid on;
title('Gráfica de p1(x) y p2(x)'); xlabel('x'); ylabel('p1(x), p2(x)');
h=0.01;
for i=1:length(z)-1,
xj=z(i,1):h:z(i+1,1);
for j=0:length(xj)-1,
yi((length(xj)-1)*(i-1)+j+1)=z(i,2)+d(i,i+1,z)*(xj(j+1)-z(i,1));
end
end
disp('Listo')
xi = z(1,1):h:z(length(z),1);
figure(1);
plot(xi,yi,z(:,1),z(:,2),'r.'); grid on;
title('Tabla Interpolada y puntos de la tabla');
xlabel('x'); ylabel('y');
Se calculará diferencias de este tipo porque son las que se utilizan en interpolación.
PRIMERO: Colocaremos las diferencias en la tabla vista en teoría.
Pongamos la tabla de datos:
for i=1:n,
A(2*i-1,1)=z(i,1);
A(2*i-1,2)=z(i,2);
end
A
for j=1:n-1,
for i=1:n-j,
A(2*i+j-1,j+2)=di(i,j);
end
end
disp('Listo')
n=length(f);
t(1:2) = [z(1,2) f(1)*(z(10,1)-z(1,1))];
for i=2:n,
for k=1:i,
aux(k)=(z(10,1) - z(k,1));
end
t(i+1) = f(i)*prod(aux);
end
sum(t)
z(10,2)
clear t aux
for i=2:n,
for k=1:i,
aux(k)=(1.7 - z(k,1));
end
t(i+1) = f(i)*prod(aux);
end
sum(t)
sin(1.7)
clear t aux
n=length(f);
t(1:2) = [z(1,2) f(1)*(4.7-z(1,1))];
for i=2:n,
for k=1:i,
aux(k)=(4.7 - z(k,1));
end
t(i+1) = f(i)*prod(aux);
end
sum(t)
sin(4.7)
clear t aux
Excelente resultado
Grafico del polinomio de interpolación y superposición sobre el gráfico.
x=0:0.1:7.5;
n=length(x);
m=length(f);
for i=1:n,
t(1:2)=[z(1,2) f(1)*(x(i)-z(1,1))];
for j=2:m,
for k=1:j,
aux(k)=(x(i)-z(k,1));
end
t(j+1)=f(j)*prod(aux);
end
clear aux
y1(i)=sum(t);
clear t aux;
end
disp('Listo')
figure(1);
plot(x,y1,z(:,1),z(:,2),'ro'); grid on;
title('Grafico polinomio de interpolación y puntos de la tabla');
xlabel('x'); ylabel('y');
i xi y i y i'
0 1 2 1
1 2 1 -1
Sugerencia:
Emplear la fórmula en diferencias divididas del polinomio de Hermite. En este caso:
px 2 1 x x0 f x0 , x0 , x1 x x0 f x0 , x0 , x1 , x1 x x0 x x1
2 2
Polinomial Difereniciable
Con una interpolante cúbica por tramos podemos generar unapolinomial cúbica que
interpola la tabla y que sea diferenciable.
Primero generamos una tabla, en este caso de los valores de seno y su derivada entre
0.5,7.5
clear
n = 15;
i = 1:n;
z = [0.5*i' sin(0.5*i')];
dz = [0.5*i' cos(0.5*i')];
clf;
figure(1);
plot(z(:,1), z(:,2),'o'); grid on;
title('Gráfica de la tabla'); xlabel('x'); ylabel('y');
lar=length(dz);
d(1,1)=dz(1,2);
for i=1:lar-1,
d(2*i,1)=(z(i+1,2) - z(i,2))/(z(i+1,1) - z(i,1));
d(2*i+1,1)=dz(i+1,2);
end
d
lar = length(d);
for i=1:lar-1,
aux(i)=d(i+1,1)-d(i,1);
end
k=0;
for i=1:n-1,
div=z(i+1,1) - z(i,1);
k = k + 1;
d(2*i-1,2)=aux(k)/div;
k = k + 1;
d(2*i,2)=aux(k)/div;
end
d(:,2)
x1 = z(2,1);
p1 = z(1,2) + d(1,1)*(x1 - z(1,1)) + d(1,2)*(x1 - z(1,1)).^2 +
d(1,3)*(x1 - z(1,1)).^2.*(x1 - z(2,1));
[p1 z(2,2)]
h=0.1;
j=-1;
k=0;
n=length(z);
for i=1:n-1,
k = k + 1;
j = j + 2;
x=z(i,1):h:z(i+1,1);
m=length(x);
for ind=0:m-1,
yi((m-1)*(i-1)+ind+1)=z(k,2)+d(j,1)*(x(ind+1)-z(k,
1))+d(j,2)*(x(ind+1)-z(k, 1)).^2 + d(k,3)*(x(ind+1) - z(k,
1)).^2.*(x(ind+1) - z(k+1,1));
end
end
xi = z(1,1):h:z(n,1);
figure(1);
plot(xi,yi,z(:,1),z(:,2),'or'); grid on;
title('Gráfica del polinomio de interpolación'); xlabel('x');
ylabel('y');
Lo interesante es el hecho que la polinomial es diferenciable (nótese que está definida
por tramos) y que su derivada es una polinomial que interpola la derivada de la
función sin(x), que es de donde se sacó la muestra que está en la tabla dz.
Ejercicio
Ejercicio
Trate de construir para una tabla para tres abscisas, tres ordenadas, tres pendientes el
polinomio de interpolación de grado 5 que interpola la tabla.
Splines:
Definición, Spline de orden m:
Spline cúbica
La "Spline interpolante cúbico s(x)", que interpola la tabla (xi,yi), i=0,1,...,m es la spline
de orden 3 tal que :
¿ Cómo utilizar las condiciones para determinar fórmulas para los coeficientes ?
Grados de libertad.
Dos son los grados de libertad los cuales deben ser definidos por el usuario.
Los coeficientes que se deben determinar son 4 por cada subintervalo, en total: t = 4 n .
Sin embargo al contar el número de condiciones se tienen:
Se dice que las restricciones dan 2 grados de libertad para la elección de los coeficientes
en (2), en el sentido que hay dos condiciones menos que incógnitas. Estos dos grados de
libertad son una ventaja para el usuario puesto que queda a su arbitrio el imponerlas. Son
tres los casos usuales, examinaremos en esta oportunidad aquel caso que determina lo
que se llama "la spline natural”
Se define Mi= s''(xi) , i=0,1,....,n , hi= xi+1 - xi entonces se obtiene una fórmula para la
función lineal s''(x) en xi ≤ x ≤ xi+1:
(4)
Para i = 0,1,…, n-1. Se observa que (4) asegura la continuidad de s(x) y de s''(x). Falta
incorporar la condición de que s'(x) sea continua, esto es:
Esto conduce finalmente al sistema lineal de ecuaciones para despejar los Mi:
(6)
Para i = 1 , 2 ,.... , n - 1.
El sistema (6) solo tiene “n-1” ecuaciones pero “n+1” incógnitas M0, M1,.., MN.
Donde, especificando condiciones en los puntos extremos x0, xn "Se remueven los dos
grados de libertad citados", dando origen a los siguientes dos casos:
1.- Splines
Es posible crear un algoritmo que construya un interpolante cúbico por tramos utilizando
las condiciones mencionadas, sin embargo, para los intereses del curso, Matlab ya cuenta
con una función que crea el conjunto de Interpolantes a través del comando “splines”
help spline
Pp2=interp1(X,Y,'spline’,'pp');
help pchip
x = -5:10;
y = [6 6 6 6 6 6 6 5.5 4.5 3.5 3 3 3 3 3 3];
t = -5:.01:10;
p = pchip(x,y,t);
s = spline(x,y,t);
figure(1)
plot(x,y,'o',t,p,'-',t,s,'-.')
legend('data','pchip','spline',4)
Trate usted de realizar el mismo procedimiento pero para encontrar la cima perfecta de
un cerro, el cual está delimitado por las rectas y x para 0 x 2 , y 7 x para
5 x 7.
Intento de trazar la Bahía de Valparaiso usando Spline cúbica y calcular la longitud del
borde costero.
clear all
clc
X=[1 1.5 2.5 3.2 3.8 4.1 4.5 5.2 5.5 6 6.4 6.8 7.2 8 8.5 9 9.3 10 10.3 11
12 13 14 15 16 16.5 17 18 19 19.3 19.7 20.5 21.5 22 22.5 23 23.5 24.5 25
25.5 26 27 27.2 27.6 28.3 29 29.5 30 31 31.5 33 33.5 34.5 34.8 35 36 36.5
36.8 37.2 38 40.5 42 43 44.5];
Y=[12.9 14.5 15 15.2 15 14.5 14.2 14.3 14 13.5 12.9 11.5 10 9.8 8.5 7 4.3
2.8 2.2 2 1.6 1.5 1.5 1.6 1.8 2 2.3 3 4.3 4.7 4.8 5.3 6 6.4 6.4 6.6 7 7.5
7.8 8 8.5 9.8 10.8 11 11 11 10.3 10 9.8 10.2 11.4 11.4 12.5 13 14 14 14.7
14.8 14.6 15.5 18 21 24 32];
figure(1);
plot(X,Y,'-')
title('Bahia de Valparaiso')
Ahora veamos como por medio de la interpolación cúbica de Spline logramos el polinomio
que demarca la bahía de Valparaiso.
XX=1:0.7:45;
YY=ppval(spline(X,Y),XX);
figure(2);
plot(X,Y,'k',XX,YY,'b.')
title('Bahia de Valparaiso modelada por Spline')
Fantástico, hemos logrado obtener un polinomio que nos permite trazar la bahía de
Valparaíso, ahora ¿Cómo obtenemos la longitud de la bahia?, sugerencia: Una
aproximación sería calcular la longitud de la polinomial lineal que interpola la tabla.
Curvas de Beizer
Las técnicas de interpolación vistas en clase permite generar curvas que son
funciones de una variable. En el caso de Hermite se ha visto la necesidad de trazar curvas
que no son función de una variable pero que, descompuesta en tramos pueden reducirse a
una interpolación de Hermite. Sin embargo esto no es simple, requiere rotar las figuras,
etc...
Las llamadas "curvas de Bézier" fueron introducidas por el ingeniero mecánico y
eléctrico Pierre Bézier en 1966 mientras trabajaba para la industria de automóviles
Renault. Estas curvas se convietieron en una herramienta fundamental en el diseño asistido
por computador (CAD) a partir de 1975. Los detalles de su definición matemática y de
sus propiedades se verán a continuación.
Definición.
Una curva de Bézier es una curva que pasa por A( x 0 , y0 ) , B( x1 , y1 ) de
modo que su vector tangente en A es paralelo al vector U( a0 , b0 ) y su vector tangente en
B paralelo al vector V( a1 , b1 ).
function bez=bezier(t,A,U,V,B)
bez(1)=(2*(A(1)-B(1))+(U(1)+V(1)))*t^3+(3*(B(1)-A(1))-
(V(1)+2*U(1)))*t^2+U(1)*t+A(1);
bez(2)=(2*(A(2)-B(2))+(U(2)+V(2)))*t^3+(3*(B(2)-A(2))-
(V(2)+2*U(2)))*t^2+U(2)*t+A(2);
end
cd e:
for conta=1:2
func = 'function bez=bezier(t,A,U,V,B)\n\nbez(1)=(2*(A(1)-
B(1))+(U(1)+V(1)))*t^3+(3*(B(1)-A(1))-(V(1)+2*U(1)))*t^2+U(1)*t+A(1);
\nbez(2)=(2*(A(2)-B(2))+(U(2)+V(2)))*t^3+(3*(B(2)-A(2))-
(V(2)+2*U(2)))*t^2+U(2)*t+A(2);\nend\n';
a='bezier.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La función ha sido creada')
end
end
Propiedades
Examinemos algunas propiedades teóricamente.
En el siguente caso las coordenadas de los puntos y vector son: A(q0,q1), B(z0,z1) y los
vectores de dirección son U(r0,r1) , V(s0,s1).
clear
syms t q0 q1 z0 z1 r0 r1 s0 s1
A=[q0 q1];
B=[z0 z1];
U=[r0 r1];
V=[s0 s1];
curvas=bezier(t,A,U,V,B).'
Como se ve se logra una expresión de la curva paramétrica, utilizable para diversos fines.
Ejemplo.
Una curva con una pendiente de descenso mayor en (1,0).
clear
syms t
h=bezier(t,[0 0],[2 0.25],[0.25 -0.45],[1 0])
ezplot(h(1),h(2),[0,1])
hold on
Ejemplo 2.
Una curva con un ascenso fuerte en (0,0).
clear
syms t
h=bezier(t,[0 0],[0.1 2.5],[0.5 -0.1],[1 0])
ezplot(h(1),h(2),[0,1])
Ejemplo 3.
Una curva con un doblez en (1,0)
clear
syms t
h1=bezier(t,[0 0],[0.8 0.8],[-1 0.2],[1 0])
ezplot(h1(1),h1(2),[0,1])
Unamos la curva anterior con otra curva que llegue al origen para lograr aproximadamente
el perfil de un corte transversal de un ala de avión
h2=bezier(t,[1 0],[-2 0.2],[-0.2 -0.2],[0 0])
hold on
ezplot(h2(1),h2(2),[0,1])
grid on
Familia de Polinomios Ortogonales: Legendre , Chebyshev, Laguerre y
Hermite
Definiciones Generales
DEFINICIÓN
wx 1
wx
1
si a 1; b 1
1 x2
wx e x si a 0 ; b
wx e x si a ; b
2
clear
syms x
figure(1);
ezplot(1/sqrt(1-x^2),[-1 1]); grid on;
figure(1);
ezplot(exp(-x),[0 10]); grid on;
axis([0 10 0 1])
figure(1);
ezplot(exp(-x^2),[-8 8]); grid on;
axis([-8 8 0 1])
DEFINICIÓN
w=1;
double(int(w*sin(x)^2,-1,1))
El producto interno de sin(x) con cos(2x) en [-1,1] con respecto a la ponderación w = 1 es:
int(w*sin(x)*cos(2*x),-1,1)
int(w*sin(x)*cos(2*x),-1,1)
w=1/sqrt(1-x^2);
double(int(w*sin(x)^2,-1,1))
int(w*sin(x)*cos(2*x),-1,1)
p1=x^2;
p2=x^2+x^4;
int(w*p1*p2,-1,1)
Ejercicio.
(R:≈0.4)
(R:≈1.212)
DEFINICIÓN.
f , g 0
Ejemplo
w = 1;
p1 = 3*x^2-1;
p2 = 35*x^4 - 30*x^2 + 3;
int(w*p1*p2,-1,1)
DEFINICIÓN
Ejemplo.
Definamos un procedimiento que permita obtener los polinomios de Legendre definidos
más arriba:
function pol=legendre_pol(m)
syms x
p(1)=sym(1); %P0
p(2)=x; %P1
if m<0,
disp('Error, m debe ser >= 0');
return;
elseif m==0,
pol=p(1);
return
elseif m==1,
pol=p(2);
return
else
for n=1:m,
p(n+2) = (2*n + 1)/(n+1)*x*p(n+1) - n/(n+1)*p(n);
end
end
pol=simplify(p(m+1));
cd d:
for conta=1:2
func = 'function pol=legendre_pol(m)\n\nsyms x\np(1)=sym(1);
%P0\np(2)=x; %P1\n\nif m<0,\n disp(''Error, m debe ser >=0'');\n
return;\nelseif m==0,\n pol=p(1);\n return\nelseif m==1,\n
pol=p(2);\n return\nelse\n for n=1:m,\n p(n+2)=(2*n +
1)/(n+1)*x*p(n+1)-n/(n+1)*p(n);\n
end\nend\n\npol=simplify(p(m+1));\n';
a='legendre_pol.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La función ha sido creada')
end
end
Veamos los polinomios de Legendre para n = 0, 1,..., 6:
for n=0:6,
disp(sprintf('\nPolinomio P%d:',n));
disp(legendre_pol(n));
end
figure(1);
ezplot(legendre_pol(4),[-1 1]);
h=findobj(gcf,'type','Line');
set(h,'color','r');
hold on;
ezplot(legendre_pol(6),[-1 1]);
hold off;
xlabel('x'); title('Polinomios de Legendre');
grid on
Para comprobar que son ortogonales habrá que probar que la integralde los dos polinomios
sobre ]-1,1[ es cero:
figure(1);
ezplot(legendre_pol(2)*legendre_pol(6),[-1 1]); grid on;
xlabel('x');
int(legendre_pol(2)*legendre_pol(6),-1,1)
ceros_P6 = real(double(solve(legendre_pol(6))))
Conclusión:
Todos los ceros se encuentran en ]-1,1[ y están simétricamente ubicados con respecto al
origen.
1
si n m
2n 1
NOTA:
La propiedad 3) indica que la familia es ortogonal.
En 3) cuando n m está dando el valor de la norma al cuadrado.
Ejercicio.
Dibujar otros polinomios de Legendre, observar sus formas y calcular sus ceros o raíces
de la ecuación pn x 0 (estos ceros tienen una importancia fundamental en el
cálculo de integrales).Comprobar que son ortogonales los veinte primeros polinomios
calculando directamente los productos internos entre ellos. Comprobar las propiedades 2)
y la de la norma en 3).
Producto Interno
DEFINICIÓN.
El producto interno con respecto a wx
1
de dos funciones f , g definidas
1 x2
en el intervalo 1,1 se define:
f , g 1 wx f x g x dx
1
DEFINICIÓN.
function pol=chebyshev_pol(m)
syms x
T(1)=sym(1); %P0
T(2)=x; %P1
if m<0,
disp('Error, m debe ser >= 0');
return;
elseif m==0,
pol=T(1);
return
elseif m==1,
pol=T(2);
return
else
for n=1:m,
T(n+2) = 2*x*T(n+1) - T(n);
End
End
pol=simplify(T(m+1));
for conta=1:2
func = 'function pol=chebyshev_pol(m)\n\nsyms x\nT(1)=sym(1);
%P0\nT(2)=x; %P1\n\nif m<0,\n disp(''Error, m debe ser >= 0'');\n
return;\nelseif m==0,\n pol=T(1);\n return\nelseif m==1,\n
pol=T(2);\n return\nelse\n for n=1:m,\n T(n+2) =
2*x*T(n+1) - T(n);\n end\nend\n\npol=simplify(T(m+1));\n';
a='chebyshev_pol.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La función ha sido creada')
end
end
1) Grado del polinomio Tn es n y todos sus ceros están en 1,1 y ninguno fuera de él.
2) Tn 1 1 , n
0 si n m
3) Tn , Tm Tn x Tm x dx
1 1
si n m 0
1
1 x2
si n m 0
2
4) Los ceros de Tn son:
2i 1
xi cos , i 1,, n
2n
NOTA:
La propiedad 3) indica que la familia es ortogonal con respecto wx
1
.
1 x2
En 3) cuando n m está dando el valor de la norma al cuadrado.
Verificación de algunas propiedades
figure(1);
ezplot(chebyshev_pol(2),[-1 1]); hold on; grid on;
ezplot(chebyshev_pol(3),[-1 1]);
ezplot(chebyshev_pol(4),[-1 1]);
ezplot(chebyshev_pol(5),[-1 1]);
ezplot(chebyshev_pol(6),[-1 1]);
ezplot(chebyshev_pol(7),[-1 1]);
ezplot(chebyshev_pol(8),[-1 1]);
xlabel('x');
hold off;
figure(1);
ezplot(chebyshev_pol(8),[-1 1]); grid on;
i=1:8;
r1 = sort(double(solve(chebyshev_pol(8))))
r2 = sort((cos((((2*i-1)*pi)./(2*8))))')
int(w*chebyshev_pol(6)*chebyshev_pol(8),-1,1)
Producto Interno
DEFINICIÓN.
El producto interno con respecto a wx e x de dos funciones f , g definidas en el
intervalo 0, se define:
f , g 1 wx f x g x dx
1
L0 1
L1 x 1 x
2n 1 x
Ln 1 x Ln x Ln 1 x
n
n 1
n 1 n 1
function pol=laguerre_pol(m)
syms x L
L(1)=1; %P0
L(2)=1-x; %P1
if m<0,
disp('Error, m debe ser >= 0');
return;
elseif m==0,
pol=L(1);
return
elseif m==1,
pol=L(2);
return
else
for n=1:m,
L(n+2)=(2*n+1-x)/(n+1)*L(n+1)-n/(n+1)*L(n);
end
end
pol=simplify(L(m+1));
clear
for conta=1:2
func = 'function pol=laguerre_pol(m)\n\nsyms x L\nL(1)=1;
%P0\nL(2)=1-x; %P1\n\nif m<0,\n disp(''Error, m debe ser >=
0'');\n return;\nelseif m==0,\n pol=L(1);\n return\nelseif
m==1,\n pol=L(2);\n return\nelse\n for n=1:m,\n
L(n+2)=(2*n+1-x)/(n+1)*L(n+1)-n/(n+1)*L(n);\n
end\nend\n\npol=simplify(L(m+1));\n';
a='laguerre_pol.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La funcion ha sido creada')
end
end
PROPIEDADES de los polinomios de Laguerre.
0 si n m
Ln , Lm 0 e x Ln x Lm x dx
2) 1 si n m 0
hold on
for i=0:7
L(i+1)=laguerre_pol(i);
if i>1
ezplot(L(i+1),[0 10])
end
disp(char(L(i+1)))
end
hold off
ezplot(L(8),[0 25])
axis([0 25 -1 1])
grid on
solve(L(8))
syms x
int(exp(-x)*L(8)*L(8),0,inf)
int(exp(-x)*L(8)*L(7),0,inf)
Ejercicio.
Producto Interno
DEFINICIÓN.
intervalo , se define:
f , g wx f x g x dx
Se define la norma de f como : f f , g
0 si n m
H n , H m e x H n x H m x dx n
2
2 n! si n m
function H=hermite(N)
syms x H
H(1,1)=1;
H(2,1)=2*x;
for n=1:N-2
H(n+2,1)=simplify(2*x*H(n+1,1)-diff(H(n+1,1)));
end
Cree esta función:
for conta=1:2
func='function H=hermite(N)\nsyms x H\n H(1,1)=1;\nH(2,1)=2*x;\nfor
n=1:N-2\n\tH(n+2,1)=simplify(2*x*H(n+1,1)-diff(H(n+1,1)));\nend';
a='hermite.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La funcion ha sido creada')
end
end
Ejemplos
clear
syms x H
H=hermite(12)
figure(1)
hold on
for i=1:12
ezplot(H(i,1),[-4 4])
end
grid on
hold off
Veamos un gráfico donde se destacan los 8 ceros que tiene H[8] y los 7 ceros de H[7].
Observe el intercalamiento. Esta es una propiedad que tienen todos los polinomios
ortogonales.
figure(1)
clf
hold on
ezplot(H(9,1),[-4 4])
h=findobj(gcf,'type','Line');
set(h,'color','r');
axis([-3 3 -10000 10000])
grid on
ezplot(H(8,1),[-4 4])
axis([-3 3 -10000 10000])
grid on
hold off
Calculemos concretamente todos los ceros de H[8]. Esto se usa en integración numérica.
format long
real(double(solve(H(9,1))))
double(int(exp(-x^2)*H(9,1)*H(9,1),x,-inf,inf))
2^8*sqrt(pi)*factorial(8)
int(exp(-x^2)*H(7,1)*H(9,1),x,-inf,inf)
Ejercicio
Usted mismo haga verificaciones de las propiedades para cerciorarse. Juegue.
Para obtener una aproximación p*(x) de grado n por mínimos cuadrados de la función
f(x) , a x b utilizando polinomios ortogonales φk(x), k = 0, 1, ..., n en [a,b] respecto de
la función de peso w(x) :
Esto es, para obtener una aproximación basta calcular los ck y, para lograr esto basta
contar con una tabla con los valores de mi en (*) que llamaremos "momento de orden i".
Ejemplo Test
clear
format long
syms x
f = sin(x)-2*cos(x);
figure(1);
clf
ezplot(f,[-1 1]); grid on;
for i=0:5,
arg=f*legendre_pol(i);
temp=char(arg);
integrando=vectorize(temp);
c(i+1)=(2*i+1)/2*quadl(integrando,-1,1);
end
c=double(c)'
aproxf = 0;
for k=0:5,
aproxf = aproxf + c(k+1)*legendre_pol(k);
end
figure(1);
clf;
ezplot(f,[-1 1]); grid on; hold on;
h=findobj(gcf,'type','Line');
set(h,'color','r');
set(h,'Marker','o');
ezplot(aproxf,[-1 1]);
hold off
xlabel('x');
legend('fcn original','interpolacion',4);
EJEMPLO
Aproximemos la función gama en el intervalo [0.1, 5] utilizando polinomiosde Legendre.
Se grafica la función:
g=gamma(x);
figure(1);
clf
ezplot(g,[0.1 5]);
grid
Se cambia la variable para definirla en [-1,1]. Para esto se encuentra la función lineal que
expresa x en [0.1,5] en la nueva variable t en [-1,1].
syms x
xt=(5-0.1)/2*x+(5+0.1)/2;
gt=gamma(xt);
ezplot(gt,[-1 1]);
grid
for i=0:9,
arg=gt*legendre_pol(i);
temp=char(arg);
integrando=strrep(temp,'^','.^');
integrando=strrep(integrando,'*','.*');
c(i+1)=(2*i+1)/2*quadl(integrando,-1,1);
end
c=double(c)
aproxg = 0;
for k=0:9,
aproxg = aproxg + c(k+1)*legendre_pol(k);
end
figure(1);
clf;
ezplot(aproxg,[-1 1]); grid on; hold on;
h=findobj(gcf,'type','Line');
set(h,'color','r');
set(h,'Marker','o');
ezplot(gt,[-1 1]);
hold off
xlabel('x');
legend('interpolacion','fcn original',4);
APROXIMACION USANDO POLINOMIOS DE CHEBYHSEV
Ejemplo
Test: Aproximar la función ,x [-1,1] utilizando polinomios
de Chebyshev. Se grafica la función:
clear
syms x
f = sin(x)-2*cos(x);
figure(1);
clf
ezplot(f,[-1 1]); grid on;
w=1/sqrt(1-x^2);
d=[1 2*ones(1,10)];
for i=0:5,
arg=w*f*chebyshev_pol(i);
temp=char(arg);
integrando=strrep(temp,'^','.^');
integrando=strrep(integrando,'*','.*');
integrando=strrep(integrando,'/','./');
c(i+1)=d(i+1)/pi*quadl(integrando,-1,1,1e-9);
end
c'
aproxf = 0;
for k=0:5,
aproxf = aproxf + c(k+1)*chebyshev_pol(k);
end
ezplot(f,[-1 1]); grid on; hold on;
h=findobj(gcf,'type','Line');
set(h,'color','r');
set(h,'Marker','o');
ezplot(aproxf,[-1 1]);
hold off
xlabel('x');
legend('fcn original','interpolacion',4);
Ejercicio.
Calcule la aproximación de grado 5 si la lista de los momentos de una función
desconocida g(x)
, son:
m(0) = 0 ; m(1) = 1.81183 ; m(2) = 0; m(3) = 1.2576; m(4) = 0. ; m(5) = 1.00719
Ejemplo.
Consideraremos un hilo que se enrolla dentro del círculo unitario con un paso
decreciente tendiendo a cero, por lo cual el enrollamiento es infinito. No así la longitud
total del hilo.
t=0:0.01:150*pi;
x1=cos(t).*exp(-t/200);
y1=sin(t).*exp(-t/200);
plot(x1,y1)
grid on
syms t real
x=cos(t)*exp(-t/200);
y=sin(t)*exp(-t/200);
dx=diff(x)
dy=diff(y)
El diferencial de longitud
ds=sqrt(dx^2+dy^2)
La longitud del hilo utilizado al enrollarlo x/2Pi veces. Haciendo tender el enrollado al
infinito se logra la longitud total
syms x
r=int(ds,0,x)
double(limit(r,x,inf))
temp=double(int(ds,t,0,inf))
Dibujemos la función r. Se observa que se estaciona dando de la longitud total
syms x
r=simplify(int(ds,t,0,x));
ezplot(r,[0 1000])
grid on
for i=1:13
mo(i)=double(int(r*exp(-x)*x^(i-1),0,inf));
end
mo.'
for i=1:12
L(i,1)=laguerre_pol(i);
end
disp('Listo')
1
L0r=mo(1)
L(1,1)
L1r=mo(1)-mo(2)
L(2,1)
L2r=mo(1)-2*mo(2)+1/2*mo(3)
L(3,1)
L3r=mo(1)-3*mo(2)+3/2*mo(3)-1/6*mo(4)
y la aproximación
r3=simplify(1*L0r+L(1,1)*L1r+L(2,1)*L2r+L(3,1)*L3r)
ezplot(r3,[0 300]); grid on; hold on;
h=findobj(gcf,'type','Line');
set(h,'color','r');
ezplot(r,[0 300])
hold off
Comparativamente sirve bien para x<150 después se separa. Se necesitaría para x mayores
una aproximación de grado mayor.
Para calcular una aproximación de grado mayor habría que automatizar el proceso anterior.
Puesto que lo que se necesita son los coeficientes de los polinomios utilizamos el comando
sym2poly que da la lista de ellos.
Lr(1)=mo(1);
Lr(2)=mo(1)-mo(2);
for n=2:7
Lr(n+1)=sym2poly(L(n-1,1))*-sort(-mo(1:n))';
end
Lr'
r6= simplify(sum(Lr(3:8)'.*L(1:6,1)))
ezplot(r3,[0 500]); grid on; hold on;
h=findobj(gcf,'type','Line');
set(h,'color','r');
ezplot(r6,[0 500]); grid on; hold on;
h=findobj(gcf,'color','b');
set(h,'color','k');
ezplot(r,[0 500])
hold off
legend('Aprox grado 3','Aprox grado 6','Valor exacto',4)
La aproximación sexta funciona bien para x<400 despues se separa y se necesitaría una
aproximación de orden mayor. Y así sucesivamente.
Ejercicio.
Obtenga la aproximación de grado 10 y compárela con r.
Ejemplo.
Expresemos la función f x en polinomios de Hermite
clear
syms x
f=(x-1)*(2-x)*(4-x)*(x+2);
ezplot(f,[-3 3])
grid on
e x f x H n dx
2
Cn
2 n n!
Cálculo de la aproximación de f x en términos de polinomios de Hermite
for i=1:6
num=double(int(exp(-x^2)*f*H(i),-inf,inf));
denom=(2^(i-1)*factorial(i-1)*sqrt(pi));
C(i,1)=(num/denom);
end
C
aprox=simplify(sum(C.*H));
ezplot(aprox,[-3 3])
h=findobj(gcf,'type','Line');
set(h,'color','r');
set(h,'marker','o');
hold on
grid on
ezplot(f,[-3 3])
legend('aproximacion','exacto',4)
hold off
La respuesta era predecible por unicidad por cuanto se trataba de un polinomio de grado 4.
Lo interesante es que los coeficientes de Fourier dan exactamente el resultado que de una
forma más larga puede conseguirse resolviendo un sistema de cinco ecuaciones lineales.
Ejemplo.
Aproximar la función f x
1
usando polinomios de Hermite de grado menor o
x 1
2
igual que 8
clear
syms x h y
digits(50);
f=inline('x^7','x');
figure(1);
ezplot(f,[1.99 2.01]);
grid on;
xlabel('X');
ylabel('f(x)=x^7');
x=3;
vpa(limit((f(x+h)-f(x))/h,h,0.01)) %Límite por la derecha
vpa(limit((f(x)-f(x-h))/h,h,0.01)) %Límite por la Izquierda
vpa(limit((f(x+h/2)-f(x-h/2))/h,h,0.01)) %Diferencia Central
w=inline('7*y^6','y');
vpa(w(3))
La Diferencia Central es la que dá una mayor cantidad de cifras significativas.
clear r
vpa(limit((f(x+h)-2*f(x)+f(x-h))/h^2,h,0.001))
w=inline('42*y^5','y');
vpa(w(3))