Вы находитесь на странице: 1из 38

Universidad Técnica Federico Santa María

Departamento de Matemática
Laboratorio de Computación para las Aplicaciones de la Matemática en
Ingeniería

LABORATORIO DE ANÁLISIS NUMÉRICO - MAT270


Segunda Sesión versión MATLAB
Interpolación diferenciable y Polinomios ortogonales
Semana del Lunes 21 al Viernes 25 de Abril de 2014

Coordinador Académico de Laboratorio : Profesor Jaime Figueroa Nieto


(jaime.figueroa@usm.cl)
Ayudante Coordinador y de Software : Gonzalo Cornejo (gonzalo.cornejog@gmail.com)
Sitio Web : http://lab.mat.utfsm.cl
Horario de Atención de alumnos : A través de Internet a los ayudantes
coordinadores.
Interpolantes polinomiales continuos
Es posible crear una curva interpolante unidimensional en Matlab utilizando el comando
„interp1‟ cuya sintaxis es:

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

Dentro de los métodos están:


1. „linear‟ : Interpolante lineal a tramos (default)
2. „nearest‟ : Conserva el valor del dato más cercano
3. „spline‟ : Interpola utilizando el método splines (detallado más adelante)
4. „pchip‟/‟cubic‟ : Interpolante cúbica por tramos (detallado més adelante)

Utilicemos un ejemplo de interpolación lineal de la función seno en el intervalo x ϵ [0, 5]


utilizando 25 datos equi-espaciados y evaluando el interpolante con un paso de 0.2.

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,' - ')

Observe el grafico con detención y determine la calidad de la aproximación dada por la


línea continua, pruebe variando la cantidad de puntos y el paso de evaluación ¿Qué
concluye respecto a la precisión de la aproximación?

En el ejemplo anterior, una forma de obtener los coeficientes es utilizando la opción


“pp”, esto permite guardar los polinomios Interpolantes para evaluación, realizar
operaciones lineales y examinar el comportamiento de la aproximación.
Realicemos una aproximación, esta vez a la función utilizando el mismo
dominio y cantidad de puntos que el ejemplo anterior
clear
N=25;
X=linspace(0,5,N);
Y=exp(X);
pp=interp1(X,Y,'linear', 'pp');

Si se observa con detención, se ha creado la variable “pp” de tipo “struct” que es en sí


una variable que contiene varios datos dentro de sí, En este caso nos interesan los
coeficientes de los polinomios Interpolantes

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)

Graficando los resultados


plot(X,Y,'o',Eval,Valores,'-')

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

Nota: Todo lo anterior es análogo para interpolación 2D y 3D utilizando „interp2‟ e


„interp3‟, para mayor detalle utilizar la ayuda del programa o buscar los comandos en la
página de mathworks http://www.mathworks.com/help/matlab/
Polinomios de Interpolación en Diferencias Divididas de Newton
(OPCIONAL)
Esta es otra forma de obtener un polinomio de interpolación y tiene la ventaja de solo
manipular tablas.
Calculemos las diferencias de primer orden de una tabla dada.

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')

En particular p1 x   f x0   f x0 , x1 x  x0  corresponde al polinomio lineal que


interpola los dos primeros puntos de la tabla.

Comprobemos que la recta pasa por los dos puntos:

a = z(1,1);
b = z(2,1);
[a p1(a,z,temp) ]

temp=d(1,2,z)

[b p1(b,z,temp)]

Interpolemos en el siguiente tramo y mostremos el trazado

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:

dib1 = [z(1,1) p1(z(1,1),z,d(1,2,z));z(2,1) p1(z(2,1),z,d(1,2,z))];


dib2 = [z(2,1) p2(z(2,1),z,d(2,3,z)); z(3,1) p2(z(3,1),z,d(2,3,z))];
figure(1);
subplot(2,1,1), plot(dib1(:,1), dib1(:,2)); grid on;
title('Gráfica de p2(x)'); xlabel('x'); ylabel('p2(x)');
subplot(2,1,2), plot(dib2(:,1), dib2(:,2)); grid on;
title('Gráfica de p2(x)'); xlabel('x'); ylabel('p2(x)');

Los dos Juntos:

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)');

Las siguientes líneas de código calculan la interpolante polinomial correspondientes a la


tabla formada de las interpolantes lineales en intervalos sucesivos.
Para esto, se calcula la recta que interpola cada sub intervalo y en base a esta se calculan
los puntos intermedios en los puntos xi ,xi  h,xi  2h,, xi  1.

Calculemos la interpolante polinomial lineal correspondiente a la tabla y luego


grafiquémoslo.

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');

Ahora se define recursivamente las diferencias divididas de orden superior.


Esto en teoría esto se denota: f x0 ,, x1  .

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

Pongamos las diferencias divididas de primer orden:


for i=1:n-1,
A(2*i,3)=d(i,i+1,z);
A(2*i,3)=d(i,i+1,z);
end
A

Ahora calculemos todas las diferencias divididas de orden superior.Las diferencias de


primer orden:
for i=1:n-1,
di(i,1)=d(i,i+1,z);
end
di(:,1)

Las diferencias de segundo orden


for i=1:n-2,
di(i,2)=di(i+1,1) - di(i,1)/(z(i+2,1) - z(i,1));
end
di(:,2)

Las diferencias de tercer orden


for i=1:n-3,
di(i,3)=(di(i+1,2) - di(i,2))/(z(i+3,1) - z(i,1));
end
di(:,3)

Las diferencias de orden superior


for j=4:n,
for i=1:n-j,
di(i,j)=(di(i+1,j-1) - di(i,j - 1))/(z(i+j,1) - z(i,1));
end
end
disp('Listo')

for j=1:n-1,
for i=1:n-j,
A(2*i+j-1,j+2)=di(i,j);
end
end
disp('Listo')

De acuerdo con la fórmula que se ve en teoría, las diferencias en la diagonal superior


permiten calcular los polinomios de interpolación de orden a lo más n  1
f=di(1,:)'

Comprobemos que se logra la tabla.


Calculemos la lista completa de los términos del polinomio de orden n  1

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

Veamos cuantos nos da para x  1.7

t(1:2) = [z(1,2) f(1)*(1.7-z(1,1))];

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

Excelente resultado, veamos qué pasa para x  4.7

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');

Interpolación de Hermite Cúbica (OPCIONAL)


Ejercicio

Calcule el polinomio de interpolación de Hermite cúbico que interpola la tabla:

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:
px   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');

Para calcular la polinomial de Hermite cúbica necesitamos calcular las diferencias de


primer orden entre abcisas consecutivas y alternarlos con los valores de la derivada para
lograr:
 f ' x1 , f x1 , x2 , f ' x2 , f x2 , x3 , f ' x3 ,, f , xn , f ' xn 
Calculemos la tabla de diferencias para interpolar mediante Hermite:

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

En seguida se calculan las diferencias de orden dos:


 f x1 ,x1 ,x2 , f x1 , x2 , x2 , f x2 ,x2 ,x3 , f x2 ,x3 ,x3 ,, f ,xn ,xn  usando para ello la
tabla anterior.

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)

Ahora se calculan las siguientes diferencias de orden 3:


 f x1 ,x1 ,x1 ,x2 , f x2 ,x2 ,x3 ,x3 , f x3 ,x3 ,x4 ,x4 ,, f ,,xn ,xn 
k=0;
for i=1:length(z)-1,
k = k + 1;
d(i,3)=(d(2*i,2) - d(2*i-1,2))/(z(k+1,1) - z(k,1));
end
d(:,3 )
Ahora se forma la polinomial. Mostremos los dos primeros tramos en forma explícita:
x1 = z(1,1):0.01: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));
x2 = z(2,1):0.01:z(3,1);
p2 = z(2,2) + d(3,1)*(x2 - z(2,1)) + d(3,2)*(x2 - z(2,1)).^2 +
d(3,3)*(x2 - z(2,1)).^2.*(x2 - z(3,1));
clf;
figure(1);
subplot(1,2,1), plot(x1,p1); grid on;
title('Primer tramo de la interpolación'); xlabel('x'); ylabel('y');
subplot(1,2,2), plot(x2,p2); grid on;
title('Segundo tramo de la interpolación'); xlabel('x'); ylabel('y');

Los dos tramos juntos:


clf;
figure(1);
plot([x1 x2],[p1 p2]); grid on;
title('Primeros dos tramos de la interpolación'); xlabel('x');
ylabel('y');

Verifiquemos las condiciones en x1 , x2 


x1 = z(1,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(1,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)]

Ahora construyamos la polinomial

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

Adecuando el estudio anterior trate de construir interpolantes para otras funciones y


sus derivadas.

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.

Interpolantes polinomiales diferenciables (Hermite y Splines)


Dentro de las opciones de integración dadas por „interp1‟estan pchip y splines. Ambos
son métodos de interpolación por tramos que, a diferencia de la interpolación lineal y la
cuadrática tienen como condición la continuidad de la derivada en los puntos de entrada.

Splines:
Definición, Spline de orden m:

Considere la malla de puntos a= X0 < X1< ... < Xn= b.


Para m >= 1, " s(x) es una función Spline de orden m en el intervalo ]-∞,∞[" si:
1) s(x) es un polinomio de grado ≤ m en cada subintervalo ] -∞, X0],[X0, X1],...,[Xn, ∞[
2) La derivada sr (x) es una función continua en ]- ∞,∞ [ , para 0≤ r ≤ m – 1

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 :

s(xi) = yi , i = 0 , 1 ,...., n (1)

Si la spline es cúbica en cada intervalo entonces es de la forma:

s(x) = ai+ bi x +ci x2+ di x3 , xi-1≤ x ≤ xi , i = 1, 2, ...., n (2)

¿ 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:

a) n+1 condiciones de interpolación dadas en (1);


b) n-1 condiciones para la continuidad de s(x);
c) n-1 condiciones para la continuidad de la derivada s(1)(x) ;
d) n-1 condiciones para la continuidad de la derivada s(2)(x).

Sumándolas todas se obtiene un total de datos igual a: 4 n - 2.

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”

Fórmulas para la spline cúbica

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:

s''(x) = (( xi+1 - x ) Mi+( x - xi ) Mi+1)/hi ; i = 0,1,....,n-1 (3)

Al integrar (3) y usando las condiciones de interpolación (1) se obtiene en el intervalo :


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:

Limx→xi+0 s'(x) =Limx→xi-0 s'(x), i = 1, 2,..., n-1

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) M0 = Mn= 0 ; elección que determina a la "spline llamada natural".


2) Condición de derivada en los puntos extremos del intervalo [a,b] donde se
agregan dos ecuaciones para determinar M0, Mn.

Implementación de Splines y hermite

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

La sintaxis de utilización es: pp=spline(valores x, valores y), planteo equivalente al


utilizado en el comando „interp1‟ al comienzo de la sesión, cambiando el método desde
„linear‟ a „spline‟

Pp2=interp1(X,Y,'spline’,'pp');

Asimismo, para evaluar se puede utilizar la instrucción „ppval‟ sobre el polinomio


guardado en „pp‟ o bien solicitar una evaluación directa añadiendo los valores de
evaluación al final del comando
valores=interp1(X,Y,’spline',valores);

que es equivalente a utilizar:


valores=spline(X,Y,valores);
2.- Hermite

A su vez Matlab también incluye un comando para encontrar el polinomio de


interpolación de Hermite a partir de tablas de datos, lo que permite un ahorro
considerable de cálculos en comparación a si se realizara por medio de tablas de
diferencias divididas.

help pchip

Esto es equivalente a utilizar el método „cubic‟ en interp1

Desarrollemos el siguiente ejemplo:


Considere un canal de regadío y  6 para  5  x  1
Considere otro canal de regadío y  3 para 4  x  10
Determinar la curva que forma el polinomio de Hermite cúbico que conecta el extremo
del primer canal con el segundo canal, de modo que el agua fluya en ambos sentidos sin
turbulencias.

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.

Si lo desea puede realizar cálculos con diferencias divididas.


Ejercicio

Intento de trazar la Bahía de Valparaiso usando Spline cúbica y calcular la longitud del
borde costero.

Los datos están en 1 unidad equivale a 200 metros.

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 ).

Dicha curva está parametrizada de la siguiente manera:

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.

Comprobemos que la curva pasa por A y B


t=0; eval(curvas)
t=1; eval(curvas)

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

Las siguientes funciones wx  son llamadas "función peso o ponderación" en un


intervalo I  a, b si:

wx   1

wx  
1
si a  1; b  1
1 x2

wx   e  x si a  0 ; b  

wx   e  x si a   ; b  
2

Veamos cómo son estas funciones:

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

El producto interno con respecto w de dos funciones f , g definidas en el intervalo


a, b se define:
 f , g   a wx  f x g x dx
b

Se define la norma de f como: f   f , g


Calculemos algunos productos internos y normas.
La norma de sin(x) con respecto a la ponderación w=1 en el intervalo [-1,1]:

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)

La norma de sin(x) con respecto a la ponderación wx  


1
en el intervalo [-1,1]:
1 x2

w=1/sqrt(1-x^2);
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x  
1
es:
1 x2

int(w*sin(x)*cos(2*x),-1,1)

El producto interno de x 2 con x 2  x 4 en [-1,1] con respecto a la ponderación


wx  
1
es:
1 x2

p1=x^2;
p2=x^2+x^4;
int(w*p1*p2,-1,1)

Ejercicio.

Calcule la norma de f x   sinx  en 0,  con respecto a la ponderación wx   e  x .

(R:≈0.4)

Calcule la norma de f x   cosx  en  ,  con respecto a la ponderación wx   e  x .


2

(R:≈1.212)
DEFINICIÓN.

Dos funciones f , g se dicen ortogonales con respecto al producto interno si:

 f , g  0

Ejemplo

Probar que los polinomios f x   3x 2  1 , g x   35x 4  30 x 2  3 , son ortogonales con


respecto w(x) = 1 en ]-1,1[.

 f xg xdx  0 . Observe que esto no es trivial por cuanto ambos


1
Bastaría probar que
1
polinomios son de orden par. En efecto,

w = 1;
p1 = 3*x^2-1;
p2 = 35*x^4 - 30*x^2 + 3;
int(w*p1*p2,-1,1)

DEFINICIÓN

Se dirá que una familia  n , n  0,1, de funciones definidas en a, b es


ortogonal si todo par de
funciones distintos es ortogonal.

Se dirá que una familia  n , n  0,1, de funciones definidas en a, b es


ortonormal si ella es
ortogonal y cada uno de los miembros de la familia tienen norma igual a uno.
Polinomios de Legendre
DEFINICIÓN.

La familia de polinomios de Legendre se define en ]-1,1[ mediante la fórmula recursiva:


p0  1
p1 x   x
2n  1
p n 1 x   x  p n x   p n 1 x 
n
n 1
n 1 n 1

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)

Calculemos los ceros de P6(x):

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.

PROPIEDADES de los polinomios de Legendre.

1) Grado del polinomio p n es n y todos sus ceros están en ]-1,1[


2) pn 1  1 , para todo n
0 si n  m

3)  p n , p m    p n x  p m x dx   2
1

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).

POLINOMIOS ORTOGONALES DE CHEBYSHEV

Producto Interno
DEFINICIÓN.
El producto interno con respecto a wx  
1
de dos funciones f , g definidas
1 x2
en el intervalo  1,1 se define:
 f , g   1 wx  f x g x dx
1

Se define la norma de f como: f   f , g 

Polinomios Ortogonales de Chebyschev


Hay dos formas equivalentes de definir los polinomios. Mediante la primera se verá que se
trata de ondas de amplitud 1. La segunda permite ver que se trata en efecto de polinomios.

DEFINICIÓN.

La familia de polinomios de Chebyschev se define en  1,1 mediante la fórmula:


Tn x   cosn  Arcsenn  x  ; n  0,1,

f   f , g  La siguiente función calcula el polinomio de Chebyshev de grado m:

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

Veamos los polinomios hasta grado 6


for n=0:6,
disp(sprintf('\nPolinomio T%d:',n));
disp(chebyshev_pol(n));
end
PROPIEDADES de los polinomios de Chebyschev.

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 wx  
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;

Veamos los ceros:

i=1:8;
r1 = sort(double(solve(chebyshev_pol(8))))
r2 = sort((cos((((2*i-1)*pi)./(2*8))))')

Veamos un producto interno:


syms x
w=1/sqrt(1-x^2);
int(w*chebyshev_pol(8)^2,-1,1)

Veamos la ortogonalidad con respecto a la ponderación

int(w*chebyshev_pol(6)*chebyshev_pol(8),-1,1)

POLINOMIOS ORTOGONALES DE LAGUERRE (OPCIONAL)

Producto Interno

DEFINICIÓN.
El producto interno con respecto a wx   e  x de dos funciones f , g definidas en el
intervalo 0,  se define:
 f , g   1 wx  f x g x dx
1

Se define la norma de f como: f   f , g 


Polinomios Ortogonales de Laguerre
DEFINICIÓN.
La familia de polinomios de Laguerre se define en ]0,[ mediante la fórmula recursiva:

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.

1) Grado del polinomio Ln es n .

 0 si n  m
Ln , Lm   0 e  x Ln x Lm x dx  
2) 1 si n  m  0

Verificación de algunas propiedades

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

Veamos un gráfico donde se destacan los 7 ceros que tiene L[7]:

ezplot(L(8),[0 25])
axis([0 25 -1 1])
grid on

Calculemos todos los ceros de L[7]

solve(L(8))

Veamos un producto interno

syms x
int(exp(-x)*L(8)*L(8),0,inf)

Veamos la ortogonalidad con respecto a la ponderación

int(exp(-x)*L(8)*L(7),0,inf)

Ejercicio.

Usted mismo haga verificaciones de las propiedades para cerciorarse.


POLINOMIOS ORTOGONALES DE HERMITE (OPCIONAL).

Producto Interno

DEFINICIÓN.

El producto interno con respecto wx   e  x de dos funciones f , g definidas en el


2

intervalo  ,  se define:

 f , g    wx  f x g x dx
Se define la norma de f como : f   f , g

Polinomios Ortogonales de Hermite


DEFINICIÓN.

La familia de polinomios de Hermite se define en  ,  mediante la fórmula recursiva:


H0  1
H1  x   2 x
H n1  x   2 xH n x   H n' x , n 1

PROPIEDADES de los polinomios de Hermite.

1) Grado del polinomio H n es n.

 0 si n  m
H n , H m   e x H n x H m x dx   n
2

2 n!  si n  m

Se utilizará la función hermite para generar los polinomios

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)

Verificación de algunas propiedades

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))))

Veamos un producto interno

double(int(exp(-x^2)*H(9,1)*H(9,1),x,-inf,inf))

El cual teóricamente debería ser igual a:

2^8*sqrt(pi)*factorial(8)

Veamos la ortogonalidad con respecto a la ponderación

int(exp(-x^2)*H(7,1)*H(9,1),x,-inf,inf)

Ejercicio
Usted mismo haga verificaciones de las propiedades para cerciorarse. Juegue.

APROXIMACIÓN POR MÍNIMOS CUADRADOS USANDO POLINOMIOS


ORTOGONALES

APROXIMACION USANDO POLINOMIOS DE LEGENDRE


FORMULA GENERAL:

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) :

Se supone que es polinomio de grado k.

Notación: < f, g > =

Observación importante para las aplicaciones:

Si , entonces: < f, >= , en que:


, i = 0, 1,…, n … (*)

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".

Aproximación usando polinomios de Legendre

Ejemplo Test

Aproximar la función ,x [-1,1] utilizando polinomios de


Legendre.
Se grafica la función:

clear
format long
syms x
f = sin(x)-2*cos(x);
figure(1);
clf
ezplot(f,[-1 1]); grid on;

Se generan los coeficientes de Fourier de la fórmula de aproximacionpor mínimos


cuadrados, para esto utlizaremos la función legendre_pol()

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)'

Se calcula la aproximación y se grafica la función sobre la aproximación:

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

Se generan los coeficientes de Fourier de la formula de aproximacion por minimos


cuadrados.

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)

Se calcula la aproximación y se gráfica la función sobre la aproximación:

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;

Se generan los coeficientes de Fourier de la fórmula de aproximación por mínimos


cuadrados, para esto utilizaremos la funcion chebyshev_pol()

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'

Se calcula la aproximación y se grafica la funcion sobre la aproximacion:

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

Compruebe que el valor de la aproximación en x = 0.6 está cerca de 0.932039.


APROXIMACION USANDO POLINOMIOS DE LAGUERRE (OPCIONAL)

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.

La siguiente es una parametrización del círculo unitario


clear
format long
t=0:.01:2*pi;
x=cos(t);
y=sin(t);
plot(x,y)
grid on
Ahora enrollemos un hilo al interior de ese círculo con un paso determinado por e t / 200
(tiene el aspecto de un disco de vinilo, pero allí el paso era constante)

t=0:0.01:150*pi;
x1=cos(t).*exp(-t/200);
y1=sin(t).*exp(-t/200);
plot(x1,y1)
grid on

Calculemos la longitud del hilo empleado

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)

Haciendo tender el enrollado al infinito se logra la longitud total

double(limit(r,x,inf))

Eso es equivalente a integrar de 0 hasta infinito

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

Calculemos los momentos para poder aproximar r mediante polinomios de Laguerre:

for i=1:13
mo(i)=double(int(r*exp(-x)*x^(i-1),0,inf));
end
mo.'

Obtenemos los polinomios de Laguerre

for i=1:12
L(i,1)=laguerre_pol(i);
end
disp('Listo')

Utilizando los momentos, primero calculemos la aproximación cúbica de r.


Los coeficientes respectivos son:

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'

Calculemos la aproximación de grado 6:

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.

APROXIMACION USANDO POLINOMIOS DE HERMITE (OPCIONAL)

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

Obtenemos los primeros 6 polinomios de Hermite


H=hermite(6)

Los coeficientes de Fourier serán:


 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

Graficamos la función y su aproximación.

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

Diferencias avanzadas, retardadas y centrales (OPCIONAL)


Veremos cual es la forma correcta de aproximar la primera derivada de f  x   x 7 en x  3

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.

Ahora calculemos la segunda derivada de f  x   x 7 en x  3 .

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))

Вам также может понравиться