You are on page 1of 10

1

SOLUCION DE ECUACIONES DIFERENCIALES ORDINARIAS


CON MATLAB
Profesor: Mg Edgar Ruiz Lizama
25 de Junio de 2011
Una ecuacin diferencial ordinaria (EDO) de primer orden es una ecuacin que
puede escribirse en la forma:

y'=

dy
=g ( x , y )
dx

Donde
de

es la variable independiente y

es la variable que es una funcin

x . Las siguientes ecuaciones son ejemplos de EDO de primer orden [1]:


Ecuacin 1:

y ' =g1 ( x , y )=3 x 2

Ecuacin 2:

y =g2 ( x , y )=0.131 y

Ecuacin 3:

y =g3 ( x , y )=3.4444E-050.0015 y

Ecuacin 4:

y ' =g4 ( x , y ) =2. x . cos2 ( y )

Ecuacin 5:

y =g5 ( x , y )=3 y +e

Observe que
funcin de

'

'

'

'

2x

se da como una funcin de x en la Ecuacin 1;

en las Ecuaciones 2 y 3, y es funcin tanto de

'

es una

como de

en las Ecuaciones 4 y 5.
Una solucin a una Edo de primer orden es una funcin

y=f ( x)

tal que

f ' ( x )=g(x , y ) . Calcular la solucin de una EDO implica integrar para obtener
y

a partir de

y ' ; por tanto, las tcnicas para resolver ecuaciones

diferenciales tambin se conocen como tcnicas para integrar ecuaciones


diferenciales. La solucin de una EDO generalmente es una familia de funciones.
Por lo general se requiere de una condicin inicial o condicin de frontera
para especificar una solucin.
Las soluciones analticas de las EDO
presentadas lneas arriba, se determinaron usando ciertas condiciones iniciales, y
son:
Solucin de la Ecuacin 1:

y=x 37.5

Solucin de la Ecuacin 2:

y=4 e0.131 x

Solucin de la Ecuacin 3:

y=0.0229630.020763 e0.0015 x

Solucin de la Ecuacin 4:

y=tan1 ( x 2+1)

Solucin de la Ecuacin 5:

y=4 e e

3x

2x

Funciones ode en MATLAB


MATLAB posee dos funciones para calcular soluciones numricas de EDOS: ode23
y ode45. A continuacin se describen sus argumentos:
[x,y] = ode23(nombre_funcion, [a, b], inicial)
Devuelve un conjunto de coordenadas x,y que representan la funcin

y=f ( x)

y se calculan usando mtodos de Runge-Kutta de segundo y

tercer orden. El nombre_funcion define una funcin


valores de la ecuacion diferencial

y ' =g( x , y )

que devuelve

cuando recibe valores de

y . Los valores a y b especifican los extremos del intervalo en el

cual deseamos evaluar la funcin

y=f (x) .

El valor dado en inicial

especifica el valor de la funcin en el extremo izquierdo del intervalo [a, b].


[x,y] = ode45(nombre_funcion, [a, b], inicial)
Devuelve un conjunto de coordenadas x,y que representan la funcin

y=f ( x)

y se calculan usando mtodos de Runge-Kutta de cuarto y quinto

orden. El nombre_funcion define una funcin


de la ecuacin diferencial
.

y ' =g( x , y )

que devuelve valores

cuando recibe valores de

Los valores a y b especifican los extremos del intervalo en el cual

deseamos evaluar la funcin

y=f (x) . El valor dado en inicial especifica

el valor de la funcin en el extremo izquierdo del intervalo [a, b].


NOTA.- Las funciones ode23 y ode45 tambin pueden recibir argumentos
adicionales. Se puede usar un cuatro parmetro para especificar una tolerancia
relacionada con el tamao de paso; las tolerancias por omisin son 0.001 para
ode23 y 0.000001 para ode45. Se puede usar un quinto parmetro para solicitar
que la funcin exhiba resultados intermedios (es decir, que realice un rastreo);
el valor por omisin de 0 indica que no se deben rastrear los resultados. Si
usted decide utilizar tcnicas numricas con argumentos opcionales, no
olvide incluir comentarios en el programa que definan dichos
argumentos opcionales y su propsito en caso de usarse.
EJEMPLO 1:
Vamos a usar ode23 para resolver las Ecuaciones diferenciales Ordinarias
presentadas en la primera pgina de este documento. Definimos cada ecuacin
en su respectivo archivo M tal como sigue:
% Ecuacion 1
function dy = g1(x,y)
% g1 evalua una EDO de primer orden

3
dy = 3*x.^2;

% Ecuacion 2
function dy = g2(x,y)
% g2 evalua una EDO de primer orden
dy = -0.131*y;

% Ecuacion 3
function dy = g3(x,y)
% g3 evalua una EDO de primer orden
dy = 3.4444E-5-0.0015*y;

% Ecuacion 4
function dy = g4(x,y)
% g4 evalua una EDO de primer orden
dy = 2*x.*cos(y).^2;

% Ecuacion 5
function dy = g5(x,y)
% g5 evalua una EDO de primer orden
dy = 3*y + exp(2*x);

% Archivo: SolucionesEDO.m
% Resuelve las EDO proporcionadas en g1.m,g2.m,g3.m,g4.m,g5.m
% Utiliza ode23
% Ecuacion 1:
% Intervalo [2,4] suponiendo y = f(2) = 0.5 como condicion inicial
[x,num_y]= ode23('g1',[2,4],0.5);
y = x.^3 - 7.5; % Solucion analitica
plot(x,num_y,x,y,'o')
title('Solucion de la Ecuacion 1')
xlabel('X'), ylabel('Y=f(X)'), grid on
%
% Ecuacion 2:
% Intervalo [0,5] suponiendo y = f(0) = 4 como condicion inicial
[x,num_y]= ode23('g2',[0,5],4);
y = 4*exp(-0.131*x);
% Solucion analitica
figure
plot(x,num_y,x,y,'o')
title('Solucion de la Ecuacion 2')
xlabel('X'), ylabel('Y=f(X)'), grid on
%
% Ecuacion 3
% Intervalo [0,120] suponiendo y=f(0) = 0.0022 como condicion
inicial

4
[x,num_y]= ode23('g3',[0,120],0.0022);
y = 0.022963 - 0.020763*exp(-0.0015*x); % Solucion analitica
figure
plot(x,num_y,x,y,'o')
title('Solucion de la Ecuacion 3')
xlabel('X'), ylabel('Y=f(X)'), grid on
%
% Ecuacion 4
% Intervalo [0,2] suponiendo y=f(0)= pi/4 como condicion inicial
[x,num_y]= ode23('g4',[0,2],pi/4);
y = atan(x.*x + 1); % Solucion analitica
figure
plot(x,num_y,x,y,'o')
title('Solucion de la Ecuacion 4')
xlabel('X'), ylabel('Y=f(X)'), grid on
%
% Ecuacion 5
% Intervalo [0,3] suponiendo y=f(0)=3 como condicion inicial
[x,num_y]= ode23('g5',[0,3],3);
y = 4*exp(3*x) - exp(2*x); % Solucion analitica
figure
plot(x,num_y,x,y,'o')
title('Solucion de la Ecuacion 5')
xlabel('X'), ylabel('Y=f(X)'), grid on

ARCHIVOS PARA LOS METODOS DE EULER,


MODIFICADO Y RUNGE-KUTTA DE 4TO ORDEN

HEUN,

% Archivo: miEuler.m
% Resuelve una EDO por el metodo de EULER
function [t,y] = miEuler(f,t,y1)
% [t,y] = Solucion de aplicar Euler
% y1 es el valor inicial
% t nodos de integracion en [a,b]
% y es la solucion aproximada
n = length(t);
h = diff(t);
y = zeros(n,1);
y(1) = y1;
for k = 1:n-1
y(k+1)=y(k)+h(k)*feval(f,t(k),y(k));
end

% Archivo Heun.m
% Resuelve una EDO de primer orden por el metodo de HEUN
% Este metodo es conocido como Predictor - Corrector
function [t,y] = Heun(f,t,y1)
% [t,y] = Solucion de aplicar Heun
% y1 es el valor inicial

EULER

5
% t nodos de integracion en [a,b]
% y es la solucion aproximada
n = length(t);
h = diff(t);
y = zeros(n,1);
y(1) = y1;
for k = 1:n-1
k1 = feval(f,t(k),y(k))';
yp = y(k) + h(k)*k1;
% Predictor
k2 = feval(f,t(k)+h(k),yp)';
y(k+1) = y(k) + h(k)/2*(k1+k2); % Corrector
end
% Archivo EulerMod.m
% Metodo de Euler modificado
function [t,y] = EulerMod(f,t,y1)
% [t,y] = Solucion de aplicar Euler modificado
% y1 es el valor inicial
% t nodos de integracion en [a,b]
% y es la solucion aproximada
n = length(t);
h = diff(t);
y = zeros(n,1);
y(1) = y1;
for k = 1:n-1
y12 = y(k)+h(k)/2*feval(f,t(k),y(k)); % Estimacion de yk + h/2
y(k+1) = y(k) + h(k)*feval(f,t(k)+h(k)/2,y12); % Estimacion de
yk+1
end

% Archivo RungeKutta4.m
% Aplica el metodo de Runge-Kutta de cuarto orden
function [t,y] = RungeKutta4(f,t,y1)
% [t,y] = Solucion de aplicar RK4
% y1 es el valor inicial
% t nodos de integracion en [a,b]
% y es la solucion aproximada
n = length(t);
h = diff(t);
y = zeros(n,1);
y(1) = y1;
for k = 1:n-1
k1 = feval(f,t(k),y(k));
k2 = feval(f,t(k)+h(k)/2,y(k)+h(k)/2*k1);
k3 = feval(f,t(k)+h(k)/2,y(k)+h(k)/2*k2);
k4 = feval(f,t(k+1),y(k)+h(k)*k3);
y(k+1) = y(k) +h(k)/6*(k1+2*k2+2*k3+k4);
end
EJEMPLO 2:
Un lquido fluye de un tanque cnico invertido por un orificio circular a razn de

dx
2 gx
=0.6 r 20
dt
A( x)
Donde

r 0=3

mm es el radio del orificio,

lquido desde el vrtice del cono y


una altura
inicial es de

A (x )

es la altura de la superficie del

es el rea transversal del depsito a

x . Suponga que la altura inicial del lquido es de 3 m y el volumen


60 m

a) Hallar el nivel del lquido al cabo de 10 das, mediante los mtodos de


Euler, Heun y Euler modificado, con

h=18000

b) Comparar las soluciones obtenidas con la solucin exacta del problema.


c) Justificar el orden de cada mtodo observando como disminuye el error al
disminuir el tamao de paso.
SOLUCION

R
3
r

A(x)
x

Denotamos R, r los radios del cono a la altura


inicial

x ( 0 )=3 m

y a una altura

Inicialmente, se tiene

1
R2 3
3

respectivamente segn la figura.

V 0=60 , como el volumen del cono es

igualamos ambas expresiones y obtenemos

Por la semejanza que se tiene en la figura, se tiene:

=
60 3
De donde se deduce el rea a una altura

x :

R= 60 m

V0 =

7
2

A ( x ) = r =

20
2
x
3

Con lo que la ecuacin de diferencias queda tal como sigue:

dx
2 gx
=0,6 r 20
dt
20 /3 x 2
Para

hallar

el

nivel

t=10243600=864000 s

del
con

lquido

al

cabo

de

10

das

h=1800 , en primer lugar escribimos el

archivo deposito.m.
% Archivo deposito.m
% Para resolver el ejemplo de un tanque conico invertido
function z = deposito(t,y)
r0 = 0.003;
g = 9.8;
z = -0.6*pi*r0^2*sqrt(2*g)*(sqrt(y)/((20*pi/3)*y^2));
Ahora aplicamos los mtodos de Euler, Heun y Euler modificado respectivamente
haciendo:
>> [t,y1] = miEuler('deposito',0:18000:864000,3);
>> [t,y2] = Heun('deposito',0:18000:864000,3);
>> [t,y3] = EulerMod('deposito',0:18000:864000,3);
En la tabla 1, se presentan el nivel del lquido en el depsito al cabo de 10 das,
observamos que apenas ha descendido 0,7 m.
t

Euler

Heun

864000

2,283036

2,279216

Euler
Modificado
2,279230

Sol. Exacta
2,279214

a) Podemos hallar la solucin exacta de la EDO resolvindola por partes, ya


que tiene la forma:

dx
x
=C 2
dt
x

co

C=0,6 r 20

2 g
20 /3

Por tanto la solucin exacta es


2 /5

5
x=( Ct + 35/ 2)
2

Ahora lo guardamos en el archivo nivelexacto.m:

% ARCHIVO nivelexacto.M
% Para resolver el ejemplo de un tanque conico invertido
% Solucion analitica o exacta

function x = nivelexacto(t,x0)
r = 0.003;
g = 9.8;
C = -0.6*pi*r^2*sqrt(2*g)/(20*pi/3);
x = (5/2*C*t + 3^2.5).^(2/5);
De este modo calculamos los errores exactos de las aproximaciones
obtenidas haciendo:
>> x0 = 3; se = nivelexacto(t,x0)';
>> e1 = max(abs(y1-se))
Para el mtodo de Euler, e1 = 0.0038.
>> e2 = max(abs(y2-se))
Para el mtodo de Heun, e2 = 1.9706e-006
>> e3 = max(abs(y3-se))
Para el mtodo de Euler modificado, e3 = 1.6155e-005
b) Para establecer el orden de cada mtodo, vamos a obtener las soluciones
aproximadas con el doble de subintervalos, comparando con la solucin
exacta obtendremos nuevas estimaciones para el error, la relacin con los
errores hallados anteriormente nos indicara el orden del mtodo. Por
ejemplo, para el mtodo de Euler:
>> [t,y1] = miEuler('deposito',0:18000/2:8640000,3);
>> se = nivelexacto(t,x0)';
>> E1 = max(abs(y1-se))
E1 =
10.0077
Repetimos

para

Heun

para

e 1/ E 1=1,988769 2 , para Heun

modificado

e 3 /E 3=3,981835 4

Euler

modificado,

e 2/ E 2=4,053784 4

resultando

y para Euler

Con esto ltimo se ratifica que el primer

mtodo es de orden 1 y los dos siguientes son de orden 2.


EJEMPLO 3:
En un circuito elctrico, se dispone de un condensador con capacidad constante

C=1,1 faradios y una resistencia

R=2,1

ohmios. Se le aplica un voltaje

E ( t ) =e0,06 t sen (2t )


La ecuacin diferencial que rige el comportamiento de un circuito sin induccin
es:

dI I dE
+ =
dt C dt

Suponga que la intensidad en el instante inicial es

I ( 0 ) =1 amperio.

a) Obtener la ecuacin diferencial para los datos del problema.


b) Obtener el valor aproximado de la intensidad cada 0,2 segundos durante
los dos primeros segundos, con el mtodo de Runge-Kutta de cuarto orden.
c) Graficar el campo de direcciones y la solucin en [0, 2]x[0, 1].
d) Utilizar distintas aproximaciones de la solucin para comprobar el orden
del mtodo de Runge-Kutta.
SOLUCION
a) El problema de valor inicial que debemos resolver es:
'

2,1 I +

1
0,06 t
I =e
(0.06 sen ( 2 t ) +2 cos ( 2t ) )
1,1

en [0, 2], con

I ( 0 ) =1

b) Para resolver mediante Runge-Kutta, escribimos el archivo circuito.m que


contiene la ecuacin diferencial
% Archivo circuito.m
function dI = circuito(t,I)
%
dI = -1/(2.1*1.1)*I+1/2.1*exp(-0.06*pi*t)...
.*(-0.06*pi*sin(2*t-pi)+2*cos(2*t-pi));
Ejecutamos el programa Rungekutta4.m para obtener la aproximacin
pedida.
>> [t,y1] = rungekutta4('circuito',0:.2:2,1)
Mostramos los valores de la intensidad, al cabo de los dos primeros
segundos con paso 0,2 en la tabla 2, la intensidad del circuito va
disminuyendo a lo largo del tiempo.
I
0,2
0,4
0,6
0,8
1,0

Intensidad
0,757370
0,565464
0,439028
0,382297
0,389035

t
1,2
1,4
1,6
1,8
2,0

Intensidad
0,444205
0,526884
0,613883
0,683465
0,718580

c) Graficamos la solucin junto al campo de direcciones


Escribimos el siguiente archivo en MATLAB
% Archivo campo de direcciones para el circuito del ejemplo
%
I = 0:.1:1;
[tt,II] = meshgrid(t,I);

10
uno = ones(size(tt));
dI = circuito(tt,II);
quiver(tt,II,uno,dI)
hold on, plot(t,y1), title('campo de direcciones')

d) Para obtener el orden del mtodo, hemos de estimar el error porque no


conocemos la solucin exacta. El error de la solucin obtenida don paso

h=0,2

paso

se estima mediante la diferencia con la solucin hallada con

h=0,1 .

>> [t,y2]= rungekutta4('circuito',0:.1:2,1)


Y hallamos el error de la aproximacin con:
>> E1 = max(abs(y1-y2(1:2:end)))
E1 =
3.1590e-006
Resolvemos de nuevo la ecuacin duplicando el nmero de sub intervalos
>> [t,y2]= rungekutta4('circuito',0:.1:2,1);
>> [t,y3]= rungekutta4('circuito',0:.05:2,1);
>> E2 = max(abs(y2-y3(1:2:end)))
E2 =
1.9764e-007

You might also like