Anda di halaman 1dari 22

Diferenciación,

Integración y EDO
no lineales
Laboratorio II

MA2601 Ecuaciones Diferenciales Ordinarias


Integrantes: Paulina Leiva
Tamara Vejar
Profesor: Gonzalo Hernández
Auxiliares: Francisco Bravo
Pedro Montealegre
Actividad 1: Interpolación y Diferenciación
Consideremos las funciones test:

sin ሺ‫ ݔ‬ଶ ሻ
݂ሺ‫ݔ‬ሻ = ݃ሺ‫ݔ‬ሻ = ‫݊݅ݏݔ‬ሺ‫ ݔ‬ଶ ሻ
‫ݔ‬ଶ

en el intervalo [-3,3]

1) Código Matlab:
x1=linspace(-3,3,12)';%malla gruesa de puntos
x2=linspace(-3,3,120)';%malla fina de puntos

func1=sin(x1.^2)./(x1.^2+1);
func2=sin(x2.^2)./(x2.^2+1);
z1=vander(x1); % matriz de Vandermonde
a1=z1\func1;
pol1=polyval(a1,x1);%polinomio de interpolación de Lagrange para
f(x)=sin(x^2)/(x^2+1) utilizando la malla gruesa
z2=vander(x2);
a2=z2\func2;
pol2=polyval(a1,x2);%polinomio de interpolación de Lagrange para
f(x)=sin(x^2)/(x^2+1) utilizando la malla fina

func3=x1.*sin(x1.^2);
func4=x2.*sin(x2.^2);
a3=z1\func3;
pol3=polyval(a3,x1);%polinomio de interpolación de Lagrange para g(x)=x*sin(x^2)
utilizando la malla gruesa
a4=z2\func4;
pol4=polyval(a3,x2);%polinomio de interpolación de Lagrange para g(x)=x*sin(x^2)
utilizando la malla fina

figure(1)
plot(x2',func2','k-d',x2,pol2,'g-p')
title('Datos (xi,yi) y del polinomio de interpolación pl(x)');
xlabel('Malla fina de puntos');
ylabel('Polinomio de interpolación de f(x)=sin(x^2)/(x1^2+1)');
legend('f(x) evaluado en una malla fina','pl(x) evaluado en una malla fina')

figure (2)
plot(x2',func4','k-d',x2,pol4,'g-p')
title('Datos (xi,yi) y del polinomio de interpolación pl(x)');
xlabel('Malla fina de puntos');
ylabel('Polinomio de interpolación de g(x)=x*sin(x^2)');
legend('g(x) evaluado en una malla fina','pl(x) evaluado en una malla fina')
Gráficos obtenidos:
De acuerdo a los gráficos generados, es posible concluir que en el intervalo [-2,2] el polinomio
de interpolación de Lagrange es una buena aproximación de ambas funciones test. Mientras
que, fuera de este intervalo, el error producido el considerablemente mayor.

2)Código Matlab:
x1=linspace(-3,3,12)';%malla gruesa de puntos
x2=linspace(-3,3,120)';%malla fina de puntos

h=10^(-6);
%Derivada de f(x) y g(x)
der1=((2*(x1).*cos((x1).^2).*((x1).^2+1))-(2.*(x1).*sin((x1).^2)))./((x1).^2+1).^2;
der2=((2*(x2).*cos((x2).^2).*((x2).^2+1))-(2.*(x2).*sin((x2).^2)))./((x2).^2+1).^2;
der3=sin((x1).^2)+(2.*(x1).^2).*cos((x1).^2);
der4=sin((x2).^2)+(2.*(x2).^2).*cos((x2).^2);

fx1posi=(sin((x1+h).^2)./((x1+h).^2+1));
fx1neg=(sin((x1-h).^2)./((x1-h).^2+1));
fx1posi2=(sin((x1+2.*h).^2)./((x1+2.*h).^2+1));
fx1neg2=(sin((x1-2.*h).^2)./((x1-2.*h).^2+1));

fx2posi=(sin((x2+h).^2)./((x2+h).^2+1));
fx2neg=(sin((x2-h).^2)./((x2-h).^2+1));
fx2posi2=(sin((x2+2.*h).^2)./((x2+2.*h).^2+1));
fx2neg2=(sin((x2-2.*h).^2)./((x2-2.*h).^2+1));

gx1posi=(x1+h).*sin((x1+h).^2);
gx1neg=(x1-h).*sin((x1-h).^2);
gx1posi2=(x1+2.*h).*sin((x1+2.*h).^2);
gx1neg2=(x1-2.*h).*sin((x1-2.*h).^2);

gx2posi=(x2+h).*sin((x2+h).^2);
gx2neg=(x2-h).*sin((x2-h).^2);
gx2posi2=(x2+2.*h).*sin((x2+2.*h).^2);
gx2neg2=(x2-2.*h).*sin((x2-2.*h).^2);

%Derivada de f(x) y g(x)usando la fórmula de los 3 puntos


dertres1=((sin((x1+h).^2)./((x1+h).^2+1)-sin((x1-h).^2)./((x1-h).^2+1))./(2.*h));
dertres2=((sin((x2+h).^2)./((x2+h).^2+1)-sin((x2-h).^2)./((x2-h).^2+1))./(2.*h));
dertres3=((x1+h).*sin((x1+h).^2)-(x1-h).*sin((x1-h).^2))./(2.*h);
dertres4=((x2+h).*sin((x2+h).^2)-(x2-h).*sin((x2-h).^2))./(2.*h);

%Derivada de f(x) y g(x)usando la fórmula de los 5 puntos


dercinc1=(fx1neg2-8.*fx1neg+8.*fx1posi-fx1posi2)./(12.*h);
dercinc2=(fx2neg2-8.*fx2neg+8.*fx2posi-fx2posi2)./(12.*h);
dercinc3=(gx1neg2-8.*gx1neg+8.*gx1posi-gx1posi2)./(12.*h);
dercinc4=(gx2neg2-8.*gx2neg+8.*gx2posi-gx2posi2)./(12.*h);

figure(1)
%Gráfico de la derivada aproximada de la función f(x)=sin(x^2)/(x^2+1) y la derivada
numérica calculada evaluada en una malla gruesa
subplot(2,1,1)
hold on
title('Derivada de f(x)=sin(x^2)/(x^2+1)usando la fórmula de los 3 puntos, evaluada
en la malla gruesa de puntos');
xlabel('Posición');
ylabel('f`(x)');
plot(x1,der1,'-ms',x1,dertres1,'-ko')
legend('derivada aproximada','derivada calculada')
hold off

subplot(2,1,2)

hold on
title('Derivada de f(x)=sin(x^2)/(x^2+1)usando la fórmula de los 5 puntos, evaluada
en la malla gruesa de puntos');
xlabel('Posición');
ylabel('f`(x)');
plot(x1,der1,'-rs',x1,dercinc1,'b-o')
legend('derivada aproximada','derivada calculada')
hold off

figure(2)
%Gráfico de la derivada aproximada de la función f(x)=sin(x^2)/(x^2+1) y la derivada
numérica calculada evaluada en una malla fina
subplot(2,1,1)

hold on
title('Derivada de f(x)=sin(x^2)/(x^2+1)usando la fórmula de los 3 puntos, evaluada
en la malla fina de puntos');
xlabel('Posición');
ylabel('f`(x)');
plot(x2,der2,'-ms',x2,dertres2,'-ko')
legend('derivada aproximada','derivada calculada')
hold off

subplot(2,1,2)

hold on
title('Derivada de f(x)=sin(x^2)/(x^2+1) usando la fórmula de los 5 puntos, evaluada
en la malla fina de puntos');
xlabel('Posición');
ylabel('f`(x)');
plot(x2,der2,'-rs',x2,dercinc2,'b-o')
legend('derivada aproximada','derivada calculada')
hold off

figure(3)
%Gráfico de la derivada aproximada de la función g(x)=x*sin(x^2) y la derivada
numérica calculada evaluada en una malla gruesa
subplot(2,1,1)

hold on
title('Derivada de g(x)=x*sin(x^2) usando la fórmula de los 3 puntos, evaluada en la
malla gruesa de puntos');
xlabel('Posición');
ylabel('g`(x)');
plot(x1,der3,'-ms',x1,dertres3,'-ko')
legend('derivada aproximada','derivada calculada')
hold off

subplot(2,1,2)

hold on
title('Derivada de g(x)=x*sin(x^2) usando la fórmula de los 5 puntos, evaluada en la
malla gruesa de puntos');
xlabel('Posición');
ylabel('g`(x)');
plot(x1,der3,'-rs',x1,dercinc3,'b-o')
legend('derivada aproximada','derivada calculada')
hold off

figure(4)
%Gráfico de la derivada aproximada de la función g(x)=x*sin(x^2) y la derivada
numérica calculada evaluada en una malla fina
subplot(2,1,1)

hold on
title('Derivada de g(x)=x*sin(x^2) usando la fórmula de los 3 puntos, evaluada en la
malla fina de puntos');
xlabel('Posición');
ylabel('g`(x)');
plot(x2,der4,'-ms',x2,dertres4,'-ko')
legend('derivada aproximada','derivada calculada')
hold off

subplot(2,1,2)

hold on
title('Derivada de g(x)=x*sin(x^2) usando la fórmula de los 5 puntos, evaluada en la
malla fina de puntos');
xlabel('Posición');
ylabel('g`(x)');
plot(x2,der4,'-rs',x2,dercinc4,'b-o')
legend('derivada aproximada','derivada calculada')
hold off
Gráficos obtenidos:
3) Al evaluar las funciones y sus respectivas derivadas en un número mayor de puntos, la
precisión de estas aumenta, por lo tanto, la aproximación de sus derivadas también, es decir,
la aproximación es “mejor” al utilizar una malla fina de puntos.

En el caso de la primera parte de la actividad, podemos concluir que fuera del intervalo
[-2,2] los resultados del polinomio de interpolación no son exactos, acentuándose dichos
fallos en los sectores donde la variación de la curvatura es mayor, de forma tal que, a mayor
cambio en la curvatura, mayor es el error producido.

En la segunda parte de la actividad, acorde a los gráficos obtenidos, el comportamiento del


error de la derivada en función de la variabilidad es imperceptible, dada la exactitud de estos.
Esto se debe al valor tan pequeño de h (ℎ = 1 ‫ ݔ‬10ି଺ ), que permite obtener unas
aproximaciones muy buenas de las derivadas calculadas de cada función. En cambio, si
aumentamos el valor de h (por ejemplo: ℎ = 0.25), los cambios en la curvatura son notorios, y
sus errores son directamente proporcional a estos (a mayor cambio de curvatura, el error
aumenta).
Actividad 2: Integral de una función a variable real

1) Código Matlab:
function y=g(x)

y=exp(-x.^2);

end

2)Código Matlab:
tic=clock;

format('long')
a=0;
b=2;
q=zeros(1,3);
z=zeros(1,3);
% x=linspace(a,b,11);
tol=[10^(-10),10^(-6),0.5];
for i=1:3
[q(i),z(i)]=quad(@g,a,b,tol(i));
end
errorq=std(q)%error

%valores de la integral y numero de de evaluaciones respectivas


disp(q)
disp(z)

toc=clock;
etime(toc,tic)%tiempo ejecución de todo el programa

Tiempo de ejecución total : 0.016999999999999

Tiempo de ejecución con cada valor de tolerancias se calculó en un programa separado. Por
ejemplo, con tol =0,5:
tic=clock;
format('long')
a=0;
b=2;
q=0;
z=0;
tol=0.5;
[q,z]=quad(@g,a,b,tol)

toc=clock;
etime(toc,tic)%tiempo de ejecución
Valor de la integral de ࢌሺ࢞ሻ = ࢋ࢞࢖ሺ−࢞૛ ሻ en el intervalo [0,2] con las distintas
tolerancias

Tol =10ିଵ଴

• Valor de la integral = 0.882081390750500


• Número de evaluaciones de funciones realizadas=149
• Tiempo de ejecución=0.010999999999999

Tol=10ି଺

• Valor de la integral=0.882081194911110
• Número de evaluaciones de funciones realizadas =29
• Tiempo de ejecución= 0.007000000000005

Tol=0,5

• Valor de la integral=0.882098127950709
• Número de evaluaciones de funciones realizadas =13
• Tiempo de ejecución= 0.006000000000000

Si es posible calcular el error y es : 9.720254231794037e-006

3) Código Matlab:
%parte3
tic=clock;
format('long')

c=2;
d=4;
q2=zeros(1,3);
z2=zeros(1,3);
x2=linspace(c,d,500);
tol2=[10^(-20),10^(-8),0.5];
for i=1:3
[q2(i),z2(i)]=quad(@g,c,d,tol2(i));
End
Errorq2=std(q2)%error

%valores de la integral y numero de de evaluaciones respectivas


disp(q2)
disp(z2)

toc=clock;
etime(toc,tic)%tiempo ejecución de todo el programa

Tiempo de ejecución total: 0.318999999999996


Tiempo de ejecución con cada valor de tolerancias se calculó en un programa separado. Por
ejemplo, con tol =0,5:

tic=clock;
format('long')
a=2;
b=4;
q=0;
z=0;
tol=0.5;
[q,z]=quad(@g,a,b,tol)

toc=clock;
etime(toc,tic)%tiempo de ejecución

Valor de la integral de ࢌሺ࢞ሻ = ࢋ࢞࢖ሺ−࢞2 ሻ en el intervalo [2,4] con las distintas


tolerancias

Tol =10ିଶ଴

• Valor de la integral = 0.004145521027147


• Número de evaluaciones de funciones realizadas=8885
• Tiempo de ejecución= 0.328000000000000

Tol=10ି଼

• Valor de la integral=0.004145521770268
• Número de evaluaciones de funciones realizadas =37
• Tiempo de ejecución= 0.009000000000000

Tol=0,5

• Valor de la integral= 0.004145988989806


• Número de evaluaciones de funciones realizadas =13
• Tiempo de ejecución= 0.006999999999998

Si es posible calcular el error y es: 2.699641021271287e-007


4)

Comparación de los cálculos de 2) y 3)

Podemos ver que al cambiar el intervalo no influye sobre el tiempo que se demora en
ejecutarse el programa, sino que este está definido por el valor de tolerancia usada, como
fueron más pequeños los usados en 3) este tuvo un mayor tiempo de ejecución.

En cuanto al número de evaluaciones, como dependen del “tol”, se tiene que, al ser menor la
tolerancia mayor es el número de evaluaciones, por lo que también se produjeron más en 3).

Como los valores de la integral dependen de la tolerancia, al haber usado tolerancias distintas
no podemos hacer una clara comparación entre los errores, pero se observa que es menor al
usar tolerancia menores, las cuales dan resultados más precisos.

Conclusiones

Con respecto a tolerancia y números de evaluaciones podemos concluir que al usar la misma
tolerancia en intervalos distintos de funciones hace el mismo número de evaluaciones de
funciones realizadas como en el caso del tol 0,5 .

Además que hay una gran diferencia entre usar tol menor a 10ିଵ଴ donde la cantidad de
evaluaciones son demasiadas, a usar “Tol” mayor a éste, donde son mucho más reducidas,
esto hace que el tiempo de ejecución de la integral con una tolerancia mas pequeña sea
mucho mayor que cuando se usa una tolerancia grande.
Actividad 3: Integración
1) Código Matlab:
function t=h(x,y)
t=exp((-x.^2)-(y.^2));
end

function t=L(s,z)
t=(z.*exp(s))./s;
end

function t=N(r,u)
t=u.*(sin(r));
end

tic=clock;
format('long')
a=1;
b=2;
q=zeros(1,3);
e=zeros(1,3);
w=zeros(1,3);

tol=[10^(-20),10^(-8),0.5];

for i=1:3
q(i)=dblquad(@h,a,b,a,b,tol(i));
w(i)=dblquad(@L,a,b,a,b,tol(i));
e(i)=dblquad(@N,a,b,a,b,tol(i));
end

%valores de las integrales dobles


disp(q)
disp(w)
disp(e)

%error producido debido a los valores de tolerancia distintos


std(q)
std(w)
std(e)

toc=clock;
etime(toc,tic) %tiempo de ejecución
Tol =10ିଶ଴
మ ି௬ మ
• Valor de la integral doble de ℎ = ݁ ି௫ : 0.018294525828151
௬௘ ೣ
• Valor de la integral doble de ‫= ܮ‬ ௫
: 4.588674809468930
• Valor de la integral doble de ܰ = ‫݊݅ݏݕ‬ሺ‫ݔ‬ሻ: 1.434673713622923

Tol =10ି଼
మ ି௬ మ
• Valor de la integral doble de ℎ = ݁ ି௫ : 0.018294525419826
௬௘ ೣ
• Valor de la integral doble de ‫= ܮ‬ : 4.588674809530485

• Valor de la integral doble de ܰ = ‫݊݅ݏݕ‬ሺ‫ݔ‬ሻ: 1.434673713619692

Tol =0.5
మ ି௬ మ
• Valor de la integral doble de ℎ = ݁ ି௫ : 0.018294514387913
௬௘ ೣ
• Valor de la integral doble de ‫= ܮ‬ : 4.588674979821058

• Valor de la integral doble de ܰ = ‫݊݅ݏݕ‬ሺ‫ݔ‬ሻ: 1.434673710260902

Tiempo de ejecución: 3.215200000000000e+002

Errores producidos debido a los valores distintos de tolerancia utilizados:


మ ି௬ మ
• Error de ℎ = ݁ ି௫ : 6.490362910310572e-009
௬௘ ೣ
• Error de ‫= ܮ‬ ௫
: 9.833508254997407e-008
• Error de ܰ = ‫݊݅ݏݕ‬ሺ‫ݔ‬ሻ: 1.940131762125504e-009
మ ି௬ మ ௬௘ ೣ
En esta actividad consideramos las funciones ℎ = ݁ ି௫ ,‫= ܮ‬ ௫
y ܰ = ‫݊݅ݏݕ‬ሺ‫ݔ‬ሻ, las cuales
fueron guardadas en tres archivos M-file distintos. Luego, en un cuarto archivo, se crearon
tres vectores (“q”, “e”, “w”), los cuales almacenan los valores de las integrales dobles para los
distintos valores de tolerancia escogidos (“10ିଶ଴ ”, “ 10ି଼ ”, “0.5”). Esta asignación fue posible
debido al uso del método for, en el cual, en conjunto con el comando dblquad, se calcularon
los valores de las integrales dobles.
2) Código Matlab:
format('long')
tic=clock;
c=[2 3 4];
d=[2 2 3];
M=zeros(1,3);
M(1)=dblquad(@(x,y)(exp((-x.^2)-(y.^2))).*(x.^2 + y.^2 <= 4),-c(1),c(1),-
d(1),d(1)); %circunferencia de radio 2
M(2)=dblquad(@(x,y)(exp((-x.^2)-(y.^2))).*((x.^2)./9 + (y.^2)./4 <= 1),-
c(2),c(2),-d(2),d(2));% elipse de semiejes 3,2
M(3)=dblquad(@(x,y)(exp((-x.^2)-(y.^2))).*((x.^2)./16 + (y.^2)./9 <= 1),-
c(3),c(3),-d(3),d(3));% elipse de semiejes 4,3
disp(M)
std(M) %error
toc=clock;
etime(toc,tic) %tiempo de ejecución

మ ି௬ మ
• Valor de la integral de ℎ = ݁ ି௫ en una circunferencia de radio 2:
3.084052136359994
మ ି௬ మ
• Valor de la integral de ℎ = ݁ ି௫ en una elipse de semiejes a=3,b=2:
3.120781584267272
మ ି௬ మ
• Valor de la integral de ℎ = ݁ ି௫ en una elipse de semiejes a=4,b=3:
3.141483146015368

Tiempo de ejecución: 0.396000000000001

Error: 0.029085872493988
మ మ
Considerando la función: ℎ = ݁ ି௫ ି௬ .Para ejecutar el comando anterior, se procedió a
guardar los valores límites que pueden tomar las “regiones no rectangulares” en los ejes x e y,
en los vectores c y d, respectivamente. Posteriormente, se procedió a crear un vector “M” que
guardaría los valores obtenidos para cada caso y, finalmente, se hizo uso del comando acorde
a la forma indicada en la guía. Cabe destacar que el error descrito no es exacto, pues los
intervalos de integración no son los mismos.
Actividad 4: Modelo de crecimiento logístico

1) Código Matlab:
tic=clock;
%Parte 1
format('long')
[t1,p1] = ode23(@logistico,[0 100],76.1);
[t2,p2] = ode45(@logistico,[0 100],76.1);
P1=zeros(length(t1),1);
P2=zeros(length(t2),1);
for i=1:length(t1)
P1(i)=500/( 1+(4239/761)*exp(-(1/50)*t1(i)) );
end
for i=1:length(t2)
P2(i)=500/( 1+(4239/761)*exp(-(1/50)*t2(i)) );
end
Erk23=abs(P1-p1);
Erk45=abs(P2-p2);

figure(1)
plot(t1,p1,'g.-',t1,P1,'rd--')
title('Solución numérica con método Runge-Kutta de orden 2 y solución analítica de
la solución diferencial de crecimiento logarítmico');
xlabel('Tiempo');
ylabel('Crecimiento de la población ');
legend('Solución numérica','Solución analítica');

figure(2)
plot(t2,p2,'b--',t2,P2,'yp-.')
title('Solución numérica con método Runge-Kutta de orden 4 y solución analítica de
la solución diferencial de crecimiento logarítmico');
xlabel('Tiempo');
ylabel('Crecimiento de la población ');
legend('Solución numérica','Solución analítica');

figure(3)
plot(t1,Erk23,'bo--',t2,Erk45,'rp-.')
title('Comparación de errores con método numérico de Runge-Kutta de orden 2 y de
orden 4');
xlabel('Tiempo');
ylabel('Error');
legend('Error Runge-Kutta orden 2','Error Runge-Kutta orden 4')
toc=clock;
etime(toc,tic)

Tiempo de ejecución: 1.601999999999997


Gráficos obtenidos:
Para ver el tiempo de ejecución de ode23 y ode45 usamos los programas :
tic=clock;
format('long')
[t1,p1] = ode23(@logistico,[0 100],76.1);
toc=clock;
etime(toc,tic)%tiempo ejecución ode23

Tiempo ejecución ode23: 0.006999999999998


tic=clock;
format('long')
[t1,p1] = ode45(@logistico,[0 100],76.1);
toc=clock;
etime(toc,tic)%tiempo ejecución ode45

Tiempo ejecución ode45= 0.007999999999999


El tiempo de ejecución de ode23 es menor que el de ode45 lo que es lógico, pues el método
de Runge-Kutta de orden 4 es más complejo que el de orden 2 y por que el vector t es mayor,
por lo tanto, se entregan más soluciones cuando se usa ode45.

En nuestro trabajo hicimos un gráfico comparativo entre los errores Erk23 y Erk45, en el que
podemos apreciar claramente que el error de Erk45 es mucho menor (aproximadamente de
0.5), mientras que el error de Erk23 va en aumento a medida que pasa el tiempo y al final
converge aproximadamente a 5,5. O sea hay una diferencia de error entre ellos de
aproximadamente 5 lo que es bastante.

2) Código Matlab:
tic=clock;
%Parte 2
format('long')

P=zeros(11,1);
t=0:10:100;
for i=1:11
P(i)=500/( 1+(4239/761)*exp(-(1/50)*t(i)) );
end
Preal=[76.1 92.4 106.5 123.1 132.6 152.3 180.7 204.9 226.5 248.7 281.4];
Em=abs(Preal'-P)
X=std(Em)
figure(4)
plot(t,P,'bo--',t,Preal,'rp-.')
title('Comparación entre solución exacta y datos reales ');
xlabel('Tiempo');
ylabel('Crecimiento de la población ');
legend('Solución exacta','Datos reales')
toc=clock;

etime(toc,tic)

Tiempo de ejecución: 0.24300000000000


Gráfico obtenido:

Valores Em =
T=0 0.000000000000014
T=10 2.481285951940478
T=20 0.878512868565437
T=30 0.142358081184952
T=40 10.138949599948319
T=50 11.677454291781629
T=60 6.024431336688224
T=70 5.748747580660421
T=80 8.835688981892417
T=90 11.612979895680382
T=100 3.685723735641204

3) a) Vemos claramente que el método de Runge-Kutta de orden 4 es muy preciso con un


error absoluto de 0,5 .Mientras con este mismo método pero de orden 2 el resultado obtenido
es aproximadamente 11 veces más impreciso, aunque los dos métodos son más preciso que
el modelo de crecimiento logarítmico.

b) Podemos concluir que el modelo de crecimiento logarítmico no representa bien los


valores de la tabla, pues los errores son mucho mayores que usando los métodos de Runge-
Kutta.