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

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:

Donde es la variable independiente y es la variable que es una funcin de . Las siguientes ecuaciones son ejemplos de EDO de primer orden[1]: Ecuacin 1: Ecuacin 2: Ecuacin 3: Ecuacin 4: Ecuacin 5: Observe que se da como una funcin de x en la Ecuacin 1; es una funcin de Ecuaciones 2 y 3, y es funcin tanto de como de en las Ecuaciones 4 y 5. en las

Una solucin a una Edo de primer orden es una funcin tal que . Calcular la solucin de una EDO implica integrar para obtener a partir de ; por tanto, las tcnicas para resolver ecuaciones diferenciales tambin se conocen como t cnicas 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: Solucin de la Ecuacin 2: Solucin de la Ecuacin 3: Solucin de la Ecuacin 4: Solucin de la Ecuacin 5:

Funcionesodeen 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 se calculan usando mtodos de Runge-Kutta de segundo y tercer orden. El nombre_funcion define una funcin 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 funcin . 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 se calculan usando mtodos de Runge-Kutta de cuarto y quinto orden. El nombre_funcion define una

2 funcin que devuelve valores de la ecuacin diferencial cuando recibe valores de y . Los valores a y b especifican los extremos del intervalo en el cual deseamos evaluar la funcin . 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 unquinto 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 .

EJEMPLO1: 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 functiondy = g1(x,y) % g1 evalua una EDO de primer orden dy = 3*x.^2;

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

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

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

% Ecuacion 5 functiondy = 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; % Solucionanalitica 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); % Solucionanalitica 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); % Solucionanalitica 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); % Solucionanalitica 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); % Solucionanalitica 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, HEUN, EULER MODIFICADO Y RUNGE-KUTTA DE 4TO ORDEN
% Archivo: miE uler.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 lquido fluye de un tanque cnico invertido por un orificio circular a razn de

Donde mm es el radio del orificio, es la altura de la superficie del lquido desde el vrtice del cono y es el rea transversal del depsito a una altura . Suponga que la altura inicial del lquido es de 3m y el volumen inicial es de  . a) Hallar el nivel del lquido al cabo de 10 das, mediante los mtodos de Euler, Heun y Euler modificado, con 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

Denotamos R, r los radios del cono a la altura inicial  y a una altura respectivamente segn la figura. Inicialmente, se tiene , como el volumen del cono es = igualamos ambas expresiones y obtenemos
 

3 A(x)
x r

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

De donde se deduce el rea a una altura :

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




Para hallar el nivel del lquido al cabo de 10 das , 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));

con

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 864000 Euler 2,283036 Heun 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: co Por tanto la solucin exacta es

Ahora lo guardamos en el archivo nivelexacto.m:

% ARCHIVO nivelexacto.M % Para resolver el ejemplo de un tanque conico invertido % Solucionanalitica 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 y para Euler modificado, resultando , para Heun y para Euler modificado 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 una resistencia ohmios. Se le aplica un voltaje

faradios y

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

Suponga que la intensidad en el instante inicial es

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

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

en [0, 2], con

b) Para resolver mediante Runge-Kutta, escribimos el archivo circuito.m que contiene la ecuacin diferencial % Archivo circuito.m functiondI = 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); uno = ones(size(tt)); dI = circuito(tt,II); quiver(tt,II,uno,dI) holdon, 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 se estima mediante la diferencia con la solucin hallada con paso . >> [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

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