"sur un domaine monodimensionnel $\\Omega$ par une méthode de discrétisation de type différences finies. Nous vous proposons de détailler pas à pas les différentes étapes en réalisant \n",
"systématiquement des tests unitaires afin de valider vos implantations.<br> \n",
"\n",
"Les étapes proposées sont les suivantes:<br>\n",
"- Choisir une condition initiale $ u_{0}(x)$ au problème $(P)$. \n",
"- Imposer une solution exacte $ u_{ex}(x,t)$ au problème $(P)$. \n",
"- En déduire $f$ le terme source associé à $ u_{ex}(x,t)$. \n",
"- Résoudre numériquement $(P)$ en utilisant les schémas d'Euler explicite et implicite. \n",
"- Déterminer numériquement l'ordre de convergence des schémas de discrétisation en temps. \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import des librairies Python nécessaires"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import scipy as sc\n",
"import scipy.sparse as sparse\n",
"import scipy.sparse.linalg\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"#import matplotlib.animation as animation\n",
"import math"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Définition des paramètres du problème (P)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-3-e30d73daff6c>, line 2)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"<ipython-input-3-e30d73daff6c>\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m N_t =\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
],
"source": [
"# Nombre de pas de discretisation en temps \n",
"N_t = \n",
"# Nombre de pas de discretisation en espace \n",
"M = \n",
"# Nombre de points de discretisation en espace\n",
"N = M + 1\n",
"# Temps final [s]\n",
"T = \n",
"# Pas de discretisation temporel sur [0 T]\n",
"delta_t = T/N_t\n",
"# Pas de discretisation spatial sur le domaine [0,1]\n",
"h = 1/(N-1)\n",
"# Nombre CFL \n",
"c = "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Définition de la fonction solution exacte choisie, du second membre de l'équation de la chaleur et déduction du schéma de construction associé à la solution exacte "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div style=\"background:LightGrey\">\n",
"Indiquer ici le choix de la solution exacte. En déduire le second membre de l'équation définissant le problème (P).\n",
"</div> "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def solution_exacte(x,t):\n",
" \"\"\"\n",
" Fonction representant la solution exacte du probleme de la chaleur. \n",
" Cette fonction doit verifier les conditions initiales et limites sur \n",
" la frontiere du domaine. \n",
" Entrees:\n",
" x: abscisse du point de maillage [float]\n",
" t: temps discret considere [float]\n",
" Sortie:\n",
" Valeur de la solution exacte evaluee en x et au temps t [float]\n",
" \"\"\"\n",
" # A COMPLETER\n",
"\n",
"def second_membre(x, t):\n",
" \"\"\"\n",
" Fonction representant le second membre associe a la solution exacte du probleme \n",
" de la chaleur. \n",
" Entrees:\n",
" x: abscisse du point de maillage [float]\n",
" t: temps discret considere [float]\n",
" Sortie:\n",
" Valeur du second membre evalue en x et au temps t [float]\n",
" \"\"\"\n",
" # A COMPLETER\n",
"\n",
"def schema_exact(N, h, c, T, delta_t, u0):\n",
" \"\"\"\n",
" Fonction representant le tableau bidimensionnel [espace, temps] correspondant a la \n",
" solution en chaque point du maillage et a tout temps discret.\n",
" Entrees:\n",
" N: Nombre de points de discretisation en espace [int]\n",
" h: Pas de maillage spatial [float]\n",
" c: Nombre CFL [float]\n",
" T: Temps final [float]\n",
" delta_t: Pas de discretisation temporel [float]\n",
" u0: condition initiale [array]\n",
" Sortie:\n",
" U_exacte: Tableau bidimensionnel de la solution evaluee en tout x et a tout temps t [float]\n",
" \"\"\"\n",
" # Initialisation de la solution \n",
" \n",
" # Prise en compte de la solution initiale\n",
" \n",
" # Deduction de la solution aux autres instants \n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Définition de la condition initiale et affichage de la solution exacte pour différents instants "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#\n",
"# Definition de la condition initiale comme un tableau monodimensionnel en espace\n",
"#\n",
"u0 = np.zeros(N, dtype=float)\n",
"# A COMPLETER\n",
"\n",
"#\n",
"# Deduction de la solution exacte par appel de la fonction schema_exact\n",
"#\n",
"U = schema_exact(N, h, c, T, delta_t, u0)\n",
"#\n",
"# Representation graphique a differents instants a choisir\n",
"plt.title(\"Evolution de la température sur la barre pour T=\" + str(T))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Détermination de l'ordre de convergence des schémas de discrétisation en temps"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div style=\"background:LightGrey\">\n",
"Indiquer ici comment vous calculez cet ordre de convergence. Quelle est la valeur attendue pour les schémas d'Euler explicite ou implicite ? Vérifier ce résultat graphiquement. \n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def erreur(U_exacte, U, h):\n",
" \"\"\"\n",
" Calcul de l'erreur discrete \n",
" Entrees:\n",
" U_exacte: solution exacte du probleme considere [float]\n",
" U : solution discrete pour un schema donne [float]\n",
" h : pas de discretisation spatial [float]\n",
" Sortie: \n",
" norme de l'erreur discrete [float]\n",
" \"\"\"\n",
" # A COMPLETER"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def ordre_discretisation_temps(h, N, T):\n",
" \"\"\"\n",
" Calcul de l'ordre de discretisation en temps\n",
" Entrées : \n",
" h: pas de discretisation spatial [float]\n",
" N: nombre de points de discretisation en espace [int]\n",
" T: temps final [float]\n",
" Sortie : \n",
" time_step: pas de temps en loi log [float, array]\n",
"plt.plot(time_step,1.*time_step,color='red',label='Ordre 1 en temps')\n",
"plt.plot(time_step,2.*time_step,color='green',label='Ordre 2 en temps')\n",
"plt.xlabel(\"Log(Delta t)\")\n",
"plt.ylabel(\"Log(Norme de l'erreur)\")\n",
"plt.title('Analyse de convergence: Equation de la chaleur')\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div style=\"background:LightGrey\">\n",
"Indiquer ici l'ordre de convergence obtenu effectivement. Obtenez-vous le comportement obtenu ? \n",
"</div>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#\n",
"# Affichage des donnees pour validation et inter-comparaison\n",
"#\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Schéma de discrétisation en temps du second ordre"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div style=\"background:LightGrey\">\n",
"Résoudre (P) cette fois avec le schéma temporel d'ordre deux implicite Crank-Nicolson. Commenter votre code pour indiquer les changements effectués. Vérifier par une méthodologie identique l'ordre de convergence de ce schéma. \n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Bonus: Généralisation pour des conditions limites spatiales non homogènes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div style=\"background:MistyRose\">\n",
"<br>\n",
"Nous souhaitons résoudre désormais le problème de la chaleur muni de conditions limites de \n",
"type Dirichlet non homogènes suivant:\n",
"<br> \n",
"$$ (P_{nh}) ~ \\left \\{\n",
" \\begin{array}{11}\n",
" \\ \\displaystyle \\frac{\\partial u}{\\partial t}-\\Delta u = f \\, \\, \\, \\, \\, \\, (\\Omega \\times [0, T]),\\\\\n",
"sur un domaine monodimensionnel $\\Omega$ par une méthode de discrétisation de type différences finies.<br> \n",
"\n",
"Reprendre les étapes proposées précédemment:\n",
"\n",
"- Imposer une condition initiale et une solution exacte $ u_{ex}(x,t)$ au problème $(P_{nh})$. \n",
"- En déduire $f$ le terme source associé à $ u_{ex}$. \n",
"- Résoudre numériquement $(P_{nh})$ en utilisant un schéma de votre choix. \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
%% Cell type:markdown id: tags:
<center>
<h1> Résolution de l'équation de la chaleur par discrétisation différences finies en temps et en espace</h1>
<h1> Année 2021-2022 - IENM2 </h1>
<h1> Nom: </h1>
<h1> Prénom: </h1>
</center>
%% Cell type:markdown id: tags:
## Objectifs
%% Cell type:markdown id: tags:
<divstyle="background:MistyRose">
<br>
Nous souhaitons résoudre le problème de la chaleur muni de conditions limites de type Dirichlet homogènes suivant:
<br>
$$ (P)~ \left \{
\begin{array}{11}
\ \displaystyle \frac{\partial u}{\partial t}-\Delta u = f \,\,\,\,\,\, (\Omega \times [0, T])\\
\ u(0,t)=0 \,\,\,\,\,\, (\partial \Omega) \\
\ u(1,t)=0 \,\,\,\,\,\, (\partial \Omega) \\
\ u(x,0)=u_{0}(x) \,\,\,\,\,\, (t=0)
\end{array}
\right. $$
<br>
sur un domaine monodimensionnel $\Omega$ par une méthode de discrétisation de type différences finies. Nous vous proposons de détailler pas à pas les différentes étapes en réalisant
systématiquement des tests unitaires afin de valider vos implantations.<br>
Les étapes proposées sont les suivantes:<br>
- Choisir une condition initiale $ u_{0}(x)$ au problème $(P)$.
- Imposer une solution exacte $ u_{ex}(x,t)$ au problème $(P)$.
- En déduire $f$ le terme source associé à $ u_{ex}(x,t)$.
- Résoudre numériquement $(P)$ en utilisant les schémas d'Euler explicite et implicite.
- Déterminer numériquement l'ordre de convergence des schémas de discrétisation en temps.
%% Cell type:markdown id: tags:
### Import des librairies Python nécessaires
%% Cell type:code id: tags:
``` python
importscipyassc
importscipy.sparseassparse
importscipy.sparse.linalg
importnumpyasnp
importmatplotlib.pyplotasplt
#import matplotlib.animation as animation
importmath
```
%% Cell type:markdown id: tags:
### Définition des paramètres du problème (P)
%% Cell type:code id: tags:
``` python
# Nombre de pas de discretisation en temps
N_t=
# Nombre de pas de discretisation en espace
M=
# Nombre de points de discretisation en espace
N=M+1
# Temps final [s]
T=
# Pas de discretisation temporel sur [0 T]
delta_t=T/N_t
# Pas de discretisation spatial sur le domaine [0,1]
h=1/(N-1)
# Nombre CFL
c=
```
%% Output
File "<ipython-input-3-e30d73daff6c>", line 2
N_t =
^
SyntaxError: invalid syntax
%% Cell type:markdown id: tags:
### Définition de la fonction solution exacte choisie, du second membre de l'équation de la chaleur et déduction du schéma de construction associé à la solution exacte
%% Cell type:markdown id: tags:
<divstyle="background:LightGrey">
Indiquer ici le choix de la solution exacte. En déduire le second membre de l'équation définissant le problème (P).
</div>
%% Cell type:code id: tags:
``` python
defsolution_exacte(x,t):
"""
Fonction representant la solution exacte du probleme de la chaleur.
Cette fonction doit verifier les conditions initiales et limites sur
la frontiere du domaine.
Entrees:
x: abscisse du point de maillage [float]
t: temps discret considere [float]
Sortie:
Valeur de la solution exacte evaluee en x et au temps t [float]
"""
# A COMPLETER
defsecond_membre(x,t):
"""
Fonction representant le second membre associe a la solution exacte du probleme
de la chaleur.
Entrees:
x: abscisse du point de maillage [float]
t: temps discret considere [float]
Sortie:
Valeur du second membre evalue en x et au temps t [float]
"""
# A COMPLETER
defschema_exact(N,h,c,T,delta_t,u0):
"""
Fonction representant le tableau bidimensionnel [espace, temps] correspondant a la
solution en chaque point du maillage et a tout temps discret.
Entrees:
N: Nombre de points de discretisation en espace [int]
h: Pas de maillage spatial [float]
c: Nombre CFL [float]
T: Temps final [float]
delta_t: Pas de discretisation temporel [float]
u0: condition initiale [array]
Sortie:
U_exacte: Tableau bidimensionnel de la solution evaluee en tout x et a tout temps t [float]
"""
# Initialisation de la solution
# Prise en compte de la solution initiale
# Deduction de la solution aux autres instants
```
%% Cell type:markdown id: tags:
### Définition de la condition initiale et affichage de la solution exacte pour différents instants
%% Cell type:code id: tags:
``` python
#
# Definition de la condition initiale comme un tableau monodimensionnel en espace
#
u0=np.zeros(N,dtype=float)
# A COMPLETER
#
# Deduction de la solution exacte par appel de la fonction schema_exact
#
U=schema_exact(N,h,c,T,delta_t,u0)
#
# Representation graphique a differents instants a choisir
#
x=np.linspace(0,1,N)
plt.plot(x,U[:,0],label="à T=0")
plt.plot(x,U[:,int(N_t/5)],label="à T/5")
plt.plot(x,U[:,int(N_t/2)],label="à T/2")
plt.plot(x,U[:,int(T/delta_t)-1],label="à T")
plt.legend()
plt.grid(True)
plt.title("Evolution de la température sur la barre pour T="+str(T))
plt.show()
```
%% Cell type:markdown id: tags:
### Construction du schéma explicite en temps
%% Cell type:code id: tags:
``` python
defschema_explicite(N,h,c,T,delta_t,U_explicite):
"""
Fonction representant le tableau bidimensionnel [espace, temps] correspondant a la
solution en chaque point du maillage et a tout temps discret obtenue avec le schema
explicite.
Entrees:
N: Nombre de points de discretisation en espace [int]
h: Pas de maillage spatial [float]
c: Nombre CFL [float]
T: Temps final [float]
delta_t: Pas de discretisation temporel [float]
u0: condition initiale [array]
Sortie:
U_explicite: Tableau bidimensionnel de la solution du schema explicite evaluee en tout x et a tout temps t [float]
"""
#
# Création de la matrice A via une matrice creuse (interieur du domaine)
#
#
# Application du schéma sur les points interieurs
#
```
%% Cell type:markdown id: tags:
### Affichage de la solution discrète pour le schéma explicite pour différents instants
%% Cell type:code id: tags:
``` python
#
# Definition de la condition initiale comme un tableau monodimensionnel en espace
#
u0=np.zeros(N,dtype=float)
# A COMPLETER
#
# Deduction de la solution du schema explicite en temps
# Representation graphique a differents instants a choisir
#
x=np.linspace(0,1,N)
plt.plot(x,Ui[:,0],label="à T=0")
plt.plot(x,Ui[:,int(N_t/5)],label="à T/5")
plt.plot(x,Ui[:,int(N_t/2)],label="à T/2")
plt.plot(x,Ui[:,int(T/delta_t)-1],label="à T")
plt.legend()
plt.grid(True)
plt.title("Evolution de la température sur la barre pour T="+str(T))
plt.show()
```
%% Cell type:markdown id: tags:
### Détermination de l'ordre de convergence des schémas de discrétisation en temps
%% Cell type:markdown id: tags:
<divstyle="background:LightGrey">
Indiquer ici comment vous calculez cet ordre de convergence. Quelle est la valeur attendue pour les schémas d'Euler explicite ou implicite ? Vérifier ce résultat graphiquement.
</div>
%% Cell type:code id: tags:
``` python
deferreur(U_exacte,U,h):
"""
Calcul de l'erreur discrete
Entrees:
U_exacte: solution exacte du probleme considere [float]
U : solution discrete pour un schema donne [float]
h : pas de discretisation spatial [float]
Sortie:
norme de l'erreur discrete [float]
"""
# A COMPLETER
```
%% Cell type:code id: tags:
``` python
defordre_discretisation_temps(h,N,T):
"""
Calcul de l'ordre de discretisation en temps
Entrées :
h: pas de discretisation spatial [float]
N: nombre de points de discretisation en espace [int]
plt.plot(time_step,1.*time_step,color='red',label='Ordre 1 en temps')
plt.plot(time_step,2.*time_step,color='green',label='Ordre 2 en temps')
plt.xlabel("Log(Delta t)")
plt.ylabel("Log(Norme de l'erreur)")
plt.title('Analyse de convergence: Equation de la chaleur')
plt.legend()
plt.grid(True)
plt.show()
```
%% Cell type:markdown id: tags:
<divstyle="background:LightGrey">
Indiquer ici l'ordre de convergence obtenu effectivement. Obtenez-vous le comportement obtenu ?
</div>
%% Cell type:code id: tags:
``` python
#
# Affichage des donnees pour validation et inter-comparaison
#
```
%% Cell type:markdown id: tags:
### Schéma de discrétisation en temps du second ordre
%% Cell type:markdown id: tags:
<divstyle="background:LightGrey">
Résoudre (P) cette fois avec le schéma temporel d'ordre deux implicite Crank-Nicolson. Commenter votre code pour indiquer les changements effectués. Vérifier par une méthodologie identique l'ordre de convergence de ce schéma.
</div>
%% Cell type:markdown id: tags:
### Bonus: Généralisation pour des conditions limites spatiales non homogènes
%% Cell type:markdown id: tags:
<divstyle="background:MistyRose">
<br>
Nous souhaitons résoudre désormais le problème de la chaleur muni de conditions limites de
type Dirichlet non homogènes suivant:
<br>
$$ (P_{nh}) ~ \left \{
\begin{array}{11}
\ \displaystyle \frac{\partial u}{\partial t}-\Delta u = f \,\,\,\,\,\, (\Omega \times [0, T]),\\