Diferenciacin, integracin y
EDO No lineales
Alumno:
Francisco Daz Barahona
Profesor:
Gonzalo Hernndez
n=length(x)-1;
pf=polyfit(x,f,n);
pg=polyfit(x,g,n);
xf=-3:0.05:3;
ff=(sin(xf.^2))./((xf.^2)+1);
gf=xf.*sin(xf.^2);
fp=polyval(pf,xf);
gp=polyval(pg,xf);
Usamos comandos subplot para poder tener en u mismo grafico los polinomios de
interpolacin de f y g, y los comparamos con las funciones:
subplot(2,1,1), plot(xf,ff,'-b')
title('Polinomio de Lagrangre de f=(sin(x^2))/((x^2)+1)')
hold on
subplot(2,1,1), plot(xf,fp,'-r')
legend('y=f(x)','y=PL(x)')
subplot(2,1,2), plot(xf,gf,'-b')
title('Polinomio de Lagrangre de g=x*sin(x^2)')
hold on
subplot(2,1,2), plot(xf,gp,'-r')
legend('y=g(x)','y=PL(x)')
-Vemos que, aunque existen diferencias en los extremos, el polinomio de interpolacin tiene
una gran similitud a la funcin en la vecindad alrededor de x=0 en ambas funciones.
El programa.m ocupado y completo es:
x= -3:0.5:3;
f=(sin(x.^2))./((x.^2)+1);
g=x.*sin(x.^2);
n=length(x)-1;
pf=polyfit(x,f,n);
pg=polyfit(x,g,n);
xf=-3:0.05:3;
ff=(sin(xf.^2))./((xf.^2)+1);
gf=xf.*sin(xf.^2);
fp=polyval(pf,xf);
gp=polyval(pg,xf);
subplot(2,1,1), plot(xf,ff,'-b')
title('Polinomio de Lagrangre de f=(sin(x^2))/((x^2)+1)')
hold on
subplot(2,1,1), plot(xf,fp,'-r')
legend('y=f(x)','y=PL(x)')
subplot(2,1,2), plot(xf,gf,'-b')
title('Polinomio de Lagrangre de g=x*sin(x^2)')
hold on
subplot(2,1,2), plot(xf,gp,'-r')
legend('y=g(x)','y=PL(x)')
-Finalmente graficamos:
subplot (2,1,1), plot(x,df,'-+b')
title('Grfico df=sin(x^2))/((x^2)+1; con malla gruesa')
hold on
plot(x,dr,'--r')
legend('df mtodo de 3 puntos', 'df calculada')
subplot (2,1,2), plot(x,e)
title('Diferencia de df con respecto a la derivada calculada')
-Si usamos el mtodo de 3 puntos en una malla fina de puntos, el resultado es el siguiente
x= -3:0.5:3;
g=x.*sin(x.^2);
h=1*10^(-6);
m=x+h;
n=x-h;
gm=m.*sin(m.^2);
gn=n.*sin(n.^2);
dg=(gm-gn)/(2*h);
r1=sin(x.^2);
r2=2.*(x.^2).*cos(x.^2);
dr=r1+r2;
e=abs(dr-dg);
subplot (2,1,1), plot(x,dg,'-+b')
title('Grfico dg=x*sin(x^2); con malla gruesa')
hold on
plot(x,dr,'--r')
legend('dg mtodo de 3 puntos', 'dg calculada')
subplot (2,1,2), plot(x,e)
title('Diferencia de dg con respecto a la derivada calculada')
x= -3:0.5:3;
g=x.*sin(x.^2);
h=1*10^(-6);
o=x+h;
p=x-h;
q=x+2*h;
r=x-2*h;
go=o.*sin(o.^2);
gp=p.*sin(p.^2);
gq=q.*sin(q.^2);
gr=r.*sin(r.^2);
dg=(gr-8*gp+8*go-gq)/(12*h);
r1=sin(x.^2);
r2=2.*(x.^2).*cos(x.^2);
dr=r1+r2;
e=abs(dr-dg);
subplot (2,1,1), plot(x,dg,'-+b')
title('Grfico dg=x*sin(x^2); con malla gruesa')
hold on
plot(x,dr,'--r')
legend('dg mtodo de 5 puntos', 'dg calculada')
subplot (2,1,2), plot(x,e)
title('Diferencia de dg con respecto a la derivada calculada')
x= -3:0.05:3;
g=x.*sin(x.^2);
h=1*10^(-6);
m=x+h;
n=x-h;
gm=m.*sin(m.^2);
gn=n.*sin(n.^2);
dg=(gm-gn)/(2*h);
r1=sin(x.^2);
r2=2.*(x.^2).*cos(x.^2);
dr=r1+r2;
e=abs(dr-dg);
subplot (2,1,1), plot(x,dg,'-+b')
title('Grfico dg=x*sin(x^2); con malla fina')
hold on
plot(x,dr,'--r')
legend('dg mtodo de 3 puntos', 'dg calculada')
subplot (2,1,2), plot(x,e)
title('Diferencia de dg con respecto a la derivada calculada')
x= -3:0.05:3;
g=x.*sin(x.^2);
h=1*10^(-6);
o=x+h;
p=x-h;
q=x+2*h;
r=x-2*h;
go=o.*sin(o.^2);
gp=p.*sin(p.^2);
gq=q.*sin(q.^2);
gr=r.*sin(r.^2);
dg=(gr-8*gp+8*go-gq)/(12*h);
r1=sin(x.^2);
r2=2.*(x.^2).*cos(x.^2);
dr=r1+r2;
e=abs(dr-dg);
subplot (2,1,1), plot(x,dg,'-+b')
title('Grfico dg=x*sin(x^2); con malla fina')
hold on
plot(x,dr,'--r')
legend('dg mtodo de 5 puntos', 'dg calculada')
subplot (2,1,2), plot(x,e)
title('Diferencia de dg con respecto a la derivada calculada')
-Usamos la funcin tic, , toc para conocer el tiempo en que se ejecuta la accin para cado de
los errores de tolerancia. Definimos un vector que nos entregue los valores de la integral y de
la cantidad de clculos por comodidad.
Valor de la integral
Numero de
evaluaciones
realizadas
Tiempo en realizar el
clculo
Valor T=1*10^-4
Valor T=1*10^-6
Valor T=1*10^-8
-1.6559
-1.6559
-1.6559
41
113
245
0.001129
0.002678
0.005485
-Vemos que, para los valores de tolerancia elegidos, nos da el mismo valor de la integral, por
tanto no es posible notar la diferencia entre ellos. Por ende, el valor por defecto de matlab es
bastante correcto.
-El valor del tiempo vara en cada ocasin, se eligi un valor promedio de esta.
Valor de la integral
Numero de
evaluaciones
realizadas
Tiempo en realizar el
clculo
Valor T=1*10^-4
Valor T=1*10^-6
Valor T=1*10^-8
0.4432
0.4432
0.4432
169
485
1181
0.003777
0.010335
0.024505
-En este caso, otra vez los valores de la integral son iguales en los 3 casos y no podemos
distinguir una diferencia entre ellos
-Luego calculamos la integral para una funcin con 2 variables con el programa dblquad,
definimos los errores de tolerancia, los vectores (x,y) y usamos la funcin tic, ,toc para
obtener el tiempo :
Para S1:
e1=1e-4;
e2=1e-6;
e3=1e-8;
x=-2:0.05:2;
y=-2:0.05:2;
tic, r1=dblquad(@S1,-2,2,-2,2,e1) ,toc;
tic, r2=dblquad(@S1,-2,2,-2,2,e2) ,toc;
tic, r3=dblquad(@S1,-2,2,-2,2,e3) ,toc;
s=[r1,r2,r3]
Para S2:
e1=1e-4;
e2=1e-6;
e3=1e-8;
x=-3:0.05:3;
y=-3:0.05:3;
tic, r1=dblquad(@S2,-3,3,-3,3,e1) ,toc;
tic, r2=dblquad(@S2,-3,3,-3,3,e2) ,toc;
tic, r3=dblquad(@S2,-3,3,-3,3,e3) ,toc;
s=[r1,r2,r3]
Para S3:
e1=1e-4;
e2=1e-6;
e3=1e-8;
x=0:0.05:3;
y=0:0.05:3;
tic, r1=dblquad(@S3,0,3,0,3,e1) ,toc;
tic, r2=dblquad(@S3,0,3,0,3,e2) ,toc;
tic, r3=dblquad(@S3,0,3,0,3,e3) ,toc;
s=[r1,r2,r3]
-Incluimos en el programa las funciones meshgrid y plot3 para tener una grafica de las
funciones y ver mejor su comportamiento. Usamos el siguiente comando
[x1,y1]=meshgrid(x, y);
z=((sin(x.^2+y.^2)));
%z=((x.^3)-(y.^2))./(10+(x.*y)); para S2
%z=((x.^(1/2))+(y.^(1/2))); para S3
plot3(x1,y1,z)
title(' Grfico funcin h=((sin(x^2+y^2)))')
Valor T=1*10^-4
Valor T=1*10^-6
Valor T=1*10^-8
Valor de la integral
2.9709
2.9710
2.9710
Tiempo en realizar el
clculo
0.028517
0.165875
0.846226
Para S2
Valor T=1*10^-4
Valor T=1*10^-6
Valor T=1*10^-8
Valor de la integral
-13.7840
-13.7840
-13.7840
Tiempo en realizar el
clculo
0.022261
0.121149
0.873319
Para S3
Valor T=1*10^-4
Valor T=1*10^-6
Valor T=1*10^-8
Valor de la integral
20.7834
20.7846
20.7846
Tiempo en realizar el
clculo
0.014432
0.070645
0.400909
Todo lo desarrollamos en 1 solo programa que, adems calcula el tiempo en que se tarda cada
uno, el valor de la integral y genera un grafico de la funcin con la condicin impuesta. El error
elegido fue el error por defecto:
e=1e-6;
x=-3:0.05:3;
y=-3:0.05:3;
f=@(x,y)((sin(x.^2+y.^2)).*(((x.^2)./9 + ((y.^2)./4)) <=1));
g=@(x,y)((sin(x.^2+y.^2)).*(((x.^2)./9 - ((y.^2)./4)) <=1));
h=@(x,y)((sin(x.^2+y.^2)).*((y<=(2*x.^2))));
tic, r1=dblquad(f,-3,3,-3,3,e) ,toc;
tic, r2=dblquad(g,-3,3,-3,3,e) ,toc;
tic, r3=dblquad(h,-3,3,-3,3,e) ,toc;
s=[r1,r2,r3]
z1=((sin(x.^2+y.^2).*(((x.^2)./9 + ((y.^2)./4)) <=1)));
z2=((sin(x.^2+y.^2).*(((x.^2)./9 - ((y.^2)./4)) <=1)));
z3=((sin(x.^2+y.^2).*((y<=(2*x.^2)))));
subplot (3,1,1), plot3(x1,y1,z1)
title({'Grfico Funcin z=(sin(x^2+y^2))';'Condicin ((x^2)/9 +
(y^2)/4 <=1)'})
subplot (3,1,2), plot3(x1,y1,z2)
title('Condicin ((x^2)/9 - (y^2)/4 <=1)')
subplot (3,1,3), plot3(x1,y1,z3)
title('Condicin ( (2*x^2)>=y)')
Condicin
Condicin
Condicin
(x^2)/9
+ (y^2)/4 <=1
(x^2)/9
- (y^2)/4 <=1
2*(x^2)>=y
Valor de la integral
3.2667
4.3497
3.2360
Tiempo en realizar el
clculo (s)
0.629101
0.653097
0.735090
e=1e-6;
x=-3:0.05:3;
y=-3:0.05:3;
f=@(x,y)((sin(x.^2+y.^2)).*(((x.^2)./9 + ((y.^2)./4)) <=1));
g=@(x,y)((sin(x.^2+y.^2)).*(((x.^2)./9 - ((y.^2)./4)) <=1));
h=@(x,y)((sin(x.^2+y.^2)).*((y<=(2*x.^2))));
tic, r1=dblquad(f,-3,3,-3,3,e) ,toc;
tic, r2=dblquad(g,-3,3,-3,3,e) ,toc;
tic, r3=dblquad(h,-3,3,-3,3,e) ,toc;
s=[r1,r2,r3]
[x1,y1]=meshgrid(x, y);
z1=((sin(x.^2+y.^2).*(((x.^2)./9 + ((y.^2)./4)) <=1)));
z2=((sin(x.^2+y.^2).*(((x.^2)./9 - ((y.^2)./4)) <=1)));
z3=((sin(x.^2+y.^2).*((y<=(2*x.^2)))));
subplot (3,1,1), plot3(x1,y1,z1)
title({'Grfico Funcin z=(sin(x^2+y^2))';'Condicin ((x^2)/9 +
(y^2)/4 <=1)'})
subplot (3,1,2), plot3(x1,y1,z2)
title('Condicin ((x^2)/9 - (y^2)/4 <=1)')
subplot (3,1,3), plot3(x1,y1,z3)
title('Condicin ( (2*x^2)>=y)')
- Primero usamos los comandos ode23 y ode45 para determinar la solucin numrica , usando
la funcin creada, el intervalo [0,100] y el punto p(0)= 76.1 dado (incluimos la funcin tic, toc
para tener los tiempos):
tic, [e1,f1]=ode23(@func,[0 100],76.1); toc;
tic, [e2,f2]=ode45(@func,[0 100],76.1); toc;
- En los valores f1 y f2, quedan guardadas las funciones, pero como sus dimensiones dependen
de e1, e2 que son ajustados por matlab, para comparar las soluciones, escribimos la solucin
analtica (conocida), con 2 dimensiones distintas, ajustadas segn f1 y f2. Adems debemos
usar el vector traspuesto, ya que linspace entrega un vector horizontal y ode entrega valores
en vertical
t1=linspace(0,100,length(f1));
t1=t1';
t2=linspace(0,100,length(f2));
t2=t2';
p1=500./(1+(4239./761).*exp((-1/50).*t1));
p2=500./(1+(4239./761).*exp((-1/50).*t2));
- Con ello podemos calcular los errores simplemente comparando cada solucin numrica, con
su solucin analtica correspondiente:
Erk23=abs(p1-f1);
Erk45=abs(p2-f2);
-Ahora incluimos los grficos, los cuales dividimos en 4 subplot. El primero incluye la solucin
numrica con Runge-Kutta 2, el segundo con la solucin numrica con Runge-Kutta 4, el
tercero con la solucin analtica y el cuarto grafica el error Erk23 y Erk45:
subplot(4,1,1), plot(e1,f1,'-b')
title({'Solucin numrica del modelo de crecimiento logstico ';'Por
mtodo de Runge-Kutta 2'})
subplot(4,1,2), plot(e2,f2,'-r')
title('Por mtodo de Runge-Kutta 4')
subplot(4,1,3), plot(t1,p1,'m')
title('Solucin Analtica')
subplot(4,1,4), plot(t1,Erk23,'-b')
hold on
plot(t2,Erk45,'-r')
legend('Erk23','Erk45')
title('Comparacin del error del mtodo R-K(2) con respecto al mtodo
R-K(4)')
2) Para calcular Em, primero hacemos un vector con los datos reales:
VR= [76.1 92.4 106.5 123.1 132.6 152.3 180.7 204.9 226.5 248.7 281.4];
-Luego generamos un vector p, el cual tendr el mismo largo que VR, inicialmente se har solo
con ceros:
p=zeros(1,length(VR));
- Para completarlo utilizaremos un ciclo for, el cual iniciara en ti=0 y terminara en tf=100,
saltando de 10 en 10.
-Como el vector solo tiene once trminos, en la expresin del for se dividir por 10, los cuales
se recuperaran al multiplicar el tiempo t por 10 en la funcin.
-Como los vectores inician con p(1), y nuestro for inicia con t=0, simplemente se sumara 1
for t=0:1:10
p(t+1)=500./(1+(4239./761).*exp((-1/50).*(t*10)));
end
-Finalmente calculamos el error Em, como el valor absoluto de la resta de los valores reales
con los calculados;
Em=abs(VR-p);
-Adems incluimos un grafico con los valores reales y los calculados para tener mayor claridad:
T=0:10:100;
plot(T,VR,'-b')
title('Modelo de crecimiento logstico')
hold on
plot(T,p,'-r')
legend('Datos reales', 'Valores calculados')
Tiempo tk
1900
1910
1920
1930
1940
1950
1960
1970
1980
1990
2000
0.0
10.0
20.0
30.0
40.0
50.0
60.0
70.0
80.0
90.0
100.
P(t) Real
[Millones de personas]
76.1
92.4
106.5
123.1
132.6
152.3
180.7
204.9
226.5
248.7
281.4
Error Absoluto
0.0
2.48
0.88
0.14
10.14
11.68
6.02
5.75
8.83
11.61
3.68
3) (a) Vemos que, tanto Runge-Kutta 2, como Runge-Kutta 4, dieron resultados muy cercanos
a la solucin analtica, en particular Runge-Kutta 4, que presento un error promedio de 1e-5, lo
que es una gran precisin.
(b) Vemos que, a pesar de existir diferencias entre los valores, la diferencia promedio fue de
5.56, lo cual, es menor al 10% de diferencia (en el mejor de los casos fue menor al 1%), lo que
demuestra que le modelo de crecimiento logstico representa de buena manera los datos
reales.