{"cells": [{"cell_type": "markdown", "id": "c64ac0da", "metadata": {}, "source": ["# Nuage d'ions"]}, {"cell_type": "markdown", "id": "f77944b4", "metadata": {}, "source": ["On consid\u00e8re un nuage de $N$ ions de masse $m$ et charge $q$. On note $\\vec{r_i}$ et $\\vec{v_i}$ la position et la vitesse du i\u00e8me ion. Les ions sont dans un pi\u00e8ge \u00e9lectrostatique. De plus, ils interagissent entre eux par la force de Coulomb. \n", "\n", "La force \u00e9lectrostatique d\u00e9rive d'un potentiel \u00e9lectrostatique :\n", "\n", "$$V(\\vec{r}) = \\frac12 k_x r_x^2 +\\frac12 k_y r_y^2 + \\frac12 k_z r_z^2$$\n", "\n", "La force de Coulomb s'\u00e9crira sous la forme:\n", "\n", "$$\\vec{f_i}(\\vec{r_i}, \\vec{r_j}) = \\kappa \\frac{q^2}{|\\vec{r_i} - \\vec{r_j}|^3}(\\vec{r_i} - \\vec{r_j})$$\n", "\n", "Pour simplifier et avoir une meilleure repr\u00e9sentation graphique, on suprimera totalement la dimension $z$. \n", "\n", "On utilisera des unit\u00e9s adimensionn\u00e9es avec des constantes de l'ordre de 1. Par d\u00e9faut on prendra : $m=9$, $q=1$, $k_x=1$, $k_y=1.3$, $\\kappa=1$.\n", "\n", "L'\u00e9tat des $N$ particules \u00e0 un instant donn\u00e9 est repr\u00e9sent\u00e9 par 4 tableaux numpy de taille $N$: ``r_x``, ``r_y``, ``v_x``, ``v_y``. Toutes les fonctions seront \u00e9crites avec ces variables. On ne regroupera les 4 tableaux que dans la fonction ``f(t, y)`` qui sera utilis\u00e9e par ``solve_ivp``.\n", "\n", "Le tableau ``y`` est d\u00e9fini en rassemblant les 4 tableaux numpy. On d\u00e9finit alors les fonctions ``join`` et ``split`` (voir ci-dessous)\n", "\n", "Les param\u00e8tres seront des constantes globales.\n", "\n", "1. \u00c9crire la fonction ``force_piege(r_x, r_y)`` qui renvoie la force d\u00e9rivant du potentiel (``f_x`` et ``f_y``).\n", "\n", "2. \u00c9crire la fonction ``force_coulomb(r_x, r_y)`` qui renvoie $f_x$ et $f_y$, la force de Coulomb. On ne cherchera pas \u00e0 \u00e9viter les boucles for dans cette fonction.\n", " \n", "3. \u00c9crire la fonction ``f(t, y)`` qui d\u00e9finit la dynamique du probl\u00e8me.\n", "\n", "4. On condid\u00e8re un nuage avec une distribution initiale donn\u00e9e par une loi de Maxwell-Boltzmann (avec $k_B=1$ et $T=1$) pour les particules sans interaction. Calculer jusqu'au temps $T=20$ l'\u00e9volution de la position des particules.\n", "\n", "5. V\u00e9rifier que l'\u00e9nergie totale est conserv\u00e9e. On utilisera les fonctions ci-dessous.\n", "\n", "6. Faire une animation (voir exemple de code ci dessous)\n", "\n", "7. On rajoute une force de dissipation, selon l'axe $x$ : \n", "\n", " $$ \\vec F_{i,x} = -\\alpha v_{i, x} $$\n", " \n", " Simuler l'experience en prenant $\\alpha = 0.1$ et $N=20$. Que se passe-t-il au temps long ?\n", " \n", "8. Utiliser le decorateur ``jit`` de numba pour acc\u00e9l\u00e9rer le code. Faire une comparaison de vitesse.\n", "\n", "9. On consid\u00e8re un nuage contenant deux types de particules (masse $m_1$ et $m_2$) et de m\u00eame charge $q=1$. Seuls les particules de type $1$ sont soumises \u00e0 la force dissipative. Simuler l'exp\u00e9rience en prenant les m\u00eames param\u00e8tres qu'\u00e0 la question 7. On prendra par exemple $m_1=9$, $N_1=20$ et $m_2=2$ et $N_2=5$"]}, {"cell_type": "code", "execution_count": 2, "id": "7ee13f2b", "metadata": {"tags": ["keep"]}, "outputs": [], "source": ["# Param\u00e8tres\n", "m = 9; q = 1\n", "k_x, k_y = 1, 1.3\n", "kappa=1\n", "k_B = 1\n", "T = 1"]}, {"cell_type": "markdown", "id": "06ac87bd", "metadata": {}, "source": ["**Quelques fonctions pour vous aider :**\n", "\n", "* Fonction pour passer de 4 tableaux \u00e0 un seul et r\u00e9ciproquement"]}, {"cell_type": "code", "execution_count": 3, "id": "1ce15680", "metadata": {"tags": ["keep"]}, "outputs": [], "source": ["\n", "def join(r_x, r_y, v_x, v_y):\n", " return np.concatenate((r_x, r_y, v_x, v_y))\n", "\n", "def split(y):\n", " N = len(y)//4\n", " return y[:N], y[N:2*N], y[2*N:3*N], y[3*N:4*N]"]}, {"cell_type": "markdown", "id": "f5e4a5f5", "metadata": {}, "source": ["* Calcul de l'\u00e9nergie"]}, {"cell_type": "code", "execution_count": 4, "id": "70f02398", "metadata": {"tags": ["keep"]}, "outputs": [], "source": ["def energie_cinetique(r_x, r_y, v_x, v_y):\n", " return np.sum(.5*m*v_x**2 + .5*m*v_y**2)\n", "\n", "def energie_piege(r_x, r_y):\n", " return np.sum(k_x*r_x**2/2 + k_y*r_y**2/2)\n", "\n", "def energie_coulomb(r_x, r_y):\n", " N = len(r_x)\n", " total = 0\n", " for i in range(N-1):\n", " for j in range(i+1, N):\n", " d2 = (r_x[i]-r_x[j])**2 + (r_y[i]-r_y[j])**2\n", " total += kappa*q**2/np.sqrt(d2)\n", " return total\n", "\n", "def energie_totale(r_x, r_y, v_x, v_y):\n", " return (energie_coulomb(r_x, r_y) +\n", " energie_piege(r_x, r_y) +\n", " energie_cinetique(r_x, r_y, v_x, v_y))\n"]}, {"cell_type": "code", "execution_count": 9, "id": "e4246b9f", "metadata": {"tags": ["keep"]}, "outputs": [], "source": ["from IPython.display import HTML\n", "from matplotlib.animation import FuncAnimation\n", "\n", "fig, ax = plt.subplots()\n", "l, = ax.plot(split(res.y[:,0])[0], split(res.y[:,0])[1], 'o')\n", "ax.set_xlim(-10, 10)\n", "ax.set_ylim(-10, 10)\n", "\n", "def animate(i):\n", " r_x, r_y, v_x, v_y = split(res.y[:,i])\n", " l.set_data(r_x, r_y)\n", "\n", "ani = FuncAnimation(fig, animate, frames=len(res.t))\n", "\n", "\n", "HTML(ani.to_jshtml())"]}], "metadata": {"celltoolbar": "Tags", "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.8.8"}, "varInspector": {"cols": {"lenName": 16, "lenType": 16, "lenVar": 40}, "kernels_config": {"python": {"delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())"}, "r": {"delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) "}}, "types_to_exclude": ["module", "function", "builtin_function_or_method", "instance", "_Feature"], "window_display": false}}, "nbformat": 4, "nbformat_minor": 5}