<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Hoja 2. Ejercicios Python
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
Step1:  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.
Ejercicio 1
Escribe una matriz diagonal D que tenga elementos igual a 2 por encima y por debajo de la diagonal principal
Step2:  Calcula ahora la matriz traspuesta y la matriz inversa de la matriz D
Step3:  Ejercicio 2
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?
Step4:  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.
Step5:  Pista
Step6:  Reto
<ASSISTANT_TASK:>
Python Code:
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
Explanation: Hoja 2. Ejercicios Python
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:
End of explanation
# Introduce aquí tu código
Explanation: 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.
Ejercicio 1
Escribe una matriz diagonal D que tenga elementos igual a 2 por encima y por debajo de la diagonal principal
End of explanation
# Introduce aquí tu código
Explanation: Calcula ahora la matriz traspuesta y la matriz inversa de la matriz D
End of explanation
# Introduce aquí tu código
Explanation: Ejercicio 2
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?
End of explanation
# Introduce aquí tu código
Explanation: 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.
End of explanation
# Introduce aquí tu código
Explanation: Pista: las condiciones periódicas implican que $u_{n_x} = u_0$
Ejercicio 3
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?
End of explanation
# Introduce tu código aquí
Explanation: 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.
End of explanation
<END_TASK>