Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programa:
function M_Runge_kutta4(a,b,f,y0,n)
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% f -> funcion y'=f(x,y)
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
% SALIDA:
% s -> valores de la funcion y(x) en los puntos x
h=(b-a)/n;
x=a:h:b;
y(1)=y0;
z(1)=2*x(1) - exp(x(1))/2 + x(1)^2 + 1;%Solucion Original(aqui poner la
solucion original de la ecuacion)
l=0;
err(1)=abs(y(1)-z(1));
fprintf('%45s\n','Metodo de Runge Kutta de orden 3')
fprintf('--------------------------------------------------------------
\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','Real','error')
fprintf('--------------------------------------------------------------
\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.8f\n',l,x(1),y(1),z(1),err(1))
for i=1:n
k1=f(x(i),y(i));
k2=f(x(i)+(h/2),y(i)+(k1*h/2));
k3=f(x(i)+(h/2),y(i)+(k2*h/2));
k4=f(x(i)+h,y(i)+k3*h);
y(i+1)=y(i)+(h/6)*(k1+2*k2+2*k3+k4); % ecuacion de Runge-Kutta
z(i+1)=3*exp(x(i+1)^2/2)-x(i+1)^2-2;
err(i+1)=abs(y(i+1)-z(i+1));
fprintf('%6.3f %12.5f %12.5f %12.5f
%12.8f\n',i,x(i+1),y(i+1),z(i+1),err(i+1))
end
z=2*x - exp(x)/2 + x.^2 + 1; %solucion original
S=[x' y' z']; % valores numericos de y(x)
%grafica
plot(x,y,'*')
grid minor
grid on
ylabel('t')
xlabel('y')
title('Curva y(t)')
hold on
plot(x,z)
legend('y aprox','y exacta')
Ejecución del programa:
>> s=dsolve('Dy=y-x^2+1,y(0)=0.5','x')
s =
>> f=inline('y-x^2+1')
f =
Inline function:
f(x,y) = y-x^2+1
>> M_Runge_kutta4(0,2,f,0.5,10)
Metodo de Runge Kutta de orden 3
--------------------------------------------------------------
i x(i) y(i) Real error
--------------------------------------------------------------
0.000 0.00000 0.50000 0.50000 0.00000000
1.000 0.20000 0.82929 0.82930 0.00000529
2.000 0.40000 1.21408 1.21409 0.00001144
3.000 0.60000 1.64892 1.64894 0.00001858
4.000 0.80000 2.12720 2.12723 0.00002685
5.000 1.00000 2.64082 2.64086 0.00003639
6.000 1.20000 3.17989 3.17994 0.00004737
7.000 1.40000 3.73234 3.73240 0.00005994
8.000 1.60000 4.28341 4.28348 0.00007429
9.000 1.80000 4.81509 4.81518 0.00009057
10.000 2.00000 5.30536 5.30547 0.00010895
Grafica:
Por el Método de Taylor de 4to orden
Programa:
function M_Teylor(a,b,y0,n)
%Programado por Apolinario Pariona Javier Elias
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
% SALIDA:
% S -> valores de la funcion y(x) en los puntos x
h=(b-a)/n;
x=a:h:b;
y(1)=y0;
z(1)=1+x(1)-3*exp(x(1));%Solucion Original(aqui poner la solucion
original de la ecuacion)
l=0;
err(1)=abs(y(1)-z(1));
fprintf('%40s\n','Metodo de Teylor de orden n')
fprintf('--------------------------------------------------------------
\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','Real','error')
fprintf('--------------------------------------------------------------
\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1),err(1))
for i=1:n
Grafica:
Ejercicio 2
Programa:
function M_euler_Ex(a,b,f,y0,n)
%Metodo de Euler Explicito
%Programado por Apolinario Pariona Javier Elias
% f -> funcion de tipo inline
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
h=(b-a)/n;
x=a:h:b;
y(1)=y0;
z(1)=exp(-x(1)^2);%Solucion Original
l=0;
err(1)=abs(y(1)-z(1));
fprintf('%40s\n','Metodo de Euler Explicito')
fprintf('--------------------------------------------------------------
\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','Real','error')
fprintf('--------------------------------------------------------------
\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1),err(1))
for i=1:n
%while err>tol
y(i+1)=y(i)+h*f(x(i),y(i));
z(i+1)=exp(-x(i+1)^2);%Solucion Original
err(i+1)=abs(y(i+1)-z(i+1));
fprintf('%6.3f %12.5f %12.5f %12.5f
%12.5f\n',i,x(i+1),y(i+1),z(i+1),err(i+1))
%end
end
z=exp(-x.^2);%Solucion Original
s=[x' y' z'];
plot(x,y,'*')
grid minor
grid on
xlabel('t')
xlabel('y')
title('Curva y(t)')
hold on
plot(x,z)
legend('y aprox','y exacta')
>> s=dsolve('Dy=-2*x*y,y(0)=1','x')
s =
exp(-x^2)
>> f=inline('-2*x*y')
f =
Inline function:
f(x,y) = -2*x*y
Grafica:
Con el método de Euler Impicito:
Programa:
function M_euler_Im(a,b,y0,n)
%Programado por Apolinario Pariona Javier Elias
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
h=(b-a)/n;
x=a:h:b;
y(1)=y0;
z(1)=exp(-x(1)^2);%Solucion Original(aqui poner la solucion original de
la ecuacion)
l=0;
err(1)=abs(y(1)-z(1));
fprintf('%40s\n','Metodo de Euler Implicito')
fprintf('--------------------------------------------------------------
\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','Real','error')
fprintf('--------------------------------------------------------------
\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1),err(1))
for i=1:n
% y(i+1)=y(i)+f(x(i+1),y(i+1))
% f(x(i+1),y(i+1))=(y(i+1)-y(i))/h
%y(i+1)=(y(i)+h*(50*cos(x(i+1))-sin(x(i+1))))/(50*h+1); %4
z(i+1)=exp(-x(i+1)^2);
y(i+1)=(y(i))/(1+2*h*x(i+1));
err(i+1)=abs(y(i+1)-z(i+1));
fprintf('%6.3f %12.5f %12.5f %12.5f
%12.5f\n',i,x(i+1),y(i+1),z(i+1),err(i+1))
end
z=exp(-x.^2);%Solucion Original
s=[x' y' z'];
plot(x,y,'*')
grid minor
grid on
xlabel('t')
xlabel('y')
title('Curva y(t)')
hold on
plot(x,z)
legend('y aprox','y exacta')
Ejecución del Programa:
>> M_euler_Im(0,1,1,125)
Metodo de Euler Implicito
--------------------------------------------------------------
i x(i) y(i) Real error
--------------------------------------------------------------
0.000 0.00000 1.00000 1.00000 0.00000
1.000 0.00800 0.99987 0.99994 0.00006
2.000 0.01600 0.99962 0.99974 0.00013
3.000 0.02400 0.99923 0.99942 0.00019
4.000 0.03200 0.99872 0.99898 0.00026
5.000 0.04000 0.99808 0.99840 0.00032
6.000 0.04800 0.99732 0.99770 0.00038
7.000 0.05600 0.99642 0.99687 0.00045
... ... ... ... ...
123.000 0.98400 0.37869 0.37974 0.00105
124.000 0.99200 0.37278 0.37379 0.00101
125.000 1.00000 0.36691 0.36788 0.00097
Grafica:
Ejercicio N3:
Programa:
function M_crank_nicolson(a,b,y0,n)
%Programado por Apolinario Pariona Javier Elias
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
h=(b-a)/n;
x=a:h:b;
y(1)=y0;
z(1)=cos(x(1)) - exp(-50*x(1));%Solucion Original(aqui poner la solucion
original de la ecuacion)
l=0;
err(1)=abs(y(1)-z(1));
fprintf('%40s\n','Metodo de Crack Nicolson')
fprintf('--------------------------------------------------------------
\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','Real','error')
fprintf('--------------------------------------------------------------
\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1),err(1))
for i=1:n
% y(i+1)=y(i)+f(x(i+1),y(i+1))
% f(x(i+1),y(i+1))=(y(i+1)-y(i))/h
%y(i+1)=(y(i)+h*(50*cos(x(i+1))-sin(x(i+1))))/(50*h+1); %4
z(i+1)=cos(x(i+1)) - exp(-50*x(i+1));
%y(i+1)=((8+2*h(x(i)+x(i+1)))*y(i))/(8-2*h*(x(i)+x(i+1)));
y(i+1)=((1-25*h)*y(i)+h*(50*cos((x(i+1)+x(i))/2)-
sin((x(i+1)+x(i))/2)))/(25*h+1);
err(i+1)=abs(y(i+1)-z(i+1));
fprintf('%6.3f %12.5f %12.5f %12.5f
%12.5f\n',i,x(i+1),y(i+1),z(i+1),err(i+1))
end
z=cos(x)-exp(-50*x);%Solucion Original
s=[x' y' z'];
plot(x,y,'*')
grid minor
grid on
xlabel('t')
xlabel('y')
title('Curva y(t)')
hold on
plot(x,z)
legend('y aprox','y exacta')
Ejecución del programa:
>> M_crank_nicolson(0,2,0,11)
Metodo de Crack Nicolson
--------------------------------------------------------------
i x(i) y(i) Real error
--------------------------------------------------------------
0.000 0.00000 0.00000 0.00000 0.00000
1.000 0.18182 1.62960 0.98340 0.64619
2.000 0.36364 0.52805 0.93461 0.40656
3.000 0.54545 1.12089 0.85489 0.26600
4.000 0.72727 0.58235 0.74699 0.16464
5.000 0.90909 0.72432 0.61446 0.10986
6.000 1.09091 0.39506 0.46168 0.06662
7.000 1.27273 0.33879 0.29367 0.04512
8.000 1.45455 0.08849 0.11599 0.02750
9.000 1.63636 -0.04781 -0.06552 0.01771
10.000 1.81818 -0.25729 -0.24487 0.01242
11.000 2.00000 -0.41050 -0.41615 0.00565
Grafica:
Para el método de Taylor
Programa:
function M_Teylor(a,b,y0,n)
%Programado por Apolinario Pariona Javier Elias
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
% SALIDA:
% S -> valores de la funcion y(x) en los puntos x
h=(b-a)/n;
x=a:h:b;
y(1)=y0;
z(1)=cos(x(1))-exp(-50*x(1));%Solucion Original(aqui poner la solucion
original de la ecuacion)
l=0;
err(1)=abs(y(1)-z(1));
fprintf('%40s\n','Metodo de Teylor de orden n')
fprintf('--------------------------------------------------------------
\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','Real','error')
fprintf('--------------------------------------------------------------
\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1),err(1))
for i=1:n
>> M_crank_nicolson(0,2,0,11)
Metodo de Crack Nicolson
--------------------------------------------------------------
i x(i) y(i) Real error
--------------------------------------------------------------
0.000 0.00000 0.00000 0.00000 0.00000
1.000 0.18182 1.62960 0.98340 0.64619
2.000 0.36364 0.52805 0.93461 0.40656
3.000 0.54545 1.12089 0.85489 0.26600
4.000 0.72727 0.58235 0.74699 0.16464
5.000 0.90909 0.72432 0.61446 0.10986
6.000 1.09091 0.39506 0.46168 0.06662
7.000 1.27273 0.33879 0.29367 0.04512
8.000 1.45455 0.08849 0.11599 0.02750
9.000 1.63636 -0.04781 -0.06552 0.01771
10.000 1.81818 -0.25729 -0.24487 0.01242
11.000 2.00000 -0.41050 -0.41615 0.00565
Grafica:
Ambos métodos se ven que tienen casi la misma eficacia pero el método de
Taylor es un poquito más eficiente (Eso se ve en error que hay con la
aproximada y el exacto)
Ejercicio N4:
Programa:
function M_Runge_kutta3_sistem2(a,b,f,g,y0,z0,n)
% ENTRADA:
% a -> valor inicial del segmento
% b -> valor final del segmento
% f -> funcion X'=f(t,z,w)
% g -> funcion Y'=f(t,z,w)
% y0 -> condicion inicial X(a)=y0
% z0 -> condicion inicial Y(a)=z0
% n -> numero de particiones
% SALIDA:
% S -> valores de las funciones X(t) y Y(t) en los puntos t
h=(b-a)/n;
x=a:h:b;
y(1)=y0; z(1)=z0;
l=0;
fprintf('%40s\n','Metodo Runge Kutta 4 de 2 sistemas')
fprintf('----------------------------------------------\n')
fprintf('%4s %12s %12s %12s\n','i','x(i)','y(i)','z(i)')
fprintf('----------------------------------------------\n')
fprintf('%6.3f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1))
for i=1:n
ky1=f(x(i),y(i),z(i));
kz1=g(x(i),y(i),z(i));
ky2=f(x(i)+h/2,y(i)+h*ky1/2,z(i)+h*kz1/2);
kz2=g(x(i)+h/2,y(i)+h*ky1/2,z(i)+h*kz1/2);
ky3=f(x(i)+h/2,y(i)+h*ky2/2,z(i)+h*kz2/2);
kz3=g(x(i)+h/2,y(i)+h*ky2/2,z(i)+h*kz2/2);
y(i+1)=y(i)+(ky1+2*ky2+2*ky3)*(h/6);
z(i+1)=z(i)+(kz1+2*kz2+2*kz3)*(h/6);
fprintf('%6.3f %12.5f %12.5f %12.5f\n',i,x(i+1),y(i+1),z(i+1))
end
s=[x' y' z'];
subplot(2,1,1)
plot(x,y,'.')
grid minor
grid on
xlabel('t')
xlabel('y')
title('Curva y(t)')
hold on
ezplot('exp(-x)*cos(x)',[0,1])%grafica del valor real en y
legend('y aprox','y exacta')
subplot(2,1,2)
plot(x,z,'.')
grid minor
grid on
xlabel('t')
xlabel('z')
title('Curva z(t)')
hold on
ezplot('exp(-x)*sin(x)',[0,1])%grafica del valor real en z
legend('z aprox','z exacta')
%plot(x,y,x,z);
>> S=dsolve('Dy=-y-z,Dz=y-z,y(0)=1,z(0)=0','x')
S =
z: [1×1 sym]
y: [1×1 sym]
>> S.y
ans =
exp(-x)*cos(x)
>> S.z
ans =
exp(-x)*sin(x)
>> M_Runge_kutta3_sistem2(0,1,f,g,1,0,20)
Metodo Runge Kutta 4 de 2 sistemas
----------------------------------------------
i x(i) y(i) z(i)
----------------------------------------------
0.000 0.00000 1.00000 0.00000
1.000 0.05000 0.95835 0.04002
2.000 0.10000 0.91684 0.07671
3.000 0.15000 0.87559 0.11021
4.000 0.20000 0.83471 0.14066
5.000 0.25000 0.79432 0.16821
6.000 0.30000 0.75451 0.19299
7.000 0.35000 0.71536 0.21515
8.000 0.40000 0.67696 0.23482
9.000 0.45000 0.63937 0.25213
10.000 0.50000 0.60265 0.26722
11.000 0.55000 0.56686 0.28021
12.000 0.60000 0.53204 0.29123
13.000 0.65000 0.49823 0.30039
14.000 0.70000 0.46546 0.30782
15.000 0.75000 0.43375 0.31363
16.000 0.80000 0.40314 0.31793
17.000 0.85000 0.37362 0.32082
18.000 0.90000 0.34522 0.32241
19.000 0.95000 0.31794 0.32280
20.000 1.00000 0.29178 0.32208
Grafica:
Ejercicio N5:
Programa:
function M_Runge_kutta2_sistem3(a,b,f,g,p,y0,z0,w0,n)
%Programado por Apolinario Pariona Javier Elias
% f -> funcion de tipo inline
% ENTRADA:
% g -> funcion de tipo inline
% p -> funcion de tipo inline
% a -> valor inicial del segmento
% b -> valor final del segmento
% y0 -> condicion inicial y(a)=y0
% n -> numero de particiones
% z0 -> condicion inicial z(a)=z0
% p0 -> condicion inicial p(a)=p0
h=(b-a)/n;
x=a:h:b;
y(1)=y0; z(1)=z0; w(1)=w0;
l=0;
fprintf('%42s\n','Metodo de Ronge Kutta 2 de 3 sistemas')
fprintf('----------------------------------------------\n')
fprintf('%4s %12s %12s %12s %12s\n','i','x(i)','y(i)','z(i)','w(i)')
fprintf('----------------------------------------------\n')
fprintf('%6.3f %12.5f %12.5f %12.5f %12.5f\n',l,x(1),y(1),z(1),w(1))
for i=1:n
ky1=f(x(i),y(i),z(i),w(i)); kz1=g(x(i),y(i),z(i),w(i));
kw1=p(x(i),y(i),z(i),w(i));
ky2=f(x(i)+h,y(i)+h*ky1,z(i)+h*kz1,w(i)+h*kw1);
kz2=g(x(i)+h,y(i)+h*ky1,z(i)+h*kz1,w(i)+h*kw1);
kw2=p(x(i)+h,y(i)+h*ky1,z(i)+h*kz1,w(i)+h*kw1);
y(i+1)=y(i)+(ky1+ky2)*(h/2);
z(i+1)=z(i)+(kz1+kz2)*(h/2);
w(i+1)=w(i)+(kw1+kw2)*(h/2);
fprintf('%6.3f %12.5f %12.5f %12.5f
%12.5f\n',i,x(i+1),y(i+1),z(i+1),w(i+1))
end
y'
s=[x' y' z' w'];
plot(x,y,x,z,x,w)
legend('y(x)','z(x)','w(x)')
pause
subplot(3,1,1)
plot(x,y,'.')
grid on
grid minor
xlabel('t')
xlabel('y')
title('Curva y(t)')
%hold on
%ezplot('2 - exp(x)',[0,2])%grafica del valor real en y
%legend('y aprox','y exacta')
subplot(3,1,2)
plot(x,z,'.')
grid minor
grid on
xlabel('t')
xlabel('z')
title('Curva z(t)')
%hold on
%ezplot('4*exp(x) - x*exp(x) - 2',[0,2])%grafica del valor real en z
%legend('z aprox','z exacta')
subplot(3,1,3)
plot(x,w,'.')
grid minor
grid on
xlabel('t')
xlabel('w')
title('Curva w(t)')
%hold on
%ezplot('5*exp(x) - x*exp(x) - 2',[0,2])%grafica del valor real en w
%legend('w aprox','w exacta')
y =
0
0
0.0000
0.0000
0.0001
0.0001
0.0003
0.0006
0.0010
0.0016
0.0025
0.0037
0.0053
0.0074
0.0100
0.0132
0.0172
0.0220
0.0277
0.0346
0.0426
Graficas:
Comparando con la exacta
>> plot(0:0.05:1,y)
>> hold on
>> ezplot('exp(-x)/2 + exp(x)/2 - x^2/2 - 1',[0,1])