"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"# la librairie time nous sera utile pour calculer le temps d'execution des scripts\n",
"import time \n",
"#Option pour afficher les figures dans le notebook et eviter le plt.show():\n",
"%matplotlib inline "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"On se propose dans ce TP, d'étudier la résolution numérique de l'équation de Burger:\n",
"\n",
"$$\n",
"\\displaystyle{\\dfrac{\\partial u}{\\partial t}+u\\dfrac{\\partial u}{\\partial x}=\\nu\\dfrac{\\partial^2 u}{\\partial x^2}}\n",
"$$\n",
"\n",
"Cette équation ressemble à une équation d'advection diffusion mais comporte un terme non linéaire: $u\\partial_x u$. C'est ce terme non-linéaire qui va permettre l'apparition de discontinuité.\n",
"\n",
"On peut également écrire cette équation sous forme conservative en remarquant que $u\\partial u$ peut s'écrire sous la forme $\\dfrac{1}{2}\\partial u^2$. Ce qui donne l'équation de Burger sous forme conservative:\n",
"\n",
"$$\n",
"\\displaystyle{\\dfrac{\\partial u}{\\partial t}+\\dfrac{1}{2}\\dfrac{\\partial u^2}{\\partial x}=\\nu\\dfrac{\\partial^2 u}{\\partial x^2}}\n",
"$$\n",
"\n",
"On se propose dans ce TP de comparer les résolutions des ces deux formes de l'équation de Burger."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
Initialisation
\n",
"\n",
"On prendra comme domaine de simulation: $x\\in [-100~100]$. On se propose dans ce TP d'étudier différentes conditions initiales:\n",
"\n",
" \n",
"
Type choc: $f(x,0)=\\dfrac{1}{2}(1-tanh(x+50))$
\n",
"
Type détente: $f(x,0)=\\dfrac{1}{2}(1+tanh(x+50))$
\n",
"
Type gaussienne: $f(x,0)=\\exp(-\\alpha x^2)$
\n",
" \n",
"\n",
"On prendra $\\alpha=0.001$.\n",
"\n",
"Tracer la solution initiale à l'aide d'une seule fonction dans laquelle on distinguera les différents cas"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [],
"source": [
"def init(dx,case=1):\n",
" x=np.arange(-100,100,dx)\n",
" if case==1:\n",
" finit=...\n",
" elif case==2:\n",
" finit=...\n",
" elif case==3:\n",
" finit=...\n",
" else:\n",
" finit=np.ones(len(x))\n",
" return x,finit\n",
"\n",
"x,f1=init(0.1,1);plt.plot(x,f1,'k')\n",
"x,f1=init(0.1,2);plt.plot(x,f1,'r')\n",
"x,f1=init(0.1,3);plt.plot(x,f1,'b')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Discussions:"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"
Résolution numérique
\n",
"\n",
"
Forme non conservative
\n",
"\n",
"L'équation de Burger sous forme non-conservative discrétisée avec un schéma décentré d'ordre 1 en espace et le schéma d'Euler explicite s'écrit:\n",
"$$\n",
"\\displaystyle{\\dfrac{u_i^{n+1}-u_i^n}{\\Delta t}+u^n_{i}\\dfrac{u_{i}^n-u_{i-1}^n}{\\Delta x}=\\nu\\dfrac{u_{i-1}^n-2u_i^n+u_{i+1}^n}{\\Delta x^2}}\n",
"$$\n",
"\n",
"En utilisant les résultats des précédent TP, proposez une fonction permettant de résoudre l'équation de Burger non conservative:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def Solve_Burger_nc(dx,dt,nu,Nt,case=1):\n",
" x,f=init(dx,case)\n",
" for t in range(Nt):\n",
" ...\n",
" ...\n",
" ...\n",
" return x,f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Etudier ensuite l'influence des paramètres sur les solutions en fonction des 3 conditions initiales. On pourra suivre la démarche suivante:\n",
" \n",
"
Etudier l'influence de $\\Delta x$ et $\\Delta t$ sur la stabilité en fixant $\\nu=0$
\n",
"
Comparer la vitesse du choc à la solution théorique $s=\\dfrac{1}{2}(u_l+u_r)$ ou $u_l$ et $u_r$ représentent respectivement les vitesses à gauche et à droite du choc.
\n",
"
Discuter le comportement de la détente et de la gaussienne