{ "metadata": { "name": "", "signature": "sha256:dc342fa21ca9876c71520ffbd8b8bc7bb1357bf0eda48f427a8727bb8461e951" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 5, "metadata": {}, "source": [ "TP 3 -- M\u00e9thodes Num\u00e9riques pour l\u2019Ing\u00e9nieur CM3 -- Mars 2015 " ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Syst\u00e8mes lin\u00e9aires" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le texte de cette session de travaux pratiques est \u00e9galement disponible ici\n", "\n", "http://nbviewer.ipython.org/github/ecalzavarini/numerical-methods-at-polytech-lille/blob/master/MNI-TP3-2015.ipynb " ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Instructions pour ce TP" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pendant ce TP vous aurez \u00e0 \u00e9crire plusieurs scripts (nous vous sugg\u00e9rons de les nommer script1.py , script2.py ,...) \n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les scripts doivent \u00eatre accompagn\u00e9s par un document descriptif unique ( README.txt ). \n", "Dans ce fichier, vous devrez d\u00e9crire le mode de fonctionnement des scripts et, si besoin, mettre vos commentaires.\n", "Merci d'y \u00e9crires aussi vos nomes et pr\u00e9noms complets.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tous les fichiers doivent etre mis dans un dossier appel\u00e9 TP1-nom1-nom2 et ensuite \u00eatre compress\u00e9s dans un fichier TP1-nom1-nom2.tgz . \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Enfin vous allez envoyer ce fichier par email \u00e0 l'enseignant : \n", "\n", "soit Enrico (enrico.calzavarini@polytech-lille.fr) ou Stefano (stefano.berti@polytech-lille.fr)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous avez une semaine de temps pour compl\u00e9ter le TP, c\u2019est-\u00e0-dire que la date limite pour envoyer vos travaux est 7 jours apr\u00e8s la date du TP courant." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ " Objectif" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On se propose de r\u00e9soudre le syst\u00e8me lin\u00e9aire $A\\ \\vec{x}=\\vec{b}$ (o\u00f9 A repr\u00e9sente une matrice r\u00e9guli\u00e8re d\u2019ordre $n$, $\\vec{x}$ le vecteur inconnu et $\\vec{b}$ le second membre) par deux m\u00e9thodes :\n", "\n", "$a$) la m\u00e9thode directe de $\\textbf{Gauss}$ (en appliquant la strat\u00e9gie du pivot partiel)\n", "\n", "$b$) la m\u00e9thode it\u00e9rative de $\\textbf{Jacobi}$ (avec le crit\u00e8re d\u2019arr\u00eat $|| \\vec{x}_{k} - \\vec{x}_{k+1} || < \\epsilon\\ $ o\u00f9 $k$ est l'indice d'it\u00e9ration). \n", "\n", "Pour cela, on \u00e9crira un script python (un pour chaque m\u00e9thode).\n", "Au bout de pouvoir utiliser le m\u00eame script plusieurs fois, il est pratique de faire en sorte que la matrice $A$ et le vecteur $\\vec{b}$ puissent \u00eatre fournis par l'utilisateur. \n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Programmation et validation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On testera le programme sur les syst\u00e8mes ci-dessous :\n", "$$\n", "{A}= \n", "\\left( \\begin{array}{cccc}\n", "6 & 2 & 2 & 4 \\\\\n", "2 & 8 & 2 & 1 \\\\\n", "4 & 2 & 16 & 8\\\\\n", "2 & 4 & 1 & 9\n", "\\end{array} \\right)\n", "\\quad \n", "\\vec{b} =\n", "\\left( \\begin{array}{c}\n", "1 \\\\\n", "2 \\\\\n", "4 \\\\\n", "1 \\\\\n", "\\end{array} \\right)\n", "$$\n", "\n", "$$\n", "{A}= \n", "\\left( \\begin{array}{ccc}\n", "19 & 5 & 7 \\\\\n", "2 & 7 & 2 \\\\\n", "1 & 6 & 11 \n", "\\end{array} \\right)\n", "\\quad \n", "\\vec{b} =\n", "\\left( \\begin{array}{c}\n", "8 \\\\\n", "2 \\\\\n", "1 \\\\\n", "\\end{array} \\right)\n", "$$\n", "\n", "$$\n", "{A}= \n", "\\left( \\begin{array}{cccc}\n", "7 & 0 & 1 & -1 \\\\\n", "3 & 10 & 5 & 0 \\\\\n", "0 & 4 & 9 & 2\\\\\n", "1 & -5 & 3 & 15\n", "\\end{array} \\right)\n", "\\quad \n", "\\vec{b} =\n", "\\left( \\begin{array}{c}\n", "4 \\\\\n", "3 \\\\\n", "-3 \\\\\n", "12 \\\\\n", "\\end{array} \\right)\n", "$$\n", "\n", "Dans l\u2019application de la m\u00e9thode de Jacobi, on \u00e9tudiera l\u2019influence de la\n", "pr\u00e9cision $\\epsilon$ sur la solution (et le nombre d\u2019it\u00e9rations n\u00e9cessaires pour l\u2019obtenir). \n", "\n", "$\\textbf{Remarque}$ : Avant d'appliquer la m\u00e9thode de Jacobi, on fera le test de la diagonale dominante de la matrice $A$. Le vecteur initial sera entr\u00e9 par l'utilisateur (nous vous sugg\u00e9rons d'essayer le vecteur o\u00f9 toutes les composantes sont \u00e9gales \u00e0 l'unit\u00e9 : $[1,1,1,\\ldots]$).\n", "\n", "Formuler une conclusion en comparant les r\u00e9sultats obtenus par les deux m\u00e9thodes." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Application" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On dispose de $n = 7$ points exp\u00e9rimentaux de coordonn\u00e9es $(x_i,y_i)$ ($i=1,...,n$) suivantes:\n", "$$\n", "\\begin{array}{l}\n", "(-1.5, 0.9)\\\\\n", "(-1.0, 1.2)\\\\ \n", "(-0.5, -.08)\\\\ \n", "(0.0, -2.0)\\\\ \n", "(0.5, -1.3)\\\\\n", "(1.0, -0.5)\\\\\n", "(1.3, 0.5)\n", "\\end{array} \n", "$$\n", "\n", "En utilisant la m\u00e9thode de Gauss, trouver les param\u00e8tres $a_k (k = 0,1,2)$ du mod\u00e8le\n", "parabolique $y(x) = a_0 + a_1 x + a_2 x^2$ approximant au mieux les donn\u00e9es au sens des moindres\n", "carr\u00e9s. Les valeurs des param\u00e8tres seront d\u00e9termin\u00e9es en r\u00e9solvant le syst\u00e8me lin\u00e9aire\n", "suivant :\n", "\n", "$$\n", "\\left( \\begin{array}{ccc}\n", "n & \\Sigma_{i=1}^{n} x_i & \\Sigma_{i=1}^{n} x_i^2\\\\\n", "\\Sigma_{i=1}^{n} x_i & \\Sigma_{i=1}^{n} x_i^2 & \\Sigma_{i=1}^{n} x_i^3 \\\\\n", "\\Sigma_{i=1}^{n} x_i^2 & \\Sigma_{i=1}^{n} x_i^3 & \\Sigma_{i=1}^{n} x_i^4 \n", "\\end{array} \\right)\n", "\\quad \n", "\\left( \\begin{array}{c}\n", "a_0 \\\\\n", "a_1 \\\\\n", "a_2\n", "\\end{array} \\right)\n", "= \n", "\\left( \\begin{array}{c}\n", "\\Sigma_{i=1}^{n} y_i \\\\\n", "\\Sigma_{i=1}^{n} x_i y_i \\\\\n", "\\Sigma_{i=1}^{n} x_i^2 y_i \n", "\\end{array} \\right)\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les points et la courbe d\u2019approximation obtenue seront visualis\u00e9s sur un graphique." ] }, { "cell_type": "heading", "level": 4, "metadata": {}, "source": [ "Rappel de Python " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour d\u00e9finir une matrice ou un vecteur :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "A = np.array([[3,1],[-1,2]] ,float)\n", "b = np.array([2,-2],float)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour entrer des matrices et des vecteurs, ainsi que pour les combiner dans une seule matrice:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "\n", "N=input(\"N=?\") # taille du probleme\n", "\n", "A=input(\"A=?\") # lecture de la matrice A, p.ex. [[1,2],[3,4]]\n", "b=input(\"b=?\") # lecture du vecteur b, p.ex. [0,1]\n", "\n", "# on d\u00e9finit A,b comme des arrays numpy\n", "A=np.asarray(A,float) \n", "b=np.asarray(b,float)\n", "\n", "# on ajoute b comme derni\u00e8re colonne \u00e0 A pour obtenir la matrice augment\u00e9e Ab\n", "Ab=np.column_stack((A,b)) \n", "\n", "# on verifie\n", "print(\"A=\")\n", "print(A)\n", "print(\"b=\")\n", "print(b)\n", "print(\"Ab=\")\n", "print(Ab)\n" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous pouvez v\u00e9rifier la solution du syst\u00e8me lin\u00e9aire $A \\vec{x} = \\vec{b}$ en utilisant la fonction $\\textbf{linalg.solve}$ de la biblioth\u00e8que Numpy :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linalg.solve(A, b)\n", "print(x)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "autres fonctions utiles de Numpy :" ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.dot(A,b) # produit scalaire matrice vecteur ( c'est diff\u00e9rent de A*b! )\n", "\n", "np.sum(b) # sommation des composantes du vecteur b" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.core.display import HTML\n", "def css_styling():\n", " styles = open('custom.css', 'r').read()\n", " return HTML(styles)\n", "css_styling()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "\n", "\n", "\n", "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }