Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Análisis Numérico Grupo: 13 UNAM / FI / DCB(DIE) Semestre 2021-1 Tarea 8 Ecuaciones Diferenciales y Sistemas de Ecuaciones Diferenciales Araiza Alfredo, Rincón Carlos, Sánchez Axel 1. Gráfica comparativa de la solución de la ecuación diferen- cial de primer orden: xy′ + y = ey/x Euler y Euler mejorado con h = 0.1 Runge-Kutta 4to orden con h = 0.3 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 Euler Euler mejorado RK4 clásico AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 2. Gráfica comparativa de la solución de la ecuación diferen- cial de segundo orden: y′′ + 3y′ + 2y = x + 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 0 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 0.275 0.3 Euler Heun RK4 2 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 3. Gráfica comparativa de la solución de la ecuación diferen- cial con valores en la frontera: 2u′′ + u′ + 3u = 23sin( t 2) 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 X 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4 Y Límites Primera adivinanza Segunda adivinanza Metodo de Disparo Diferencias Finitas 4. Descripción de trabajo en equipo Para obtener los resultados, nos repartimos equitativamente todo el trabajo, Alfredo se encargó de realizar y modificar los programas para el inciso 2, es decir, todos aquellos que se ocupan para poder realizar los distintos métodos para un sistema de ecuaciones diferenciales, Carlos realizó los programas para poder efectuar correctamente los métodos que nos permiten obtener la solución de una ecuación diferencial de primer orden, además del desarrollo a mano y pasar la información a LATEXy Axel se encargó de realizar todos los programas con respecto al método de disparo y diferencias finitas. Al final realizamos una videollamada para verificar que el archivo y su contenido sean los correctos y para aclarar las dudas que surgieron en el proceso. 3 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 5. Desarrollo 4 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 5 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 6. Códigos utilizados ’Código Principal 1’ 1 clc % Borra Command Window 2 clear all % Borra Workspace 3 close all % Cierra ventanas 4 5 f1 = @(x,y) (exp(y/x)-y)/(x); % Ecuación a resolver 6 h1 = 0.1; % Paso para Euler y Euler mejorado 7 h2 = 0.3; % Paso para RK4 8 x = 1:h1:1.9; % Dominio 9 x2 = 1:h2:1.9; % Dominio 10 y0 = 1; % Condición inicial 11 12 %% Solución por el método de Euler 13 y = eulerEDO(f1,x,y0) 14 plot(x,y,’Color’,’c’,’MarkerSize’,6,’LineWidth’,2) 15 %% Solución por el método de Euler mejorado 16 y1 = eulermejoradoEDO(f1,x,y0) 17 hold on 18 plot(x,y1,’Color’,’g’,’MarkerSize’,6,’LineWidth’,2) 19 %% Solución por el método de RK4 clásico 20 y2 = RK4clasico(f1,x2,y0) 21 hold on 22 plot(x2,y2,’s’,’Color’,’m’,’MarkerSize’,6,’LineWidth’,2) 23 xlabel(’x’,’interpreter’,’latex’,’Fontsize’,16) 24 ylabel(’y’,’interpreter’,’latex’,’Fontsize’,16) 25 legend(’Euler’,’Euler mejorado’,’RK4 clásico’) ’Código Euler’ 1 function y = eulerEDO(f,x,y0) 2 y = 0*x; % Define vector y solución 3 y(1) = y0; % Condición inicial 4 h = x(2) - x(1); % Determinar el paso 5 n = length(x); % Determinar el número de elementos de x 6 for i=1:n-1 7 y(i+1) = y(i) + h*f(x(i),y(i)); % Método de Euler 8 end 9 end 10 ’Código Euler mejorado’ 1 function y = eulermejoradoEDO(f,x,y0) 2 y = 0*x; % Define vector y solución 6 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 3 y(1) = y0; % Condición inicial 4 h = x(2) - x(1); % Determinar el paso 5 n = length(x); % Determinar el número de elementos de x 6 for i=1:n-1 7 k1 = f(x(i),y(i)); 8 k2 = f(x(i)+(1/2)*h,y(i)+1/2*k1*h); 9 10 y(i+1) = y(i) + h*k2; % Método de Euler mejorado 11 end 12 end ’Código RK4 clásico’ 1 function y = RK4clasico(f,x,y0) 2 y = 0*x; % Vector "y" lleno de ceros (dimensiones de x) 3 y(1) = y0; % Condición inicial 4 h = x(2)-x(1); % Paso 5 n = length(x); % Tamaño del vector "x" 6 for i = 1:n-1 7 k1 = f(x(i),y(i)); % Calcula k1 8 k2 = f(x(i)+(1/2)*h,y(i)+(1/2)*k1*h); % Calcula k2 9 k3 = f(x(i)+(1/2)*h,y(i)+(1/2)*k2*h); % Calcula k3 10 k4 = f(x(i)+h,y(i)+k3*h); % Calcula k4 11 12 y(i+1) = y(i) + (1/6)*h*(k1+2*k2+2*k3+k4); % Calcula y(i+1) 13 end 14 end ’Código Principal 2’ 1 clc % Borra Command Window 2 clear all % Borra Workspace 3 close all % Cierra ventanas 4 5 f2 = @(x,u) [ u(2) ; -3*u(2)-2*u(1)+x+1 ]; % Vector con ec. de estado 6 u0 = [0;0]; % Vector con condiciones iniciales 7 x = 0:0.1:1; % Dominio dividido en "n" pasos 8 9 %% Por el método de Euler 10 Euler = EulerSEDO(f2,x,u0) 11 plot(x,Euler(1,:),’Color’,’g’,’MarkerSize’,6,’LineWidth’,2) 12 %% Poel método de Heun 13 Heun = HeunSEDO(f2,x,u0) 14 hold on 15 plot(x,Heun(1,:),’s’,’Color’,’m’,’MarkerSize’,6,’LineWidth’,2) 16 %% Por el método de Runge-Kutta 4 orden 7 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 17 RK4 = RK4SEDO(f2,x,u0) 18 hold on 19 plot(x,RK4(1,:),’Color’,’c’,’MarkerSize’,6,’LineWidth’,2) 20 xlabel(’x’,’interpreter’,’latex’,’Fontsize’,16) 21 ylabel(’y’,’interpreter’,’latex’,’Fontsize’,16) 22 legend(’Euler’,’Heun’,’RK4’) ’Código Euler SEDO’ 1 function u = EulerSEDO(f,x,u0) 2 u(:,1) = u0; % Primera columna es vector con condiciones iniciales 3 h = x(2) - x(1); % Paso 4 n = length(x); % Tamaño del vector x 5 6 for i = 1:n-1 7 u(:,i+1) = u(:,i) + h*f(x(i),u(:,i)); % Método de Euler SEDO 8 end 9 end 10 ’Código Heun SEDO’ 1 function u = HeunSEDO(f,x,u0) 2 u(:,1) = u0; % Primera columna es vector con condiciones iniciales 3 h = x(2) - x(1); % Paso 4 n = length(x); % Tamaño del vector x 5 6 for i = 1:n-1 7 8 k1 = f(x(i),u(:,i)); % Calcula k1 9 k2 = f(x(i)+h,u(:,i)+h*k1); % Calcula k2 10 11 u(:,i+1) = u(:,i) + (1/2)*h*(k1+k2); % Método de Heun 12 end 13 end ’Código RK4 SEDO’ 1 function u = RK4SEDO(f,x,u0) 2 u(:,1) = u0; % Primera columna es vector con condiciones iniciales 3 h = x(2) - x(1); % Paso 4 n = length(x); % Tamaño del vector x 5 6 for i = 1:n-1 7 8 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 8 k1 = f(x(i),u(:,i)); % Calcula k1 9 k2 = f(x(i)+(1/2)*h,u(:,i)+(1/2)*h*k1); % Calcula k2 10 k3 = f(x(i)+(1/2)*h,u(:,i)+(1/2)*h*k2); % Calcula k3 11 k4 = f(x(i)+h,u(:,i)+h*k3); % Calcula k4 12 13 u(:,i+1) = u(:,i) + (1/6)*h*(k1+2*k2+2*k3+k4); % Método RK 4 14 end 15 end ’Código Principal 3’ 1 clc % Borra Command Window 2 clear all % Borra Workspace 3 close all % Cierra ventanas 4 5 % Vector con variables de estado 6 f = @(t,x) [ x(2); (1/2)*(-x(2)-3*x(1)+(2/3)*sin(t/2)) ]; 7 t = 0:0.05:1; % Dominio de variable independiente 8 % t- variable independiente 9 % x- vector con x1, x2 (variables de estado) 10 11 %% Condiciones de frontera 12 u_0 = 0; % u(0)=0 -> CONOCIDA 13 u_1 = 1;% u(1)=1 -> OBJETIVO 14 figure 15 plot([0 1],[u_0 u_1],’rd’,’MarkerSize’,10,’LineWidth’,2) 16 hold on 17 18 %% Adivinanza 1 19 x0_adv1 = [ u_0 ; 2 ]; % Adivinanza de condiciones iniciales 20 21 x_adv1 = RK4SEDO(f,t,x0_adv1) % Resuelve sistema de EDOs 22 u_1adv1 = x_adv1(1,end); 23 plot(t,x_adv1(1,:),’LineWidth’,2) 24 25 %% Adivinanza 2 26 x0_adv2 = [ u_0 ; 1 ]; % Adivinanza de condiciones iniciales 27 28 x_adv2 = RK4SEDO(f,t,x0_adv2) % Resuelve sistema de EDOs 29 u_1adv2 = x_adv2(1,end); 30 plot(t,x_adv2(1,:),’LineWidth’,2) 31 32 %% Interpolación para x2(0) 33 34 xi = 1; % Valor dónde se interpolará => u(10)=100 35 yi = InterpLagrange([u_1adv1; u_1adv2],[2; 1],xi) % Valor de x2(0) 9 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 36 37 %% Resultado Final 38 39 x0_final = [ u_0 ; yi ]; 40 x_final = RK4SEDO(f,t,x0_final) 41 plot(t,x_final(1,:),’LineWidth’,2) 42 legend(’Límites’,’Primera adivinanza’,’Segunda adivinanza’,’Método de Disparo’) 43 44 %% Método de diferencias finitas 45 46 A=[-61/32 17/16 0 ; 15/16 -61/32 17/16; 0 15/16 -61/32]; % Vector A 47 B=[0.00259;0.00515;-1.05487]; % Vector B 48 49 u2_3=metCrout(A,B); % Resuelvesistema de ecuaciones lineales 50 51 xDF = 0:0.25:1; % Vector de dominio para método DF 52 solDF = [u_0 u2_3’ u_1] % Vector solución de ED método DF 53 54 plot(xDF,solDF,’pk’,’MarkerSize’,7,’Linewidth’,2) 55 legend(’Límites’,’Primera adivinanza’,’Segunda adivinanza’,’Método de Disparo’,’Diferencias Finitas’) ’Código Interpolación de Lagrange’ 1 function yi = InterpLagrange(x,y,xi) 2 % x, y son vectores columna 3 % xi, yi son escalares 4 n1 = length(x); % Determinamos el tamaño del vector (n+1) 5 L = ones(1,n1); % Inicializar la multiplicación 6 7 for i=1:n1 % Para L1,L2,L3... 8 for j=1:n1 % Para el producto 9 if j~= i % Pregunta si j es distinto a i 10 L(i)= L(i)*( xi - x(j) )/( x(i) - x(j) ); 11 end 12 end 13 end 14 yi = L*y; % Reemplaza a la sumatoria 15 end ’Código Factorización Crout’ 1 function [L,U] = factCrout(A) 2 n= size(A,1); % Tamano de la matriz A 3 L= zeros(n); % Matrizde ceros 4 U= eye(n); % Matriz con 1s (diagonal principal) 5 for i=1: n % i sirve para los renglones en U, columnas en L 10 AN21-1x13: Tarea 8 Araiza Alfredo, Rincón Carlos, Sánchez Axel 6 if i==1 % ¿Primera vuelta? 7 L(1,1) = A(1,1); 8 for j=2:n % j para las columnas de U, renglones de L 9 L(j,1) = A(j,1); 10 U(1,j) = A(1,j)/L(1,1); 11 end 12 else 13 L(i,i) = A(i,i) - L(i,1:i-1)*U(1:i-1,i); %elementos de la diagonal principal 14 for j = i+1 : n 15 L(j,i) = A(j,i) - L(j,1:i-1)*U(1:i-1,i); 16 U(i,j) = (A(i,j) - L(i,1:i-1)*U(1:i-1,j))/L(i,i); 17 end 18 end 19 end 20 L; %matriz L 21 U;%matriz U 22 end ’Código Método Crout’ 1 function x = metCrout(A,b) 2 [L,U] = factCrout(A); %Factorizacion [L][U] 3 n = size(A,1); 4 5 % Ly=b 6 y= zeros(n,1); %Vector y 7 y(1)= b(1)/L(1,1); 8 for i= 2 : n 9 y(i) = (b(i) - L(i,1:i-1)*y(1:i-1))/L(i,i); 10 end 11 % Ux=y 12 x= zeros(n,1); % Vector x 13 x(n) = y(n); 14 for i= n-1 : -1 : 1 15 x(i) = y(i)-U(i,i+1:n)*x(i+1:n); 16 end 17 end *Se usó el mismo programa de RK4SEDO para los principales 2 y 3. 11
Compartir