{ "metadata": { "name": "S3_Statique_Treillis" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "S\u00e9ance 3 : Exemple de probl\u00e8me num\u00e9rique" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Formation Python du d\u00e9partement M\u00e9catronique" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "14h00 - 15h30\n", "\n", "Exemple de probl\u00e8me m\u00e9canique simple n\u00e9cessitant de mettre en \u0153uvre un algorithme num\u00e9rique (pivot de Gauss pour r\u00e9soudre \u00ab\u00a0Ax=b\u00a0\u00bb).\n", "\n", "Le probl\u00e8me choisi est **l'analyse statique d'un treillis pour calculer les actions m\u00e9caniques s'exer\u00e7ant sur les barres**\n", "\n", "* Description du probl\u00e8me.\n", "* Construction du probl\u00e8me et 1er trac\u00e9s du treillis (mise en \u0153uvre de Matplotlib)\n", "* Construction du syst\u00e8me d'\u00e9quations lin\u00e9aires (matrices \u00ab\u00a0A et b\u00a0\u00bb) de fa\u00e7on automatis\u00e9e\n", " (en empruntant un peu de th\u00e9orie des graphs)\n", "* R\u00e9solution de l'\u00e9quation \u00ab\u00a0Ax=b\u00a0\u00bb par pivot de Gauss. Comparaison avec `numpy.linalg`\n", "* Repr\u00e9sentation graphique des tractions/compressions." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "A) Description du probl\u00e8me du treillis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le treillis est un ensemble de barres connect\u00e9es entre elles \"en triangles\".\n", "Ce type de structure est par exemple utilis\u00e9 dans les grues et certains ponts :\n", "\n", "\n", " \"Pont\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le contact entre les barres est souvent mod\u00e9lis\u00e9 par des *liaisons pivots*.\n", "Par cons\u00e9quent, Lorsque la structure est soumis \u00e0 un chargement (par ex. une masse accroch\u00e9e au bout de la grue)\n", "les barres travaillent en *traction/compression*.\n", "\n", "\"Pont\n", "\n", "L'objectif de du calcul est de **quantifier ces actions m\u00e9caniques**.\n", "\n", "*Pourquoi le probl\u00e8me du treillis ?*\n", "\n", "* Il s'agit d'un probl\u00e8me inspir\u00e9 de la m\u00e9canique,\n", "* aboutissant \u00e0 un syst\u00e8me d'\u00e9quations lin\u00e9aires (\"Ax=b\") que l'on peut r\u00e9soudre par pivot de Gauss\n", "* Ces \u00e9quations seront issues du principe de la statique.\n", "\n", "*Remarque :* dans un domaine tout autre (\u00e9lectricit\u00e9), on obtiendrait des \u00e9quations similaires en cherchant les courants dans un r\u00e9seau de r\u00e9sistances." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "B) Construction du probl\u00e8me" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Avant de r\u00e9soudre Ax=b, il faut construire la matrice A et le vecteur b,\n", "mais pour construire ces matrices, il faut d'abord cr\u00e9er les donn\u00e9es qui *d\u00e9crivent le probl\u00e8me*.\n", "\n", "\n", "*\u00c0 propos de la g\u00e9n\u00e9ricit\u00e9 du programme :*\n", "\n", "* On va ici s'int\u00e9resser \u00e0 un treillis particulier qu'on pourrait sans doute traiter analytiquement...\n", "* ...mais tout l'int\u00e9r\u00eat d'un tel programme est de r\u00e9soudre un treillis de taille arbitraire\n", "* ceci explique que le programme doit \u00eatre parfois \u00e9crit de fa\u00e7on plus complexe que n\u00e9cessaire en apparence.\n", "* le script `S3_Statique_Treillis/treillis.py` permet de fabriquer un treillis avec un nombre arbitraire de pivot et une forme y=f(x) ajustable." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "B1) Construction des donn\u00e9es" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On construit d'abord la liste contenant la position (dans un plan) des pivots.\n", "On peut choisir (par exemple) d'utiliser une liste de tuples :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pivots = [(0, 0), (1, 2), (2, 0), (3, 2), (4, 0)]\n", "\n", "N_piv = len(pivots)\n", "print('treillis \u00e0 {} pivots (dont 2 pivots de fixation)'.format(N_piv))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "treillis \u00e0 5 pivots (dont 2 pivots de fixation)\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Repr\u00e9sentation graphique (ou l'int\u00e9r\u00eat de travailler interactivement)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Conversion en tablea NumPy pour b\u00e9n\u00e9ficier des facilit\u00e9s du slicing\n", "pivots_arr = np.array(pivots)\n", "\n", "# Trac\u00e9s en boucle:\n", "for piv in pivots:\n", " plt.plot(piv[0], piv[1], 'o')\n", "\n", "# Ajustements des limites :\n", "xlim(-.5, 4.5)\n", "ylim(-.5, 2.5);" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\no2zo0BKFLAyyMMjCsCELljsApCA6dwCwEJ07AHgQyz3Khg4tUcjCIAuDLAwbsmC5A0AKonMHAAvR\nuQOAB7Hco2zo0BKFLAyyMMjCsCELljsApCA6dwCwEJ07AHgQyz3Khg4tUcjCIAuDLAwbsmC5A0AK\nonMHAAvRuQOAB7Hco2zo0BKFLAyyMMjCsCGLuJZ7Y2OjJk2apPz8fL344osDnlNTU6P8/HwVFRWp\ntbU1nssNi1DoPZWVrVNt7WsqK1unUOg9t0dCEngvFNK6sjK9VlurdWVlei8UcnskJIFDoUOqKavR\n1tqtqimr0aHQIbdH+nTOIN24ccPx+/3O2bNnnevXrztFRUXOBx980OecUCjkzJs3z3Ecxzl27JhT\nXFw84NeKY4y47N//ruP3P+dITuyP3/+cs3//u67Mg+Tw7v79znN+v3PrA+M5v995d/9+t0eDi97Z\n/46zyr/KaVJT7M8q/yrnnf3vuDLPnfbmoJ+5t7S0aOLEicrLy1N6eroWL16sffv29Tmnvr5eFRUV\nkqTi4mJdunRJXV1d8fxbNKS2bHlb7e3P97mtvf151dUddGkiJIO3t2zR8+3tfW57vr1dB+vqXJoI\nyWDvlr1a2r60z21L25eqvq7epYlub9RgP7Gzs1O5ubmx45ycHB0/fvyO53R0dCg7O7vf16usrFRe\nXp4kKSsrS4FAQCUlJZJMvzXUx5980vvXb5bUJqlWknThQkTNzc3Dfv1kPX7ppZcSkn+yHnd0dalZ\nUoluPjJ6jbx2LSnmc+u497ZkmSfRxyM+uflcuE1tOqMzekJPSJI6LnQkZF/0fhwOh3VXBvstwZ49\ne5xVq1bFjn/72986a9as6XPO448/7hw+fDh2PGfOHOfEiRP3/O3FcJk790e3fOfdFPu4rGydK/Mk\ni6amJrdHcNWP5s6N1TFNt1Qz68rK3B7NVV5/XFTPrY7VMZu1Ofbx2rK1rsxzp7056FrG5/MpEonE\njiORiHJycm57TkdHh3w+32AvOeRqaubK7/9R9KhEkuT3P6fq6lLXZkoGvc8YvGpuTY1+5PdL6n1U\nSM/5/SqtrnZtpmTg9cfFwpqFetP/piQpoIAkaYd/h8qry90c61MNupaZPn26Tp8+rXA4rM9//vPa\nvXu3du7c2eec8vJybd26VYsXL9axY8eUlZU1YCXjlvnzH5Mk1dX9WNeujdTo0T2qrv567HZ402Pz\n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\n" } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Choix des points d'accroche du treillis :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# indice des points d'accroche:\n", "iP_A = 0 # 1er point du treillis\n", "iP_B = 1 # 2\u00e8me point\n", "\n", "P_A = pivots[iP_A]\n", "P_B = pivots[iP_B]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "On cr\u00e9er ensuite la liste des barres. Ici on choisit une liste de paires contenant les points.\n", "On aurait pu aussi utiliser une liste de paires contenant les indices de ces points dans la liste `pivots`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "barres = [\n", " ((0, 0), (2, 0)), # barre entre le pt (0,0) et le pt (2,0)\n", " ((1, 2), (2, 0)),\n", " ((1, 2), (3, 2)),\n", " ((2, 0), (3, 2)),\n", " ((2, 0), (4, 0)),\n", " ((3, 2), (4, 0))]\n", "\n", "N_bar = len(barres)\n", "print('treillis \u00e0 {} barres'.format(N_bar))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "treillis \u00e0 6 barres\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Repr\u00e9sentation graphique :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "color=(0.6, 0.6, 0.8)\n", "\n", "# Trac\u00e9 des barres, en boucle :\n", "for j, bj in enumerate(barres):\n", " # Coordonn\u00e9es des 2 pivots d'accroche:\n", " (x1,y1), (x2, y2) = bj\n", " color = (.5, .5, .8)\n", " plt.plot((x1, x2), (y1, y2), '-', color = color, lw=4, zorder=1)\n", "\n", "# Trac\u00e9s des pivots :\n", "for piv in pivots:\n", " plt.plot(piv[0], piv[1], 'ro')\n", "\n", "# Ajustements des limites :\n", "xlim(-.5, 4.5)\n", "ylim(-.5, 2.5);" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\nTOj/AFtGQsb1rg1mAAAAAElFTkSuQmCC\n" } ], "prompt_number": 5 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Description du chargement des pivots\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour d\u00e9crire une force ext\u00e9rieure (2 composantes) s'appliquant au niveau de chaque liaison, on utilise un tableau NumPy de taille $(N_{piv}, 2)$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Question 1:* Cr\u00e9er `F_ext`, un tableau de z\u00e9ros de dimension N_piv * 2" ] }, { "cell_type": "code", "collapsed": false, "input": [ "F_ext = np.zeros((N_piv, 2))\n", "F_ext.T # .T signifie \"transpos\u00e9e\". (Utilis\u00e9 ici pour l'esth\u00e9tique)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 6, "text": [ "array([[ 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., 0.]])" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Question 2 :* Modifier les \u00e9l\u00e9ments `F_ext` pour d\u00e9crire une force de *1 N vers le bas*, s'excer\u00e7ant sur le dernier pivot" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Appui sur le dernier pivot:\n", "\n", "# Solution 1)\n", "F_ext[N_piv-1, 0] = 0 # composante horizontale\n", "F_ext[N_piv-1, 1] = -1 # composante verticale\n", "\n", "# Solution 2) \n", "F_ext[-1] = (0., -1) # effort vers le bas\n", "\n", "F_ext.T " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 8, "text": [ "array([[ 0., 0., 0., 0., 0.],\n", " [ 0., 0., 0., 0., -1.]])" ] } ], "prompt_number": 8 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "B2) Construction des \u00e9quations (matrices A et b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les inconnues sont la force de traction qui s'exerce sur chaque barre (6). \"Traction\" indique le choix (arbitraire) de convention de signe :\n", "\n", "* $f_j>0$ si la barre j est \"\u00e9tir\u00e9e\"\n", "* $f_j<0$ si la barre j est \"comprim\u00e9e\"\n", "\n", "le vecteur des inconnues est $x=(f_1, \\dots, f_{Nbar})$. On veut construire les matrices A et b telles que $A.x = b$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les \u00e9quations se basent de l'application du principe de la statique \u00e0 chaque pivot.\n", "\n", "$$\\sum_j \\vec{F}(\\text{barre}_j\\rightarrow \\text{pivot}_i) = \\vec{0},\n", "\\quad \\text{pour chaque pivot $i$}$$\n", "\n", "\"\u00c9quation\n", "\n", "**Remarque importante** : la complexit\u00e9 de ce qui suit eu \u00e9gard \u00e0 la simplicit\u00e9 du probl\u00e8me (5 pivots, 6 barres) est d\u00fb \u00e0 la volont\u00e9 d'avoir un programme qui puisse r\u00e9soudre le *probl\u00e8me g\u00e9n\u00e9rique* ($N_{piv}$ pivots arbitrairement grand)\n", "\n", "La somme des forces des \u00e9quations d'\u00e9quilibre ne doit se faire que sur les *barres incidentes* au pivot consid\u00e9r\u00e9. Pour cela on introduit la notion de matrice d'incidence (outil issu de la th\u00e9orie des graphs, cf. [fr.wikipedia.org/wiki/Matrice_d'incidence](http://fr.wikipedia.org/wiki/Matrice_d'incidence))" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Matrice d'incidence : d\u00e9finition" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il s'agit de consid\u00e9rer le treillis comme un graph orient\u00e9 :\n", "\n", "* les sommets sont les pivots\n", "* les arcs sont les barres. Chaque barre (Piv1, Piv2) sera consid\u00e9r\u00e9 orient\u00e9 de Piv1 vers Piv2. Cette orientation dirigera leur vecteur directeur.\n", "\n", "\n", "On va construire la matrice d'incidence $M$ qui contient l'information :\n", "\n", "* $m_{ij} = +1$ si la barre $j$ \"arrive\" pivot $i$\n", "* $m_{ij} = -1$ si la barre $j$ \"quitte\" pivot $i$\n", "\n", "\"\u00c9quation\n", "\n", "Gr\u00e2ce \u00e0 la matrice d'incidence, on peut conna\u00eetre la force excerc\u00e9e par une barre sur *n'importe quelle pivot*.\n", "\n", "$$\\vec{F} (\\text{barre}_j\\rightarrow \\text{pivot}_i ) = - M[i,j] . f_j . \\vec{u}_j$$\n", "\n", "Gr\u00e2ce \u00e0 cette formule, on peut construire les \u00e9quations d'\u00e9quilibre *g\u00e9n\u00e9riques*. Il reste \u00e0 :\n", "\n", "* construire la matrice d'indidence\n", "* calculer les vecteur directeurs $\\vec{u}_j$" ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Matrice d'incidence : construction" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Inc_mat = np.zeros((N_piv, N_bar), dtype=int)\n", "Inc_mat" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 10, "text": [ "array([[0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0]])" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "On va remplir cette matrice colonne par colonne (i.e barre par barre).\n", "\n", "Pour trouver dans quel ligne placer les \"+1\" et les \"-1\", on a besoin d'une m\u00e9thode pour retrouver l'indice d'un \u00e9lement dans une liste" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(pivots)\n", "pivots.index((1,2))\n", "# pivots.index((9,9)) # la recherche d'un \u00e9lement inexistant g\u00e9n\u00e8re une ValueError" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[(0, 0), (1, 2), (2, 0), (3, 2), (4, 0)]\n" ] }, { "output_type": "pyout", "prompt_number": 14, "text": [ "1" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "for j, bar_j in enumerate(barres):\n", " P1, P2 = bar_j\n", " # Remarquons la convention de signe:\n", " i1 = pivots.index(P1)\n", " Inc_mat[i1,j] = -1 # la barre j \"quitte\" P1\n", " i2 = pivots.index(P2)\n", " Inc_mat[i2,j] = +1 # la barre j \"arrive \u00e0\" P2\n", "\n", "print('Matrice d\\'incidence:')\n", "print(str(Inc_mat).replace('0','.')) # M\u00e9thode d'affichage cosm\u00e9tique" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Matrice d'incidence:\n", "[[-1 . . . . .]\n", " [ . -1 -1 . . .]\n", " [ 1 1 . -1 -1 .]\n", " [ . . 1 1 . -1]\n", " [ . . . . 1 1]]\n" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chaque ligne peut se lire comme l'\u00e9quation d'\u00e9quilibre de chaque pivot, indiquant quelle barre lui est incidente." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Retirer les pivots d'accroche" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les pivots d'accroches $P_A$ et $P_B$ ne sont pas \u00e0 l'\u00e9quilibre (c'est une force d'accroche ext\u00e9rieure suppl\u00e9mentaire qui permet l'\u00e9quilibre)\n", "\n", "On enl\u00e8ve de la matrice d'incidence les lignes correspondants aux deux pivots d'accroche \u00e0 l'aide de *l'indexation par liste*" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# \u00c9tape 1 : construire une liste d'indice contenant les indices de tous les pivots sauf P_A et P_B\n", "piv_ind = range(N_piv)\n", "piv_ind.remove(iP_A)\n", "piv_ind.remove(iP_B)\n", "piv_ind" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 17, "text": [ "[2, 3, 4]" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# \u00c9tape 2 : utiliser la liste `piv_ind` pour s\u00e9lectionner les lignes de la matrice d'incidence :\n", "Inc_mat_red = Inc_mat[piv_ind, :]\n", "\n", "print(str(Inc_mat_red).replace('0','.'))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[ 1 1 . -1 -1 .]\n", " [ . . 1 1 . -1]\n", " [ . . . . 1 1]]\n" ] } ], "prompt_number": 18 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Observation des \u00e9quations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La matrice d'incidence r\u00e9duite contient 3 lignes correspondant aux 3 pivots auxquels on veut appliquer le principe de la statique.\n", "\n", "$$\\sum_j \\vec{F}(\\text{barre}_j\\rightarrow \\text{pivot}_i) = \\vec{0},\n", "\\quad \\text{pour chaque pivot $i$}$$\n", "\n", "Ce principe d'\u00e9quilibre va donner 2 \u00e9quations scalaires par pivot, soit 6 eq. au total.\n", "\n", "Comme on a 6 barres en traction/compression, on a bien 6 inconnues $f_j$ et le syst\u00e8me d'\u00e9quation devrait \u00eatre soluble : le syst\u00e8me m\u00e9canique est *isostatique* (\u00e0 moins que la position des pivots m\u00e8ne \u00e0 une matrice A de rang < 6)." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Vecteur directeur des barres" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour projeter les \u00e9quations de la statique selon les axes (x,y), on a besoin du *vecteur directeur de chaque barre*." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Conversion des barres en trableau NumPy\n", "barres_arr = np.array(barres)\n", "print(barres_arr.shape) # On obtient un tableau 3D\n", "barres_arr" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(6, 2, 2)\n" ] }, { "output_type": "pyout", "prompt_number": 43, "text": [ "array([[[0, 0],\n", " [2, 0]],\n", "\n", " [[1, 2],\n", " [2, 0]],\n", "\n", " [[1, 2],\n", " [3, 2]],\n", "\n", " [[2, 0],\n", " [3, 2]],\n", "\n", " [[2, 0],\n", " [4, 0]],\n", "\n", " [[3, 2],\n", " [4, 0]]])" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Question de r\u00e9flexion * : \u00e0 quoi correspond chacune des 3 dimensions de `barres_arr` (regarder pour cela la structure de `barres`) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour calculer le vecteur directeur, on calcule d'abord $P_1P_2 = OP_2 - OP_1$. Il faut donc d'abord r\u00e9cup\u00e9rer $OP_1$ et $OP_2$ pour chaque barre.\n", "\n", "On proc\u00e8de de mani\u00e8re *vectorielle* : " ] }, { "cell_type": "code", "collapsed": false, "input": [ "barres_OP1 = barres_arr[:,0,:]\n", "barres_OP2 = barres_arr[:,1,:]\n", "\n", "# \u00c0 quoi correspond ce barres_OP1 ?\n", "barres_OP1" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 44, "text": [ "array([[0, 0],\n", " [1, 2],\n", " [1, 2],\n", " [2, 0],\n", " [2, 0],\n", " [3, 2]])" ] } ], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "De m\u00eame l'op\u00e9ration $P_1P_2 = OP_2 - OP_1$ est vectoris\u00e9e :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "barres_P1P2 = barres_OP2 - barres_OP1\n", "barres_P1P2" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 30, "text": [ "array([[ 2, 0],\n", " [ 1, -2],\n", " [ 2, 0],\n", " [ 1, 2],\n", " [ 2, 0],\n", " [ 1, -2]])" ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice de calcul vectoris\u00e9** : Il faut \u00e0 pr\u00e9sent normaliser les vecteurs P1P2 pour obtenir les vecteurs directeurs $\\vec{u}$\n", "\n", "$$ \\vec{u} = \\frac{P_1P_2}{|P_1P_2|} $$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# \u00c9tape 1 : calcul de la longueur des barres :\n", "barre_l = np.sqrt((barres_P1P2**2).sum(axis = 1))\n", "barre_l" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 35, "text": [ "array([ 2. , 2.23606798, 2. , 2.23606798, 2. ,\n", " 2.23606798])" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "# \u00c9tape 2 : Transformation en vecteur colonne : \n", "barre_l = barre_l.reshape(-1,1)\n", "barre_l" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 37, "text": [ "array([[ 2. ],\n", " [ 2.23606798],\n", " [ 2. ],\n", " [ 2.23606798],\n", " [ 2. ],\n", " [ 2.23606798]])" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "# \u00c9tape 3 : normalisation vectoris\u00e9e\n", "barre_dir = barres_P1P2 / barre_l\n", "\n", "barre_dir" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 39, "text": [ "array([[ 1. , 0. ],\n", " [ 0.4472136 , -0.89442719],\n", " [ 1. , 0. ],\n", " [ 0.4472136 , 0.89442719],\n", " [ 1. , 0. ],\n", " [ 0.4472136 , -0.89442719]])" ] } ], "prompt_number": 39 }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Construction des matrices A et b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La matrice $A$ est fabriqu\u00e9e par superposition de 2 blocs :\n", "\n", "* $A_x$ contient les \u00e9quations d'\u00e9quilibre projet\u00e9e sur l'axe horizontal $A_x = \\text{IncMatRed} \\times \\text{diag}(u_{j}^{(x)})$\n", "* $A_y$ contient les \u00e9quations d'\u00e9quilibre projet\u00e9e sur l'axe vertical $A_y = \\text{IncMatRed} \\times \\text{diag}(u_{j}^{(y)})$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# 1) Matrice A\n", "Ax = Inc_mat_red*barre_dir[:,0]\n", "Ay = Inc_mat_red*barre_dir[:,1]\n", "# ou bien: Ax = np.dot(Inc_mat_red, np.diag(barre_dir[:,0]))\n", "\n", "Ax.round(2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 45, "text": [ "array([[ 1. , 0.45, 0. , -0.45, -1. , 0. ],\n", " [ 0. , 0. , 1. , 0.45, 0. , -0.45],\n", " [ 0. , 0. , 0. , 0. , 1. , 0.45]])" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "La superposition (concat\u00e9nation) des blocs se fait avec `np.vstack` (il existe `np.hstack` et `np.concatenate`)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "A = np.vstack((Ax, Ay))\n", "# Image de la matrice:\n", "# plt.imshow(A, interpolation='nearest')\n", "\n", "print(A.round(2))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[ 1. 0.45 0. -0.45 -1. 0. ]\n", " [ 0. 0. 1. 0.45 0. -0.45]\n", " [ 0. 0. 0. 0. 1. 0.45]\n", " [ 0. -0.89 0. -0.89 -0. -0. ]\n", " [ 0. -0. 0. 0.89 0. 0.89]\n", " [ 0. -0. 0. 0. 0. -0.89]]\n" ] } ], "prompt_number": 42 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le vecteur $b$ est construit selon le m\u00eame principe de concat\u00e9nation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# 2) Vecteur b : force ext\u00e9rieure appliqu\u00e9e \u00e0 chaque pivot:\n", "# Empilement des composantes selon x et y:\n", "b_ext = np.concatenate((F_ext[piv_ind,0], \n", " F_ext[piv_ind,1]))\n", "b_ext" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 41, "text": [ "array([ 0., 0., 0., 0., 0., -1.])" ] } ], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "C) R\u00e9solution du probl\u00e8me, pivot de Gauss" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "C1) Pivot de Gauss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "M\u00e9thode d'\u00e9limination it\u00e9rative pour r\u00e9soudre un syst\u00e8me d'\u00e9quations lin\u00e9aires.\n", "Cf Wikipedia pour le d\u00e9tail de la m\u00e9thode." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# On assemble A et b (on \"borde\" la matrice)\n", "Ab = np.hstack((A,b_ext.reshape(-1,1))) # attention au reshape\n", "print(np.round(Ab,2))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[ 1. 0.45 0. -0.45 -1. 0. 0. ]\n", " [ 0. 0. 1. 0.45 0. -0.45 0. ]\n", " [ 0. 0. 0. 0. 1. 0.45 0. ]\n", " [ 0. -0.89 0. -0.89 -0. -0. 0. ]\n", " [ 0. -0. 0. 0.89 0. 0.89 0. ]\n", " [ 0. -0. 0. 0. 0. -0.89 -1. ]]\n" ] } ], "prompt_number": 178 }, { "cell_type": "code", "collapsed": false, "input": [ "N = A.shape[0]\n", "\n", "for k in range(N):\n", " # Trouver le pivot\n", " piv_candidats = Ab[k:,k]\n", " k_piv = np.argmax(np.abs(piv_candidats)) + k\n", " piv = Ab[k_piv,k]\n", " if piv == 0:\n", " print(np.round(Ab,2))\n", " raise ValueError('Systeme non inversible')\n", " \n", " # \u00e9change des lignes k et k_piv:\n", " Ab[[k,k_piv], :] = Ab[[k_piv,k], :]\n", " \n", " # Normalisation de la ligne k\n", " Ab[k,k:] /= piv\n", " # Mise \u00e0 z\u00e9ros de la colonne k\n", " for i in range(N):\n", " if i == k:\n", " continue\n", " Ab[i,:] -= Ab[k,:]*Ab[i,k]\n", "\n", "print(np.round(Ab,2))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[ 1. 0. 0. 0. 0. 0. -1.5 ]\n", " [ 0. 1. 0. 0. 0. 0. 1.12]\n", " [ 0. 0. 1. 0. 0. 0. 1. ]\n", " [ 0. 0. 0. 1. 0. 0. -1.12]\n", " [ 0. 0. 0. 0. 1. 0. -0.5 ]\n", " [ 0. 0. 0. 0. 0. 1. 1.12]]\n" ] } ], "prompt_number": 101 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Une fois la matrice transform\u00e9e en $(I_N|v)$ la solution du syst\u00e8me $Ax=b$ est le vecteur $v$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Extraction du vecteur (colonne N+1) :\n", "trac_barres_gauss = Ab[:,N]\n", "trac_barres_gauss.round(2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 104, "text": [ "array([-1.5 , 1.12, 1. , -1.12, -0.5 , 1.12])" ] } ], "prompt_number": 104 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "C2) R\u00e9solution des force de traction avec numpy.linalg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Au del\u00e0 de l'int\u00e9r\u00eat de comprendre l'algorithme du pivot de Gauss, il existe d\u00e9j\u00e0 une m\u00e9thode de r\u00e9solution de syst\u00e8me lin\u00e9aire : `numpy.linalg.linsolv`\n", "\n", "(fonction du sous-module `linalg` qui contient aussi l'inversion de matrices, la diagonalisation, la d\u00e9composition en valeurs singuli\u00e8res, ...) " ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.linalg. # taper TAB" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercice** : R\u00e9soudre d'une mani\u00e8re ou d'une autre l'\u00e9quation $A.x = b_{ext}$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Sol 1 : R\u00e9solution avec linsolve\n", "trac_barres = np.linalg.solve(A, b_ext)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "# Sol2 : R\u00e9solution x = inv(A)*b\n", "A_inv = np.linalg.inv(A)\n", "\n", "trac_barres = np.dot(A_inv, b_ext)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "print('Effort de traction sur chaque barre:')\n", "print(trac_barres.round(2))\n", "\n", "# Recherche de l'effort maximal\n", "trac_max = np.max(np.abs(trac_barres))\n", "print(' -> effort max (en val. absolue) : {:.1f}'.format(trac_max))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Effort de traction sur chaque barre:\n", "[-1.5 1.12 1. -1.12 -0.5 1.12]\n", " -> effort max (en val. absolue) : 1.5\n" ] } ], "prompt_number": 59 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Connaissant les efforts sur chaque barrre, on peut en d\u00e9duire les forces s'exer\u00e7ant sur les points d'accroche" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Efforts sur les points d'accroche (de la part du treillis et de l'ext\u00e9rieur):\n", "resul_A = -np.inner(Inc_mat[iP_A,:]*trac_barres, barre_dir.T) + F_ext[iP_A]\n", "resul_B = -np.inner(Inc_mat[iP_B,:]*trac_barres, barre_dir.T) + F_ext[iP_B]\n", "\n", "print('action du treillis sur pt A: {!s} ({:.2f})'.format(\n", " resul_A, np.linalg.norm(resul_A,2)) )\n", "print('action du treillis sur pt B: {!s} ({:.2f})'.format(\n", " resul_B, np.linalg.norm(resul_B,2)) )" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "action du treillis sur pt A: [-1.5 0. ] (1.50)\n", "action du treillis sur pt B: [ 1.5 -1. ] (1.80)\n" ] } ], "prompt_number": 60 }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Remarque :* on v\u00e9rifie que la somme des actions du treills sur les pts d'accroche est \u00e9gale \u00e0 la somme des forces ext\u00e9rieur sur le treillis `F_ext`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "F_ext.sum(axis=0)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 61, "text": [ "array([ 0., -1.])" ] } ], "prompt_number": 61 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "D) Repr\u00e9sentation graphique de la solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Repr\u00e9sentation graphique des tractions/compression avec Matplotlib" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "D1) Colorer les barres selon l'effort (signe et intensit\u00e9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Outil** : les colormaps de Matplotlib.\n", "\n", "Celles ci servent le plus souvent avec `imshow` pour coloriser des images en niveau de gris\n", "(ou simplement \"repr\u00e9senter\" les valeurs d'une matrice)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cmap = plt.cm.gray\n", "#cmap = plt.cm.winter\n", "#cmap = plt.cm.jet # couleurs par d\u00e9faut, comme dans Matlab\n", "plt.imshow(A, interpolation='none', cmap=cmap)\n", "plt.title('matrice A');" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n" } ], "prompt_number": 62 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les colormaps sont en fait des fonctions qui transforme un nombre entre [0,1] (un \"niveau de gris\")\n", "en un quadruplet (R,G,B, alpha) (chaque composante dans [0,1])" ] }, { "cell_type": "code", "collapsed": false, "input": [ "col = plt.cm.jet(0.9)\n", "col # On reconnait du rouge\n", "#plot(0,0, 'D', color=col)\n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 63, "text": [ "(0.94563279857397531, 0.029774872912127992, 0.0, 1.0)" ] } ], "prompt_number": 63 }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut fabriquer sa propre colormap les pr\u00e9existantes ne conviennent pas.\n", "(chercher \"colormaps demo\" pour avoir un aper\u00e7u)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Colormap pour colorer les barres selon l'effort subit: rouge-bleu\n", "col_list = [(0.9,0,0.0), (0.7,0.7,0.7), (0,0,0.9)]\n", "cmap = mpl.colors.LinearSegmentedColormap.from_list('red-blue', col_list)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 64 }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut utiliser une colormap pour attribuer une couleur \u00e0 une force $F$\n", "\n", "$$cmap(\\frac{F}{2 F_{max}} + 1/2) $$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Trac\u00e9 des barres et des efforts\n", "for j, bj in enumerate(barres):\n", " # Coordonn\u00e9es des 2 pivots d'accroche:\n", " (x1,y1), (x2, y2) = bj\n", " # direction :\n", " uj = barre_dir[j]\n", " # effort de traction sur la barre bj:\n", " trac = trac_barres[j]\n", " color = cmap(trac/(2*trac_max)+0.5)\n", " plt.plot((x1, x2), (y1, y2), '-', color = color, lw=4, zorder=1)\n", "\n", "\n", "# Trac\u00e9s des pivots :\n", "for piv in pivots:\n", " plt.plot(piv[0], piv[1], 'wo')\n", "\n", "# Ajustements des limites :\n", "xlim(-.5, 4.5)\n", "ylim(-.5, 2.5);" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\nAAAAAElFTkSuQmCC\n" } ], "prompt_number": 65 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "D2) Repr\u00e9senter les forces... avec des fl\u00e8ches !" ] }, { "cell_type": "code", "collapsed": false, "input": [ "color=(0.8, 0.8, 0.8)\n", "# \u00c9chelle pour le trac\u00e9 des forces\n", "F_scale = 0.3*barre_l.mean()/trac_max\n", "# Couleur des efforts:\n", "F_color = (1., 0, 0) # rouge\n", "dx, dy = 1,2\n", "\n", "# Trac\u00e9 des barres et des efforts\n", "for j, bj in enumerate(barres):\n", " # Coordonn\u00e9es des 2 pivots d'accroche:\n", " (x1,y1), (x2, y2) = bj\n", " # direction :\n", " uj = barre_dir[j]\n", " trac = trac_barres[j]\n", " \n", " plt.plot((x1, x2), (y1, y2), '-', color = color, lw=4, zorder=1)\n", " \n", " # Trac\u00e9 des efforts barre -> pivot1 et pivot 2\n", " plt.arrow(x1, y1, +trac*uj[0]*F_scale, +trac*uj[1]*F_scale,\n", " zorder=2, head_width=0.05*dx, lw=0, width=0.02*dx, color=F_color)\n", " plt.arrow(x2, y2, -trac*uj[0]*F_scale, -trac*uj[1]*F_scale,\n", " zorder=2, head_width=0.05*dx, lw=0, width=0.02*dx, color=F_color)\n", "\n", "# Trac\u00e9s des pivots :\n", "for piv in pivots:\n", " plt.plot(piv[0], piv[1], 'wo', zorder=3)\n", "\n", "# Ajustements des limites :\n", "xlim(-.5, 4.5)\n", "ylim(-.5, 2.5)\n", "\n", "title(u'Forces exerc\u00e9es par les barres sur les liasons')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n" } ], "prompt_number": 172 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remarque : on utilise l'argument `zorder` pour ma\u00eetriser la superposition des \u00e9l\u00e9ments" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "D3) Le code complet de visualisation des efforts :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "fig = plt.figure('efforts treillis', figsize=(12,5))\n", "\n", "ax = fig.add_subplot(111, title='efforts sur le treillis '\n", " '({:d} pivots, {:d} barres)'.format(N_piv, N_bar))\n", "\n", "# \u00c9chelle pour le trac\u00e9 des forces\n", "F_scale = 0.3*barre_l.mean()/trac_max\n", "# Couleur des efforts:\n", "F_color = (0,0.8,0) # vert\n", "dx, dy = 1,2\n", "\n", "# Colormap pour colorer les barres selon l'effort subit: rouge-bleu\n", "col_list = [(0.9,0,0.0), (0.7,0.7,0.7), (0,0,0.9)]\n", "cm_rb = mpl.colors.LinearSegmentedColormap.from_list('red-blue', col_list)\n", "cm = cm_rb\n", "#cm = plt.cm.coolwarm_r\n", "\n", "# Trac\u00e9 des barres et des efforts\n", "for j, bj in enumerate(barres):\n", " # Coordonn\u00e9es des 2 pivots d'accroche:\n", " (x1,y1), (x2, y2) = bj\n", " # direction :\n", " uj = barre_dir[j]\n", " # effort de traction sur la barre bj:\n", " trac = trac_barres[j]\n", " color = cm(trac/(2*trac_max)+0.5)\n", " plt.plot((x1, x2), (y1, y2), '-', color = color, lw=4, zorder=1)\n", " \n", " # Trac\u00e9 des efforts barre -> pivot1 et pivot 2\n", " plt.arrow(x1, y1, +trac*uj[0]*F_scale, +trac*uj[1]*F_scale,\n", " zorder=2, head_width=0.05*dx, lw=0, width=0.02*dx, color=F_color)\n", " plt.arrow(x2, y2, -trac*uj[0]*F_scale, -trac*uj[1]*F_scale,\n", " zorder=2, head_width=0.05*dx, lw=0, width=0.02*dx, color=F_color)\n", "# end for each barre\n", "\n", "# Couleur des pivots\n", "piv_color = (1.,1.,1.) # blanc\n", "piv_color_AB = (1.,1.,0.5) # jaune clair\n", "piv_alpha = 1 # opaque\n", "\n", "\n", "# Trac\u00e9 des pivots\n", "for i, Pi in enumerate(pivots):\n", " # Trac\u00e9 du pivot:\n", " marker = 'D' if Pi in (P_A,P_B) else 'o' # marqueur Diamond 'D' ou disque 'o'\n", " color = piv_color_AB if Pi in (P_A,P_B) else piv_color\n", " plt.plot(Pi[0], Pi[1], marker, ms=8, c=color, alpha = piv_alpha, zorder=3)\n", " # Force ext\u00e9rieur s'appliquant sur le pivot\n", " Fi = F_ext[i]\n", " if Fi.any():\n", " plt.arrow(Pi[0], Pi[1], Fi[0]*F_scale, Fi[1]*F_scale,\n", " zorder=2, head_width=0.05*dx, lw=0, width=0.02*dx, color=(1,0,0))\n", " if Pi in (P_A,P_B):\n", " F_soutien = -resul_A if Pi==P_A else -resul_B\n", " plt.arrow(Pi[0], Pi[1], F_soutien[0]*F_scale, F_soutien[1]*F_scale,\n", " zorder=2, head_width=0.05*dx, lw=0, width=0.02*dx, color=(1,1,0))\n", "# end for each pivot\n", "\n", "# Limites du trac\u00e9\n", "plt.xlim(min([x for (x,y) in pivots]) - dx*1,\n", " max([x for (x,y) in pivots]) + dx*1)\n", "plt.ylim(min([y for (x,y) in pivots]) - dy*.3,\n", " max([y for (x,y) in pivots]) + dy*.3)\n", "\n", "# Couleur de fond:\n", "ax.patch.set_fc((0.9,)*3)\n", "ax.set_aspect('equal')\n", "plt.grid(False)\n", "\n", "# \"Maximisation\" du graphique au sein de la figure :\n", "fig.tight_layout()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAnQAAAFhCAYAAAD5mjd6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8FIX9//H35iSBkENCIAcEChKOQCICEkXAChTlUvHB\nIZ5UUUuVirUi2GqrgAieaMX+lIIH8hWqIkLEqihyRWxo8aSiiQkBREhCArkzvz/oroTc2SSzO/N6\nPh48Htnd2Z1PdjbLO++Z2TgMwzAEAAAAr+Vj9gAAAABwD4EOAADAyxHoAAAAvByBDgAAwMsR6AAA\nALwcgQ4AAMDLEeiAVnDjjTcqIiJCF1xwgSTpr3/9q6KiotS+fXvl5uaaPF3ziY+P1/vvv2/Kul95\n5RWNGTPGddnHx0ffffedJOmGG27Q/fffL0natm2bEhISmrSOd999V1dccYX7w9agX79++vjjj1vk\nsVuDmdu+LsuXL9e9995r9hhAiyPQAS1s27Zt+uc//6mDBw9q165dKisr09y5c/X+++/rxIkTCg8P\nb/RjjhgxQi+88EILTOseh8Mhh8PR6Ptt3bpVcXFxbq37mmuu0bvvvlvvXMOGDdPXX3/dpHXMnz9f\n8+bNc12Oj49XcHCwQkJCFBISol/96ldNelxJ+vzzz3XxxRc3+f6SlJGRIR8fH1VWVrr1OE5Hjx7V\n9OnTFRYWpoiICM2YMaPWZZu67VvazTffrFdeeUVHjx41exSgRRHogBaWmZmp+Ph4BQUFSZIOHz6s\n4uJi9e7du9GPZRiGKisrTf+P0zAMtfZnkldUVLh1f3fn/fTTT3XixAkNHjzYdZ3D4dDGjRtVUFCg\ngoICpaamurWO5tJc2+bKK69UdHS0srKydPToUf3+979vlsetS02vrfLy8iY/XmBgoMaOHavVq1e7\nOxrg0Qh0QDPIycnRVVddpY4dO6p79+56+umnJUkvvPCCbr75Zu3cuVMhISGaPn26K8iFhYXp0ksv\nlSTt2LFDgwYNUlhYmAYPHqydO3e6HnvEiBFasGCBLrroIrVt21bXXXedtm3bptmzZyskJER33HGH\nJOl3v/udoqKiFBoaqv79++uLL76ocda///3v+sUvfqH27dure/fuevXVVyVJDzzwgK699lrXcme3\nPc45LrzwQrVt21bff/99nc+JYRhavHixevTooQ4dOmjKlCk17l4+efKkxo4dq5ycHIWEhKh9+/Y6\ndOiQHnjgAU2ePFnXXnutQkNDtWrVKuXn52vmzJmKjo5WbGys7r//ftd8f//73zVs2LB6t9XZbeAj\njzyi2NhYtW/fXgkJCfrggw9qvN/mzZs1YsSIGr/PhnB+P1OnTlX79u01cOBA/ec//3HdHh8frw8+\n+EA5OTkKDg6u8lylp6crMjJSFRUVqqys1EMPPaT4+HhFRUXp+uuv14kTJyTJ1fCFhYUpJCREu3fv\n1rfffqvhw4crLCxMkZGRmjp1aoPm3bJli7Kzs7VkyRKFhITI19dXAwYMqPM+aWlp6tu3ryIiInTT\nTTeppKREkpSXl6dx48apY8eOioiI0Pjx43Xw4EHX/c58bbVr107fffedfHx89Oyzz6pnz57q1auX\nJGnjxo1KSkpSeHi4LrzwQu3bt8/1GHVtxxEjRuidd95p0PcNeC0DgFsqKiqM8847z/jLX/5ilJWV\nGd99953RvXt349133zUMwzD+/ve/GxdddJFr+YyMDMPhcBgVFRWGYRjGsWPHjLCwMOPll182Kioq\njDVr1hjh4eHG8ePHDcMwjOHDhxtdu3Y1vvzyS6OiosIoKyszRowYYbzwwguux0xNTTUGDhxo5Ofn\nG4ZhGF9//bVx6NCharMWFhYa7du3N/bv328YhmEcPnzY+OKLLwzDMIwHHnjAmDFjhmvZ77//vsqc\nNc1xtvj4eOP99983DMMwnnjiCWPo0KHGwYMHjdLSUmPWrFnGtGnTanwOt27dasTGxla57k9/+pPh\n7+9vvPXWW4ZhGEZRUZExadIk49ZbbzVOnTpl/Pjjj8bgwYONFStWGIZhGCtXrqzyPDscDuPAgQOG\nYRjGDTfcYCxYsMAwDMP48MMPXev6+uuvjbi4ONdzlZmZ6brP2a6++mpj6dKl1b7fqKgoIzIy0hg9\nerTx73//u8b7nvn9rF+/3igvLzeWLl1qdOvWzSgvL6/23F1yySXG3/72N9d97777buO2224zDMMw\nXnjhBaNHjx7G999/bxQWFhpXXnmlce211xqGUf21ZRiGMXXqVGPhwoWGYRhGSUmJsX379lpnPNOD\nDz5ojBkzxpgxY4ZxzjnnGIMGDTI++uijWpfv2rWrkZiYaGRnZxvHjx83LrzwQtdzfuzYMeMf//iH\nUVRUZBQUFBhXX321MWnSJNd9z35tlZaWGg6Hwxg9erSRm5trFBcXG//617+Mjh07GmlpaUZlZaWx\natUqIz4+3igtLa13O3722WdGREREg75vwFvR0AFu+vTTT/XTTz9pwYIF8vPzU7du3fTrX/9ar732\nmqTqDc7Zl9955x316tVL11xzjXx8fDR16lQlJCRow4YNkk7v1rvhhhvUu3dv+fj4yM/Pr9rjBAQE\nqKCgQF999ZUqKyvVq1cvderUqcZ5fXx8tG/fPhUVFSkqKkp9+vSpca6z1TZHbVasWKGHHnpI0dHR\n8vf315/+9CetW7euxuO7alt3SkqKJkyYIEnKz8/X5s2b9fjjjysoKEiRkZGaM2eO63luCl9fX5WU\nlOiLL75QWVmZunTpou7du9e4bF5enkJCQqpc9+qrryozM1OZmZkaOXKkxowZo/z8/FrXd/755+vK\nK6+Ur6+v7rrrLhUXF2vXrl3Vlps+fbrWrFkj6fRzs3btWk2fPl3S6ZM/5s6dq/j4eLVt21aLFi3S\na6+9psrKyhqfx4CAAGVkZOjgwYMKCAhQSkpKg56b7OxsbdmyRZdccomOHDmiuXPnauLEiTp27FiN\nyzscDs2ePVsxMTEKDw/X/PnzXd9DRESErrjiCrVp00bt2rXTfffdp48++qjKfc98bfn7+0uS5s2b\np7CwMAUGBur555/XrFmzNGjQIDkcDl133XUKDAzUzp075efnV+d2DAkJqXO7AFZAoAPclJmZqZyc\nHIWHh7v+LVq0SD/++GOD7p+Tk6MuXbpUua5r167KyclxXa7phIEzj6MbOXKkZs+erd/85jeKiorS\nrFmzVFBQUO0+bdu21dq1a/Xcc88pOjpa48aN0zfffNPQb7VRJy5kZGToiiuucD0nffr0kZ+fn44c\nOdLgx4iNjXV9nZmZqbKyMnXu3Nn1mLfeeqtbB7v36NFDTzzxhB544AFFRUVp2rRpOnToUI3LhoeH\nu3ZtOg0dOlSBgYEKCgrSvffeq7CwMG3btq1B34/D4VBsbGyV7ex05ZVXaufOnTp8+LA+/vhj+fj4\n6KKLLpIkHTp0SF27dnUt26VLF5WXl9f6vC5ZskSGYWjw4MHq16+fVq5cWfsTcoagoCB169ZNN954\no3x9fTVlyhTFxcVp+/bttd7nzNdHly5dXN/bqVOnNGvWLMXHxys0NFTDhw9Xfn5+lQBa02vrzOsy\nMzO1bNmyKj9n2dnZOnTokH7xi1/UuR0LCgoUGhraoO8b8FYEOsBNXbp0Ubdu3ZSbm+v6d+LECW3c\nuLFB94+JiVFmZmaV6zIzMxUTE+O6fPZJEDWdFPHb3/5We/bs0Zdffqn9+/fr0UcfrXF9o0eP1pYt\nW3T48GElJCTo5ptvlnQ67J06dcq13OHDh6vdtzEnY3Tp0kWpqalVnpdTp06pc+fODXrcs8+ajIuL\nU2BgoI4dO+Z6vPz8/CrHUdWlttmnTZumbdu2KTMzUw6HQ3/4wx9qXK5///7av39/k9bhlJWV5fq6\nsrJS2dnZio6OrrZceHi4Ro8erbVr1+rVV1/VtGnTXLdFR0crIyPDdfmHH36Qn5+foqKialx/VFSU\nnn/+eR08eFArVqzQ7bff7vo4l7rUdLxcfWey/vDDD1W+dr6Gly1bpv379ystLU35+fn66KOPqp38\nUNtrwKlLly6aP39+lddTYWGhpkyZIqnu7fjVV18pKSmp3u8Z8GYEOsBNgwcPVkhIiJYsWaKioiJV\nVFTo888/1549exp0/8suu0z79+/XmjVrVF5errVr1+rrr7/WuHHjXMucvSstKipKBw4ccF3es2eP\ndu/erbKyMgUHB6tNmzby9fWttq4ff/xRb731lk6ePCl/f3+1bdvWtVxSUpI+/vhjZWVlKT8/X4sW\nLap2//p2y57p1ltv1X333ef6T/7o0aOu3chni4qK0rFjx6o0YGevq3Pnzho9erTuuusuFRQUqLKy\nUgcOHGjQZ7edHR6c9u/frw8++EAlJSUKDAys9XmTTm+nM3cTZmVlafv27SotLVVxcbEeffRRHTt2\nTBdeeGGtc3z22Wd64403VF5erieeeEJt2rRxfTbh2aZPn65Vq1Zp/fr1rt2t0ung8vjjjysjI0OF\nhYW67777NHXqVPn4+CgyMlI+Pj5VXhuvv/66srOzJZ0+WcLhcMjH5/Rb/4gRI/Tggw/WuP4rrrhC\nubm5Wr16tSoqKrRu3TodPHiw1u/PMAw988wzOnjwoI4fP66HH37YFbYKCwsVFBSk0NBQHT9+vMZ1\n1vfauvnmm/Xcc88pLS1NhmHo5MmTeuedd1RYWFjvdvzoo480duzYOh8f8HYEOsBNPj4+2rhxo/bu\n3avu3bsrMjJSt9xyiyuc1NRqnHk5IiJCGzdu1LJly9ShQwctXbpUGzduVERERI3LS9Kdd96pdevW\nKSIiQnPmzNGJEyd0yy23KCIiQvHx8erQoUONHzFRWVmpxx9/XDExMTrnnHO0bds2/fWvf5UkjRo1\n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\nQmCC\n" } ], "prompt_number": 118 }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "*fin de la session 3*\n", "\n", "\n", " \"Licence\n", "\n", "\n", "Ce support de formation cr\u00e9\u00e9 par\n", "Pierre Haessig\n", "est mis \u00e0 disposition selon les termes de la\n", "licence Creative Commons Attribution 3.0 France." ] } ], "metadata": {} } ] }