Taller 3. Método de Diferencias Finitas Curso: Matemática Superior Integrantes: Nota: /10 1. Introducción El método de diferencias finitas se basa en aproximaciones que permiten reemplazar ecuaciones diferenciales por ecuaciones de diferencias finitas. Estas aproximaciones de diferencias finitas son de naturaleza algebraica; relacionan el valor de la variable dependiente en un punto de la región de solución con los valores en algunos puntos vecinos. Así, una solución por diferencias finitas involucra básicamente tres pasos: Dividir la región de solución en una cuadrícula de nodos. Aproximar la ecuación diferencial dada mediante un equivalente de diferencias finitas que relaciona la variable dependiente en un punto de la región de solución con sus valores en los puntos vecinos. Resolver las ecuaciones de diferencias, sujetas a las condiciones de frontera y/o condiciones iniciales prescritas. 1.1. Esquemas de diferencias finitas Figura 1. Partición para la aproximación de derivadas 1.2 Diferencias Finitas para la ecuación de difusión en dos dimensiones 2 Antes de encontrar la solución por diferencias finitas para la ecuación de difusión, analicemos como se estiman las derivadas numéricamente. Considere la partición de la Figura 1, podemos aproximar la pendiente de la tangente en x0 , utilizando la pendiente de rectas secantes, de las siguientes formas: 1. Fórmula de diferencias hacia adelante: f ′ (x0 ) ≈ f (x0 + ∆x) − f (x0 ) ∆x 2. Fórmula de diferencias hacia atrás: f ′ (x0 ) ≈ f (x0 ) − f (x0 − ∆x) ∆x 3. Fórmula de diferencias centradas: f ′ (x0 ) ≈ f (x0 + ∆x) − f (x0 − ∆x) 2∆x También podemos estimar la segunda derivada, de la siguiente forma: f ′ (x0 ) ≈ Ejercicio f (x0 + ∆x) − 2f (x0 ) + f (x0 − ∆x) (∆x)2 (1) 1 (1 punto) Consulta y muestra la deducción de la última fórmula, a partir de la expansión de Taylor para f (x + ∆x) y f (x − ∆x). 1.2. Diferencias Finitas para la ecuación de difusión en dos dimensiones Consideremos la siguiente ecuación de difusión en dos dimensiones: ( 2 ) ∂ u ∂ 2u ∂u −D + =0 ∂t ∂x2 ∂y 2 En un dominio rectangular, que vamos a dividir en una cuadrícula, como se muestra en la Figura 2, (notar que también hemos discretizado el tiempo, utilizando una partición con pasos de tamaño ∆t): 2 1.3 Implementación 3 Figura 2. (Izquierda) Partición 2d para la aproximación de derivadas. (Derecha) Stencil en espacio. Además, vamos a considerar un esquema explícito, de modo que para garantizar estabilidad 2 . requerimos: ∆t ≤ ∆x 4D Ejercicio 2 (1 punto) Consulta y elabora un breve resumen de las ventajas y desventajas de utilizar esquemas implícitos y explícitos para la aproximación numérica de EDOs. Así, usando diferencias finitas hacia adelante, la ecuación (1) y el ”stencil”de la figura 2 (derecha), tenemos el siguiente esquema numérico: ( k ) k uk+1 ui+1,j − 2uki,j + uki−1,j uki,j+1 − 2uki,j + uki,j−1 i,j − ui,j −D + =0 ∆t ∆x2 ∆y 2 Donde los subíndices (i, j), se refieren a la partición en espacio, en las direcciones x y y respectivamente, y el superíndice k a la partición en tiempo. 2 , y reordenamos los términos de Finalmente, por facilidad, tomamos ∆x = ∆y, y D∆t = (∆x) 2D la ecuación anterior para obtener: ( uk+1 i,j = uki,j uki+1,j − 2uki,j + uki−1,j uki,j+1 − 2uki,j + uki,j−1 + + ∆t ∆x2 ∆y 2 ) (2) 1.3. Implementación Ejercicio 3 (3 puntos) Implementa un script de Matlab/Octave para el esquema de la ecuación (2), utilizando la guía que se presenta a continuación. (Adjunta el archivo del script además del pdf del taller). Vamos a implementar el esquema anterior, para el problema de valores iniciales y de frontera: 3 1.3 Implementación 4 ( 2 ) ∂u ∂ u ∂ 2u =0 −D + ∂t ∂x2 ∂y 2 u(x, 0, t) = u(0, y, t) = u(5, y, t) = 0 u(x, 5, t) = 100 u(x, y, 0) = 0 para 0 ≤ x ≤ 5, 0 ≤ y ≤ 5, t > 0 1. Primero definimos los datos del problema y nuestro dominio, para eso vamos a almacenar 50 celdas por lado en una matriz cuadrada, inicializada a cero: D = 5; % Difusividad termica DX = DY = 0.1; % paso espacial DT = DX ^2/(2* D); % paso temporal N = 51; U (1:N ,1: N) = 0; % estado inicial 2. Añadimos la condición de borde: U(N ,1: N) = 100; 3. Ahora vamos a implementar tres iteraciones anidadas: Una temporal, que por facilidad la vamos a fijar en 2000 pasos, y dos espaciales donde los índices i, j, recorrerán de 2 a N − 1 (no se actualizan los bordes, para conservar las condiciones de frontera). Comenzamos inicializando algunos contadores que nos serán útiles para generar una animación de la simulación: fram =0; pasos =0; Dentro de la iteración temporal y antes de comenzar las iteraciones espaciales, asignamos el valor de uk : U_k = U; Al interior de la doble iteración espacial (en x y y), calculamos la temperatura uk+1 , actualizada según la ecuación (2) U(i ,j)=U(i ,j)+( DT *(( U_k (i+1 ,j) -2* U_k (i,j)+ U_k (i -1 ,j))/DX ^2 ... + ( U_k (i,j +1) -2* U_k (i,j)+ U_k (i,j -1) )/DY ^2) ); Al salir de las iteraciones espaciales, vamos a guardar los datos cada 50 pasos para generar la animación final. En Matlab podemos utilizar el siguiente código: pasos = pasos +1; if ( mod ( pasos ,50) ==0) % guardamos un frame cada 50 pasos fram = fram +1; contour (U); axis ([1 N 1 N ]) h= gca ; fh = figure (1) ; set (fh , 'color ', 'white '); 4 REFERENCIAS 5 F= getframe ; end 4. Terminada la iteración temporal, visualizamos el resultado final llamando a movie (F,fram ,1) Ejercicio 4 (2 puntos) Toma tres capturas a tiempos diferentes de la simulación con el script anterior. Cambia el tipo de gráfico de contorno contour(U); a uno de superficie surf(u);, y presenta tres capturas más. Ejercicio 5 (3 puntos) Ahora genera un nuevo script, donde utilices una condición Dirichlet homogénea en todos los bordes (u = 0), y en su lugar añade una condición inicial: un cuadrado (elige un tamaño de entre 5 a 10 nodos) en el centro que está a temperatura u = 1000. Presenta tres capturas a diferentes tiempos de este nuevo escenario. Referencias [1] Kong, Siauw, Bayen, Python Programming and Numerical Methods - A Guide for Engineers and Scientists, Primera ed, 2020. [2] G Nervadof, Solving 2D Heat Equation Numerically using Python, 2020. 5