Este cuaderno está pensado para que sigáis practicando con Python y ODEs. En esta hoja nos centraremos en el álgebra lineal y la difusión.
La base, como siempre, la tenéis en las diapositivas de clase, las explicaciones y los notebooks Convección con Algebra Lineal y Difusión-1D.
Empezamos como siempre, cargando los módulos que vayamos a utilizar:
In [3]:
import numpy as np
import matplotlib.pyplot as plt #Esta es otra forma de importar el submódulo pyplot!
#Igual de válida que la que hemos visto en clase
%matplotlib inline
Hasta ahora, hemos trabajado con vectores, aplicándolos a la resolución de la ecuación de convección en 1-D. Vamos a ver ahora cómo resolver la ecuación de difusión y cómo aplicar matrices y operaciones de álgebra lineal para resolver un esquema implicito.
Escribe una matriz diagonal D que tenga elementos igual a 2 por encima y por debajo de la diagonal principal
In [4]:
# Introduce aquí tu código
Calcula ahora la matriz traspuesta y la matriz inversa de la matriz D
In [5]:
# Introduce aquí tu código
Sigue los pasos del notebook Convección con Algebra Lineal para montar el sistema $u^{n+1} = D \cdot u^{n}$. Aplícale el algoritmo upwind ( $u_i^{n+1} = u_i^n - \mathrm{Co} (u_{i}^n-u_{i-1}^n)$ ) para obtener una solución. ¿Qué es lo que pasa? ¿Es la misma solución que la que obteníamos a través de bucles?
In [ ]:
# Introduce aquí tu código
Hasta ahora, no nos hemos preocupado de las condiciones de contorno. Pero como veis, estas tienen gran importancia en el resultado final. Las condiciones de contorno corresponden a los extremos de nuestra matriz D. Trata de implementar condiciones de periodicidad en este problema.
In [ ]:
# Introduce aquí tu código
Pista: las condiciones periódicas implican que $u_{n_x} = u_0$
Por lo que parece, no supone un gran cambio utilizar matrices en lugar de bucles, y la complejidad aumenta. ¿Por qué utilizarlas entonces? Bien, porque hay ciertos esquemas que sólo pueden resolverse de esta manera: los métodos implicitos.
En un método implícito utilizamos los datos correspondientes al paso temporal siguiente. Por tanto, hay que resolver un sistema del tipo $u^{n+1} \cdot D' = u^n$, donde la matriz $D'$ es una matriz diferente a D y sólo se conserva la notación por comodidad.
Repite la solución del ejercicio anterior, pero utilizando ahora un método implicito. ¿Qué cambios observas?
In [ ]:
# Introduce aquí tu código
Reto: El método de Crank-Nicolson es un método numérico muy utilizado en la resolución de ODEs. Busca información del método (aquí, por ejemplo) y trata de implementarlo de acuerdo a lo aprendido hasta ahora.
In [ ]:
# Introduce tu código aquí