summaryrefslogtreecommitdiff
path: root/PVCM/cama/fr/ma35 Système matriciel -- Exercices.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'PVCM/cama/fr/ma35 Système matriciel -- Exercices.ipynb')
-rw-r--r--PVCM/cama/fr/ma35 Système matriciel -- Exercices.ipynb190
1 files changed, 190 insertions, 0 deletions
diff --git a/PVCM/cama/fr/ma35 Système matriciel -- Exercices.ipynb b/PVCM/cama/fr/ma35 Système matriciel -- Exercices.ipynb
new file mode 100644
index 0000000..2107be6
--- /dev/null
+++ b/PVCM/cama/fr/ma35 Système matriciel -- Exercices.ipynb
@@ -0,0 +1,190 @@
+{
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "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.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "__Programmation vectorielle__\n",
+ "\n",
+ "Le but des exercices est\n",
+ "\n",
+ "* d'avoir un programme qui donne la bonne réponse\n",
+ "* qui soit le plus rapide possible (et pour cela on utilise massivement Numpy)\n",
+ "\n",
+ "En règle général si vous avez des `for` imbriqués c'est mauvais signe."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "np.set_printoptions(precision=10, linewidth=150, suppress=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "## Méthode du pivot de Gauss partiel\n",
+ "\n",
+ "L'ennoncé est dans le cours. On verifiera sur le cas qui génère des\n",
+ "erreurs d'arrondis."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "## Factorisation de Choleski\n",
+ "\n",
+ "Il s'agit de décomposer A en $A = B\\, B^T$ avec B une matrice triangulaire inférieure. Cela n'est possible\n",
+ "que si la matrice A est symétrique et définie positive (c'est d'ailleurs un facon de vérifier qu'une\n",
+ "matrice est définie positive).\n",
+ "\n",
+ "Écrire l'algorithme de Choleski qui prend A et retourne B (pour deviner l'algorithme, essayez de trouver les \n",
+ "coefficients de B à partir des coefficients de A sur une matrice A 4x4)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "Rappel : pas de boucles `for` imbriquées mais des opérations vectorielles et matricielles (sur des sous-matrices).\n",
+ "\n",
+ "Créer une matrice symétrique définie positive et vérifier que sonprogramme marche bien."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "## Amméliorer Jacobi\n",
+ "\n",
+ "Lorsqu'on écrit une itération de la méthode de Jacobi avec l'ensemble des coefficients, on constate que\n",
+ "si on calcule la nouvelle valeur de **x** élément par élement alors lorsqu'on veut mettre à jour `x[1]`, \n",
+ "on connait déjà `x[0]`. Idem lorsqu'on met à jour `x[2]` on connait déjà `x[0]` et `x[1]`, etc.\n",
+ "\n",
+ "L'idée de la version amméliorée de Jacobi est d'utiliser la nouvelle valeur de `x[0]` et non pas l'ancienne\n",
+ "comme c'est le cas dans l'algorithme du cours. Ainsi en utilisant des valeurs mise à jour on peut espérer\n",
+ "converger plus vite.\n",
+ "\n",
+ "Dans ce cas, chaque itération demande un calcul ligne par ligne et donc une boucle `for` dans la boucle `for` sur\n",
+ "les itérations."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "#### Test d'arrêt\n",
+ "\n",
+ "On ajoutera un argument `error` à la fonction qui indique la précision désirée du résultat. Malheureusement pour connaitre la précision de notre calcul il faut connaitre la solution. On pourrait aussi calculer \n",
+ "${\\bf A \\, x}^t - {\\bf b}$ mais ce n'est pas non plus l'écart entre ${\\bf x}^t$ et la solution (en plus\n",
+ "c'est un calcul en n² donc lourd).\n",
+ "\n",
+ "Aussi on va regarder quand la\n",
+ "convergence ralentit et donc on s'arrête lorsque\n",
+ "$||{\\bf x}^{t+1} - {\\bf x}^t|| < \\texttt{error}$."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "lang": "fr"
+ },
+ "source": [
+ "#### Bonus\n",
+ "\n",
+ "Réécrire la méthode sans la boucle `for` mais en prenant bien le nouvelles valeurs de `x`. Pour cela on va découper la matrice **A** en deux matrices triangulaires."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# les méthodes de Numpy triu et tril seront utiles\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ]
+} \ No newline at end of file