diff --git a/EDP/.DS_Store b/EDP/.DS_Store index ca0c512a5cf2781d6d16b78dc0717b3048e23459..ea279fd65dc514bf8c2e089a2dc8011ef7e7b1bb 100644 Binary files a/EDP/.DS_Store and b/EDP/.DS_Store differ diff --git a/EDP/TP_chaleur_python_eleves_2021_2022.ipynb b/EDP/TP_chaleur_python_eleves_2021_2022.ipynb deleted file mode 100644 index b446ef2de59fc595d286df2a0a7a9a85469a8317..0000000000000000000000000000000000000000 --- a/EDP/TP_chaleur_python_eleves_2021_2022.ipynb +++ /dev/null @@ -1,578 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<center>\n", - "<h1> Résolution de l'équation de la chaleur par discrétisation différences finies en temps et en espace</h1>\n", - "<h1> Année 2021-2022 - IENM2 </h1>\n", - "<h1> Nom: </h1>\n", - "<h1> Prénom: </h1> \n", - "</center>" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Objectifs " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "<div style=\"background:MistyRose\">\n", - "<br>\n", - "Nous souhaitons résoudre le problème de la chaleur muni de conditions limites de type Dirichlet homogènes suivant:\n", - "<br> \n", - "$$ (P)~ \\left \\{\n", - " \\begin{array}{11}\n", - " \\ \\displaystyle \\frac{\\partial u}{\\partial t}-\\Delta u = f \\, \\, \\, \\, \\, \\, (\\Omega \\times [0, T])\\\\\n", - " \\ u(0,t)=0 \\, \\, \\, \\, \\, \\, (\\partial \\Omega) \\\\\n", - " \\ u(1,t)=0 \\, \\, \\, \\, \\, \\, (\\partial \\Omega) \\\\\n", - " \\ u(x,0)=u_{0}(x) \\, \\, \\, \\, \\, \\, (t=0)\n", - " \\end{array} \n", - " \\right. $$\n", - "<br> \n", - "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", - "- Imposer une solution exacte $ u_{ex}(x,t)$ au problème $(P)$. \n", - "- En déduire une condition initiale $ u_{0}(x)$ 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": 1, - "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": 2, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (<ipython-input-2-e30d73daff6c>, line 2)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"<ipython-input-2-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 pour avoir votre condition initiale\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", - "#\n", - "x = np.linspace(0, 1, N)\n", - "plt.plot(x, U[:,0], label=\"à T=0\")\n", - "plt.plot(x, U[:, int(N_t/5)], label=\"à T/5\")\n", - "plt.plot(x, U[:, int(N_t/2)], label=\"à T/2\")\n", - "plt.plot(x, U[:,int(T/delta_t)-1], label=\"à T\" )\n", - "plt.legend()\n", - "plt.grid(True)\n", - "plt.title(\"Evolution de la température sur la barre pour T=\" + str(T))\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Construction du schéma explicite en temps" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def schema_explicite(N, h, c, T, delta_t, U_explicite):\n", - " \"\"\"\n", - " Fonction representant le tableau bidimensionnel [espace, temps] correspondant a la \n", - " solution en chaque point du maillage et a tout temps discret obtenue avec le schema \n", - " explicite.\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_explicite: Tableau bidimensionnel de la solution du schema explicite evaluee en tout x et a tout temps t [float]\n", - " \"\"\"\n", - "\n", - " #\n", - " # Création de la matrice A via une matrice creuse (interieur du domaine)\n", - " #\n", - " \n", - " \n", - " #\n", - " # Application du schéma sur les points interieurs\n", - " #\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Affichage de la solution discrète pour le schéma explicite pour différents instants " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "#\n", - "# La condition initiale est celle qui a été définie ci-dessus\n", - "\n", - "#\n", - "# Deduction de la solution du schema explicite en temps\n", - "#\n", - "U_explicite = np.zeros((N, int(T/delta_t)), dtype=float)\n", - "U_explicite[:,0] = u0\n", - "Ue = schema_explicite(N,h,c, T, delta_t, U_explicite)\n", - "#\n", - "# Representation graphique a differents instants a choisir\n", - "#\n", - "x = np.linspace(0, 1, N)\n", - "plt.plot(x, Ue[:,0], label=\"à T=0\")\n", - "plt.plot(x, Ue[:, int(N_t/5)], label=\"à T/5\")\n", - "plt.plot(x, Ue[:, int(N_t/2)], label=\"à T/2\")\n", - "plt.plot(x, Ue[:,int(T/delta_t)-1], label=\"à T\" )\n", - "plt.legend()\n", - "plt.grid(True)\n", - "plt.title(\"Evolution de la température sur la barre pour T=\" + str(T))\n", - "plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Construction du schéma implicite en temps" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def schema_implicite(N,h,c, T, delta_t, U_implicite):\n", - " \"\"\"\n", - " Fonction representant le tableau bidimensionnel [espace, temps] correspondant a la \n", - " solution en chaque point du maillage et a tout temps discret obtenue avec le schema \n", - " explicite.\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_implicite: Tableau bidimensionnel de la solution du schema implicite evaluee en tout x et a tout temps t [float]\n", - " \"\"\"\n", - " #\n", - " # Création de la matrice A via une matrice creuse\n", - " #\n", - " \n", - " #\n", - " # Application du schéma sur les points interieurs\n", - " # \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Affichage de la solution discrète pour le schéma implicite pour différents instants " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#\n", - "# La condition initiale est celle qui a été définie ci-dessus\n", - "\n", - "#\n", - "# Deduction de la solution du schema implicite en temps\n", - "#\n", - "U_implicite = np.zeros((N, int(T/delta_t)), dtype=float)\n", - "U_implicite[:,0] = u0\n", - "Ui = schema_implicite(N,h,c, T, delta_t, U_implicite)\n", - "#\n", - "# Representation graphique a differents instants a choisir\n", - "#\n", - "x = np.linspace(0, 1, N)\n", - "plt.plot(x, Ui[:,0], label=\"à T=0\")\n", - "plt.plot(x, Ui[:, int(N_t/5)], label=\"à T/5\")\n", - "plt.plot(x, Ui[:, int(N_t/2)], label=\"à T/2\")\n", - "plt.plot(x, Ui[:,int(T/delta_t)-1], label=\"à T\" )\n", - "plt.legend()\n", - "plt.grid(True)\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", - " erreur : erreur en loi log[float, array]\n", - " \"\"\"\n", - " time_step = np.zeros(10)\n", - " error = np.zeros(10)\n", - " count = 0\n", - " \n", - " for loop in range(20, 120, 10):\n", - " delta = 1./loop\n", - " c = delta/(h**2)\n", - " #\n", - " # Initialisation pour la solution exacte\n", - " #\n", - " u0 = np.zeros(N, dtype=float)\n", - " # A COMPLETER\n", - " U_exacte = schema_exact(N, h, c, T, delta, u0) \n", - " #\n", - " # Initialisation pour la solution numérique\n", - " #\n", - " U_implicite = np.zeros((N, int(T/delta)), dtype=float)\n", - " u0 = np.zeros(N, dtype=float)\n", - " # A COMPLETER\n", - " U_implicite[:,0] = u0\n", - " #\n", - " #\n", - " #\n", - " U_implicite = schema_implicite(N, h, c, T, delta, U_implicite)\n", - " error[count] = math.log(erreur(U_exacte, U_implicite, h))\n", - " time_step[count] = math.log(delta) \n", - " count += 1\n", - " \n", - " return time_step, error" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#\n", - "# Construction des elements pour l'analyse du schema\n", - "#\n", - "time_step, error = ordre_discretisation_temps(h, N, T)\n", - "\n", - "#\n", - "# Creation de la figure\n", - "#\n", - "theta = 1.0\n", - "fig = plt.figure()\n", - "plt.plot(time_step,error,marker='*',color='blue',label='Euler implicite (theta='\"%3.2f\"%theta+')')\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", - " \\ u(0,t)= u_g{(t)} \\, \\, \\, \\, \\, \\, (\\partial \\Omega), \\\\\n", - " \\ u(1,t)= u_d{(t)} \\, \\, \\, \\, \\, \\, (\\partial \\Omega), \\\\\n", - " \\ u(x,0)= u_{0}(x) \\, \\, \\, \\, \\, \\, (t=0),\n", - " \\end{array} \n", - " \\right. $$\n", - "<br> \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 -} diff --git a/EDP/slide-intro-TP.pdf b/EDP/slide-intro-TP.pdf deleted file mode 100644 index 82ae1b99c604d283794b51a9424cef756c08f9f1..0000000000000000000000000000000000000000 Binary files a/EDP/slide-intro-TP.pdf and /dev/null differ