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

1

SOLUCION DE ECUACIONES DIFERENCIALES ORDINARIAS CON MATLAB


Profesor: Mg Edgar Ruiz Lizama
25 de Junio de 2011

Una ecuación diferencial ordinaria (EDO) de primer orden es una ecuación que puede escribirse en la
forma:

𝑑𝑦
𝑦′ = = 𝑔(𝑥, 𝑦)
𝑑𝑥

Donde 𝑥 es la variable independiente y 𝑦 es la variable que es una función de 𝑥. Las siguientes


ecuaciones son ejemplos de EDO de primer orden[1]:

Ecuación 1: 𝑦′ = 𝑔1 (𝑥, 𝑦) = 3𝑥 2
Ecuación 2: 𝑦′ = 𝑔2 (𝑥, 𝑦) = −0.131𝑦
Ecuación 3: 𝑦′ = 𝑔3 (𝑥, 𝑦) = 3.4444𝐸 − 05 − 0.0015𝑦
Ecuación 4: 𝑦′ = 𝑔4 (𝑥, 𝑦) = 2. 𝑥. 𝑐𝑜𝑠 2 (𝑦)
Ecuación 5: 𝑦′ = 𝑔5 (𝑥, 𝑦) = 3𝑦 + 𝑒 2𝑥

Observe que 𝑦 ′ se da como una función de x en la Ecuación 1; 𝑦 ′ es una función de 𝑦 en las


Ecuaciones 2 y 3, y es función tanto de 𝑥 como de 𝑦 en las Ecuaciones 4 y 5.

Una solución a una Edo de primer orden es una función 𝑦 = 𝑓(𝑥) tal que 𝑓 ′ (𝑥) = 𝑔(𝑥, 𝑦). Calcular
la solución de una EDO implica integrar para obtener 𝑦 a partir de 𝑦′; por tanto, las técnicas para
resolver ecuaciones diferenciales también se conocen como técnicas para integrar ecuaciones
diferenciales. La solución de una EDO generalmente es una familia de funciones. Por lo general se
requiere de una condición inicial o condición de frontera para especificar una solución. Las
soluciones analíticas de las EDO presentadas líneas arriba, se determinaron usando ciertas
condiciones iniciales, y son:

Solución de la Ecuación 1: 𝑦 = 𝑥 3 − 7.5


Solución de la Ecuación 2: 𝑦 = 4𝑒 −0.131𝑥
Solución de la Ecuación 3: 𝑦 = 0.022963 − 0.020763𝑒 −0.0015𝑥
Solución de la Ecuación 4: 𝑦 = 𝑡𝑎𝑛−1 (𝑥 2 + 1)
Solución de la Ecuación 5: 𝑦 = 4𝑒 3𝑥 − 𝑒 2𝑥

Funciones ode en MATLAB


MATLAB posee dos funciones para calcular soluciones numéricas de EDOS: ode23 y ode45. A
continuación se describen sus argumentos:

[x,y] = ode23(‘nombre_funcion’, [a, b], inicial)


Devuelve un conjunto de coordenadas x,y que representan la función 𝑦 = 𝑓(𝑥) y se calculan
usando métodos de Runge-Kutta de segundo y tercer orden. El ‘nombre_funcion’ define una
función 𝑓 que devuelve valores de la ecuacion diferencial 𝑦 ′ = 𝑔(𝑥, 𝑦) cuando recibe valores
de 𝑥 y 𝑦. Los valores a y b especifican los extremos del intervalo en el cual deseamos evaluar
la función 𝑦 = 𝑓(𝑥). El valor dado en inicial especifica el valor de la función 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 función 𝑦 = 𝑓(𝑥) y se calculan
usando métodos de Runge-Kutta de cuarto y quinto orden. El ‘nombre_funcion’ define una
2

función 𝑓 que devuelve valores de la ecuación diferencial 𝑦 ′ = 𝑔(𝑥, 𝑦) cuando recibe valores
de 𝑥 y 𝑦. Los valores a y b especifican los extremos del intervalo en el cual deseamos evaluar
la función 𝑦 = 𝑓(𝑥). El valor dado en inicial especifica el valor de la función en el extremo
izquierdo del intervalo [a, b].

NOTA.- Las funciones ode23 y ode45 también pueden recibir argumentos adicionales. Se puede usar
un cuatro parámetro para especificar una tolerancia relacionada con el tamaño de paso; las
tolerancias por omisión son 0.001 para ode23 y 0.000001 para ode45. Se puede usar un quinto
parámetro para solicitar que la función exhiba resultados intermedios (es decir, que realice un
rastreo); el valor por omisión de 0 indica que no se deben rastrear los resultados. Si usted decide
utilizar técnicas numéricas con argumentos opcionales, no olvide incluir comentarios en el
programa que definan dichos argumentos opcionales y su propósito en caso de usarse.

EJEMPLO 1:
Vamos a usar ode23 para resolver las Ecuaciones diferenciales Ordinarias presentadas en la primera
página de este documento. Definimos cada ecuación en su respectivo archivo M tal como sigue:

% Ecuacion 1
function dy = g1(x,y)
% g1 evalua una EDO de primer orden
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);
3

% 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
[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
4

ARCHIVOS PARA LOS METODOS DE EULER, HEUN, EULER MODIFICADO Y RUNGE-KUTTA DE


4TO ORDEN
% 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
% 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
5

% 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 líquido fluye de un tanque cónico invertido por un orificio circular a razón de

𝑑𝑥 √2𝑔𝑥
= −0.6𝜋𝑟02
𝑑𝑡 𝐴(𝑥)

Donde 𝑟0 = 3 mm es el radio del orificio, 𝑥 es la altura de la superficie del líquido desde el vértice del
cono y 𝐴(𝑥) es el área transversal del depósito a una altura 𝑥. Suponga que la altura inicial del
líquido es de 3 m y el volumen inicial es de 60𝜋 𝑚3 .

a) Hallar el nivel del líquido al cabo de 10 días, mediante los métodos de Euler, Heun y Euler
modificado, con ℎ = 18000
b) Comparar las soluciones obtenidas con la solución exacta del problema.
c) Justificar el orden de cada método observando como disminuye el error al disminuir el
tamaño de paso.

SOLUCION

R Denotamos R, r los radios del cono a la altura inicial 𝑥(0) =


3 𝑚 y a una altura 𝑥 respectivamente según la figura.

Inicialmente, se tiene 𝑉0 = 60𝜋, como el volumen del cono


3 1
es 𝑉0 = 3 𝜋𝑅 2 3 igualamos ambas expresiones y obtenemos
r 𝑅 = √60 𝑚
A(x)
Por la semejanza que se tiene en la figura, se tiene:
x
𝑟 𝜋
=
√60 3

De donde se deduce el área a una altura 𝑥:


6

20 2
𝐴(𝑥) = 𝜋𝑟 2 = 𝜋𝑥
3

Con lo que la ecuación de diferencias queda tal como sigue:

𝑑𝑥 √2𝑔𝑥
= −0,6𝜋𝑟02
𝑑𝑡 20𝜋/3𝑥 2

Para hallar el nivel del líquido al cabo de 10 días 𝑡 = 10 ∗ 24 ∗ 3600 = 864000𝑠 con ℎ =
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 métodos 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 líquido en el depósito al cabo de 10 días, observamos que
apenas ha descendido 0,7 m.

t Euler Heun Euler Modificado Sol. Exacta


864000 2,283036 2,279216 2,279230 2,279214

a) Podemos hallar la solución exacta de la EDO resolviéndola por partes, ya que tiene la forma:

𝑑𝑥 √𝑥 √2𝑔
=𝐶 co 𝐶 = −0,6𝜋𝑟02
𝑑𝑡 𝑥2 20𝜋/3

Por tanto la solución exacta es


5
𝑥 = ( 𝐶𝑡 + 35⁄2 )2/5
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:
7

>> x0 = 3; se = nivelexacto(t,x0)';
>> e1 = max(abs(y1-se))

Para el método de Euler, e1 = 0.0038.

>> e2 = max(abs(y2-se))

Para el método de Heun, e2 = 1.9706e-006

>> e3 = max(abs(y3-se))

Para el método de Euler modificado, e3 = 1.6155e-005

b) Para establecer el orden de cada método, vamos a obtener las soluciones aproximadas con el
doble de subintervalos, comparando con la solución exacta obtendremos nuevas
estimaciones para el error, la relación con los errores hallados anteriormente nos indicara el
orden del método. Por ejemplo, para el método 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 y para Euler modificado, resultando 𝑒1⁄𝐸1 = 1,988769 ≅ 2, para
Heun 𝑒2⁄𝐸2 = 4,053784 ≅ 4 y para Euler modificado 𝑒3⁄𝐸3 = 3,981835 ≅ 4 Con esto
último se ratifica que el primer método es de orden 1 y los dos siguientes son de orden 2.

EJEMPLO 3:
En un circuito eléctrico, se dispone de un condensador con capacidad constante 𝐶 = 1,1faradios y
una resistencia 𝑅 = 2,1 ohmios. Se le aplica un voltaje

𝐸(𝑡) = 𝑒 −0,06𝜋𝑡 𝑠𝑒𝑛(2𝑡 − 𝜋)

La ecuación diferencial que rige el comportamiento de un circuito sin inducción es:

𝑑𝐼 𝐼 𝑑𝐸
𝑅 + =
𝑑𝑡 𝐶 𝑑𝑡

Suponga que la intensidad en el instante inicial es 𝐼(0) = 1 amperio.

a) Obtener la ecuación 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 método de Runge-Kutta de cuarto orden.
c) Graficar el campo de direcciones y la solución en [0, 2]x[0, 1].
d) Utilizar distintas aproximaciones de la solución para comprobar el orden del método de
Runge-Kutta.

SOLUCION
8

a) El problema de valor inicial que debemos resolver es:


1
2,1𝐼 ′ + 1,1 𝐼 = 𝑒 −0,06𝜋𝑡 (−0.06𝜋𝑠𝑒𝑛(2𝑡 − 𝜋) + 2 cos(2𝑡 − 𝜋)) en [0, 2], con 𝐼(0) = 1

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


ecuación 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 aproximación 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 Intensidad t Intensidad
0,2 0,757370 1,2 0,444205
0,4 0,565464 1,4 0,526884
0,6 0,439028 1,6 0,613883
0,8 0,382297 1,8 0,683465
1,0 0,389035 2,0 0,718580

c) Graficamos la solución 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);
uno = ones(size(tt));
dI = circuito(tt,II);
quiver(tt,II,uno,dI)
hold on, plot(t,y1), title('campo de direcciones')
9

d) Para obtener el orden del método, hemos de estimar el error porque no conocemos la
solución exacta. El error de la solución obtenida don paso ℎ = 0,2 se estima mediante la
diferencia con la solución hallada con paso ℎ = 0,1.

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

Y hallamos el error de la aproximación con:

>> E1 = max(abs(y1-y2(1:2:end)))

E1 =
3.1590e-006

Resolvemos de nuevo la ecuación duplicando el número 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

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