diff --git a/Chapitre 9 - Produits scalaires et espaces euclidens/9.10-9.11 La meilleure approximation quadratique.ipynb b/Chapitre 9 - Produits scalaires et espaces euclidens/9.10-9.11 La meilleure approximation quadratique.ipynb index 006c6bc..ebe2504 100644 --- a/Chapitre 9 - Produits scalaires et espaces euclidens/9.10-9.11 La meilleure approximation quadratique.ipynb +++ b/Chapitre 9 - Produits scalaires et espaces euclidens/9.10-9.11 La meilleure approximation quadratique.ipynb @@ -1,296 +1,301 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **Concept(s)-clé(s) et théorie**\n", "\n", "## Proposition 1\n", "Soient $V$ un espace euclidien et $W \\subset V$ un sous-espace vectoriel de $V$. Alors pour tout $x \\in V$ et tout $y \\in W$, on a\n", "\n", "\\begin{equation}\n", "||x - proj_W x|| \\leq ||x-y||\n", "\\end{equation}\n", "\n", "## Définition 1\n", "Soient $V$ un espace euclidien, $W \\subset V$ un sous-espace vectoriel de $V$ et $x \\in V$; considérez aussi le produit scalaire usuel. Alors le vecteur $proj_Wx$ est appelé la **meilleure approximation quadratique** (ou la **meilleure approximation au sens des moindres carrées**) **de $\\boldsymbol{x}$ par un vecteur dans $\\boldsymbol{W}$**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercises et Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import Librairie.AL_Fct as al\n", "import Corrections.corrections as corrections\n", "import numpy as np\n", "import sympy as sp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 1\n", "\n", "Soit $V = \\mathbb{R}^n$. Considérez les paires suivantes, faites par un ensemble de vecteurs $\\mathcal{S}$ générant un sous-espace vectoriel $W$ de $V$ et par un élément $v$ de $V$. Calculez la meilleure approximation au sens des moindres carrés de $v$ par un vecteur dans $W$.\n", "\n", "1. $V = \\mathbb{R}^2 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}1 \\\\ -2\\end{pmatrix} \\right\\} \\qquad \\qquad \\quad \\ v = \\begin{pmatrix} -2 \\\\ 1 \\end{pmatrix}$\n", "2. $V = \\mathbb{R}^3 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}0 \\\\ 1 \\\\ 0\\end{pmatrix}, \\begin{pmatrix} 1 \\\\ -1 \\\\ 0 \\end{pmatrix} \\right\\} \\qquad \\qquad v = \\begin{pmatrix} -3 \\\\ 2 \\\\ 1 \\end{pmatrix}$\n", "3. $V = \\mathbb{R}^4 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}1 \\\\ 2 \\\\ -1 \\\\-2 \\end{pmatrix}, \\begin{pmatrix}0 \\\\ 1 \\\\ 0 \\\\-1 \\end{pmatrix} \\right\\} \\qquad \\quad \\ \\ \\ v = \\begin{pmatrix} 0 \\\\ -1 \\\\ 1 \\\\ -1\\end{pmatrix}$" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Aide\n", + "\n", + "Pour calculer la meiileure approximation quadratique de $v$ par un vecteur dans $W$,, il peut être utile de dériver une base ortogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt.\n", + "\n", + "#### Instructions\n", + "\n", + "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", + "\n", + "1. Insérez le numéro du cas souhaité dans la cellule suivante. Exécutez le cellules appelées \"SÉLECTION DU CAS\" et \"INITIALISATION DES VARIABLES\"\n", + "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", + "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", + "4. Répétez les étapes 2 et 3 jusqu'à ce que l'algorithme soit terminée\n", + "\n", + "En outre:\n", + "\n", + "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", + "\n", + "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", + "\n", + "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "case_number = 1" + "# SÉLECTION DU CAS\n", + "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "if case_number == 1:\n", " S = [[1,-2]]\n", " v = [-2,1]\n", " dim=1\n", "elif case_number == 2:\n", " S = [[0,1,0], [1,-1,0]]\n", " v = [-3,2,1]\n", " dim=2\n", "elif case_number == 3:\n", " S = [[1,2,-1,-2], [0,1,0,-1]]\n", " v = [0,-1,1,-1]\n", " dim=2\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3]\")\n", "\n", "step = 0\n", "VectorsList = [S]" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Aide\n", - "\n", - "Pour calculer la meiileure approximation quadratique de $v$ par un vecteur dans $W$,, il peut être utile de dériver une base ortogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt.\n", - "\n", - "#### Instructions\n", - "\n", - "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", - "\n", - "1. Insérez le numéro de dossier souhaité dans la cellule suivante\n", - "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", - "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", - "\n", - "En outre:\n", - "\n", - "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", - "\n", - "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", - "\n", - "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." - ] - }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "S = al.interactive_gram_schmidt(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " S.copy(), VectorsList)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# INSÉREZ ICI LE VALEUR DE LA MEILLEURE APPROXIMATION DE v AU SENS DES MOINDRES CARRÉES DANS W\n", "best_appr = [0, 0] " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corrections.Ex1Chapitre9_10_11(best_appr, \n", " case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2\n", "\n", "Soit $V = \\mathcal{C}\\left(I, \\mathbb{R}\\right)$, ou $I$ est un interval dans $\\mathbb{R}$. Considérez les paires suivantes, faites par un ensemble de fonctions $\\mathcal{S}$ générant un sous-espace vectoriel $W$ de $V$ et par un élément $v$ de $V$. Calculez la meilleure approximation au ses des moindres carrés de $v$ par un vecteur dans $W$.\n", "\n", "1. $\\quad \\mathcal{S} = \\left\\{ 1, x \\right\\} = \\mathbb{P}^1(\\mathbb{R}) \\qquad \\qquad \\quad v = |x| \\qquad \\qquad \\ I = [-1,1]$\n", "2. $\\quad \\mathcal{S} = \\left\\{ 1, x, x^2 \\right\\} = \\mathbb{P}^2(\\mathbb{R}) \\qquad \\quad \\ \\ v = |x| \\qquad \\qquad \\ I = [-1,1]$\n", "3. $\\quad \\mathcal{S} = \\left\\{ 1, x, x^2 \\right\\} = \\mathbb{P}^2(\\mathbb{R}) \\qquad \\quad \\ \\ v = sin(x) \\qquad \\quad I = [-\\pi,\\pi]$\n", "4. $\\quad \\mathcal{S} = \\left\\{ 1, x, x^2, x^3 \\right\\} = \\mathbb{P}^3(\\mathbb{R}) \\qquad \\ v = e^x \\qquad \\qquad \\ I=[0,1]$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "case_number=1" + "# SÉLECTION DU CAS\n", + "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "x = sp.Symbol('x')\n", "if case_number == 1:\n", " S = [1+0*x, x]\n", " v = sp.Abs(x)\n", " int_limits = [-1,1]\n", " dim=2\n", "elif case_number == 2:\n", " S = [1+0*x, x, x**2]\n", " v = sp.Abs(x)\n", " int_limits = [-1,1]\n", " dim=3\n", "elif case_number == 3:\n", " S = [1+0*x, x, x**2]\n", " v = sp.sin(x)\n", " int_limits = [-np.pi,np.pi]\n", " dim=3\n", "elif case_number == 4:\n", " S = [1, x, x**2, x**3]\n", " v = sp.exp(x)\n", " int_limits = [0,1]\n", " dim=4\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")\n", "\n", "step = 0\n", "VectorsList = [S]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aide\n", "\n", "Pour calculer la meiileure approximation quadratique de $v$ par un vecteur dans $W$, il peut\n", "aider à dériver une base orthogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt pour fonctions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "S = al.interactive_gram_schmidt_func(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " S.copy(), VectorsList,\n", " int_limits=int_limits,\n", " weight_function=None)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# INSÉREZ ICI LE VALEUR DE LA MEILLEURE APPROXIMATION DE v AU SENS DES MOINDRES CARRÉES DANS W\n", "best_appr = 1 + 0*x" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corrections.Ex2Chapitre9_10_11(best_appr, \n", " int_limits=int_limits, \n", " case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Passez au notebook du chapitre 9.12: Solution au sens du moindres carrées](./9.12%20Solution%20au%20sens%20du%20moindres%20carrées.ipynb)" ] } ], "metadata": { "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 } diff --git "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.12 Solution au sens du moindres carr\303\251es.ipynb" "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.12 Solution au sens du moindres carr\303\251es.ipynb" index 061ed98..d8ca310 100644 --- "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.12 Solution au sens du moindres carr\303\251es.ipynb" +++ "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.12 Solution au sens du moindres carr\303\251es.ipynb" @@ -1,407 +1,412 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **Concept(s)-clé(s) et théorie**\n", "\n", "## Définition 1\n", "Soient $A \\in \\mathcal{M}_{m \\times n}(\\mathbb{R})$, $b \\in \\mathcal{M}_{m \\times 1}(\\mathbb{R})$ et $X = \\left(x_1, \\dots, x_n\\right)^T$. Aussi, désignons par $\\phi: \\mathbb{R}^n \\rightarrow \\mathbb{R}^m$ l'application linéaire associée à $A$. Une **solution du système $\\boldsymbol{AX=b}$ au sens du moindres carrées** est une solution du systeme\n", "\n", "\\begin{equation}\n", "AX = proj_{Im(\\phi)}b\n", "\\end{equation}\n", "\n", "## Théorème 1\n", "Soient $A \\in \\mathcal{M}_{m \\times n}(\\mathbb{R})$, $b \\in \\mathcal{M}_{m \\times 1}(\\mathbb{R})$ et $X = \\left(x_1, \\dots, x_n\\right)^T$. Alors une solution du système $AX=b$ au sens du moindres carrées est une solution du système $A^TAX = A^Tb$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercises et Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import Librairie.AL_Fct as al\n", "import Corrections.corrections as corrections\n", "import numpy as np\n", "import sympy as sp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 1\n", "\n", "Considérez les systèmes linéaires suivants, avec forme $Ax=b$. Calculez leur solution au sens des moindres carrés en projetant $b$ sur l'espace image de $A$ et en résolvant $Ax = proj_{Im(A)}b$.\n", "\n", "1. $\\quad A = \\begin{pmatrix}1 & 0 \\\\ 1 & 0\\end{pmatrix} \\qquad \\qquad b = \\begin{pmatrix}1 \\\\ 3\\end{pmatrix}$\n", "2. $\\quad A = \\begin{pmatrix}1 & 1 \\\\ 1 & -1 \\\\ 2 & 0\\end{pmatrix} \\qquad \\qquad b = \\begin{pmatrix}1 \\\\ 2 \\\\ -2\\end{pmatrix}$\n", "3. $\\quad A = \\begin{pmatrix}1 & 0 & 0\\\\ 0 & 1 & 1 \\\\ 1 & 0 & 0\\end{pmatrix} \\qquad \\quad \\ \\ b = \\begin{pmatrix}-1 \\\\ 2 \\\\ 1\\end{pmatrix}$\n", "4. $\\quad A = \\begin{pmatrix}1 & 0 & 1\\\\ -1 & 1 & -1 \\\\ 0 & 1 & 1 \\\\ 1 & 1 & 0 \\\\ -1 & 0 & 1\\end{pmatrix} \\qquad \\ \\ b = \\begin{pmatrix}0 \\\\ 2 \\\\ 0 \\\\ 1 \\\\ 4\\end{pmatrix}$" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Aide\n", + "\n", + "Pour calculer la projection orthogonal de $b$ sur $Im(A)$, il peut être utile de dériver une base ortogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt.\n", + "\n", + "#### Instructions\n", + "\n", + "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", + "\n", + "1. Insérez le numéro du cas souhaité dans la cellule suivante. Exécutez le cellules appelées \"SÉLECTION DU CAS\" et \"INITIALISATION DES VARIABLES\"\n", + "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", + "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", + "4. Répétez les étapes 2 et 3 jusqu'à ce que l'algorithme soit terminée\n", + "\n", + "En outre:\n", + "\n", + "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", + "\n", + "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", + "\n", + "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# SÉLECTION DU CAS\n", "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "if case_number == 1:\n", " A_cols = [[1,1], [0,0]]\n", " A = np.array(A_cols).T\n", " b = [1,3]\n", " dim=2\n", "elif case_number == 2:\n", " A_cols = [[1,1,2], [1,-1,0]]\n", " A = np.array(A_cols).T\n", " b = [1,2,-2]\n", " dim=2\n", "elif case_number == 3:\n", " A_cols = [[1,0,1], [0,1,0], [0,1,0]]\n", " A = np.array(A_cols).T\n", " b = [-1,2,1]\n", " dim=3\n", "elif case_number == 4:\n", " A_cols = [[1,-1,0,1,-1], [0,1,1,1,0], [1,-1,1,0,1]]\n", " A = np.array(A_cols).T\n", " b = [0,2,0,1,4]\n", " dim=3\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")\n", "\n", "step = 0\n", "VectorsList = [A_cols]" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Aide\n", - "\n", - "Pour calculer la projection orthogonal de $b$ sur $Im(A)$, il peut être utile de dériver une base ortogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt.\n", - "\n", - "#### Instructions\n", - "\n", - "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", - "\n", - "1. Insérez le numéro de dossier souhaité dans la cellule suivante\n", - "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", - "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", - "\n", - "En outre:\n", - "\n", - "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", - "\n", - "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", - "\n", - "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." - ] - }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "print(f\"Current vectors: {A_cols}\")\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "A_cols = al.interactive_gram_schmidt(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " A_cols.copy(), VectorsList)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aide\n", "\n", "Pour résoudre le système linéaire, vous pouvez tirer parti des cellules interactives suivantes qui permettent d'appliquer la méthode d'élimitation de Gauss. Notez que vous devez **entrer la valeur trouvée pour la projection de $\\boldsymbol{b}$ sur l'espace image de $\\boldsymbol{A}$ dans la première ligne!**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "proj_b = [[0], [2], [0]] # INSEREZ ICI LA VALEUR TROUVÉE POUR LA PROJECTION DE b SUR Im (A)\n", "al.printA(A, proj_b)\n", "[i,j,r,alpha]= al.manualEch(A,proj_b)\n", "m=np.concatenate((A,proj_b), axis=1)\n", "MatriceList=[A]\n", "RhSList=[proj_b]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m=al.echelonnage(i,j,r,alpha,A,m,MatriceList,RhSList)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# INSEREZ ICI LA SOLUTION\n", "x,y,z = sp.symbols('x, y, z')\n", "sol = sp.sets.FiniteSet((0,y,2-y))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ÉVALUATION DE LA SOLUTION\n", "corrections.Ex1_Chapitre9_12(sol, case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2\n", "\n", "Considérez les systèmes linéaires suivants, avec forme $Ax = b$. Calculez leur solution au sens des moindres carrés en résolvant le système linéaire $A^TAx=A^Tb$.\n", "\n", "1. $\\quad A = \\begin{pmatrix}0 & 1 \\\\ 0 & -1\\end{pmatrix} \\qquad \\qquad b = \\begin{pmatrix}0 \\\\ 2\\end{pmatrix}$\n", "2. $\\quad A = \\begin{pmatrix}0 & 1 \\\\ 1 & 1 \\\\ 1 & -2\\end{pmatrix} \\qquad \\qquad \\ \\ b = \\begin{pmatrix}1 \\\\ 1 \\\\ 0\\end{pmatrix}$\n", "3. $\\quad A = \\begin{pmatrix}0 & 1 & 0\\\\ 1 & 0 & 1 \\\\ -2 & 0 & 0\\end{pmatrix} \\qquad \\quad b = \\begin{pmatrix}0 \\\\ 2 \\\\ -1\\end{pmatrix}$\n", "4. $\\quad A = \\begin{pmatrix}1 & 0 & 0\\\\ 1 & -1 & -1 \\\\ 0 & 1 & 0 \\\\ 1 & 0 & 0 \\\\ 0 & 1 & -1\\end{pmatrix} \\qquad \\ \\ b = \\begin{pmatrix}2 \\\\ 0 \\\\ 0 \\\\ -1 \\\\ -1\\end{pmatrix}$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# SÉLECTION DU CAS\n", "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "if case_number == 1:\n", " A_cols = [[0,0], [1,-1]]\n", " A = np.array(A_cols).T\n", " b = [[0], [2]]\n", "elif case_number == 2:\n", " A_cols = [[0,1,1], [1,1,-2]]\n", " A = np.array(A_cols).T\n", " b = [[1], [1], [0]]\n", "elif case_number == 3:\n", " A_cols = [[0,1,-2], [1,0,0], [0,1,0]]\n", " A = np.array(A_cols).T\n", " b = [[0], [2], [-1]]\n", "elif case_number == 4:\n", " A_cols = [[1,1,0,1,0], [0,-1,1,0,1], [0,-1,0,0,-1]]\n", " A = np.array(A_cols).T\n", " b = [2,0,0,-1,-1]\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aide\n", "\n", "Pour résoudre le système linéaire, vous pouvez tirer parti des cellules interactives suivantes qui permettent d'appliquer la méthode d'élimitation de Gauss." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "al.printA(A.T@A, A.T@np.array(b))\n", "[i,j,r,alpha]= al.manualEch(A.T@A, A.T@np.array(b))\n", "m=np.concatenate((A.T@A,A.T@np.array(b)), axis=1)\n", "MatriceList=[A.T@A]\n", "RhSList=[A.T@np.array(b)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "m=al.echelonnage(i,j,r,alpha,A.T@A,m,MatriceList,RhSList)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# INSEREZ ICI LA SOLUTION\n", "x,y,z = sp.symbols('x, y, z')\n", "sol = sp.sets.FiniteSet((x,-1)) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ÉVALUATION DE LA SOLUTION\n", "corrections.Ex2_Chapitre9_12(sol, case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 3\n", "\n", "Un scénario important dans lequel le calcul des solutions de systèmes linéaires au sens des moindres carrés est utilisé est celui de la **régression linéaire**. Supposons que l'on donne $N$ mesures de certaines quantités $\\left\\{\\left\\{x_j^i\\right\\}_{j=1}^K, y^i\\right\\}_{i=1}^N$; les variables $x$ sont appelées variables explicatives et $K$ est leur nombre. Par exemple, si $K=1$, ils peuvent être le poids ($x_1$) et la taille ($y$) de $N$ personnes différentes; si $K=2$ ils peuvent être le poids ($x_1$), la longueur des pieds ($x_2$) et la taille ($y$) de $N$ personnes différentes.\n", "\n", "L'objectif est de déterminer la meilleure relation linéaire possible entre ces grandeurs, c'est-à-dire de déterminer les meilleures valeurs possibles pour les coefficients $\\left\\{c_j\\right\\}_{j=0}^K$. En termes mathématiques, cela revient à résoudre le problème de minimisation suivant $$ \\left\\{c_j\\right\\}_{j=0}^K = \\underset{\\tilde{c}_0, \\dots, \\tilde{c}_k}{argmin} \\sum\\limits_{i=1}^N \\left(y^i - \\tilde{c}_0 - \\sum\\limits_{j=1}^K \\tilde{c}_j x_j^i \\right)^2$$ \n", "\n", "S'il existe une relation linéaire entre les données, alors $$y^i = c_0 + \\sum\\limits_{j=1}^K c_j x_j^i \\quad \\forall \\ i \\in \\{1, \\dots, N\\}$$ Cela implique que les coefficients $\\left\\{c_j\\right\\}_{j=0}^K$ sont des solutions au système linéaire suivant:\n", "\n", "\\begin{equation}\n", "\\begin{pmatrix}\n", "1 & x_1^1 & x_2^1 & \\dots & x_K^1 \\\\\n", "1 & x_1^2 & x_2^2 & \\dots & x_K^2 \\\\ \n", "\\vdots & \\vdots & \\vdots & \\ddots & \\vdots \\\\\n", "1 & x_1^N & x_2^N & \\dots & x_K^N\n", "\\end{pmatrix}\n", "\\begin{pmatrix}\n", "c_0 \\\\ c_1 \\\\ c_2 \\\\ \\vdots \\\\ c_K\n", "\\end{pmatrix} = \n", "\\begin{pmatrix}\n", "y^1 \\\\ y^2 \\\\ \\vdots \\\\ y^N\n", "\\end{pmatrix}\n", "\\end{equation}\n", "\n", "Quoi qu'il en soit, comme $N$ dans les applications du monde réel est beaucoup plus grand que $K$, il est très probable que ce système n'admette aucune solution. Ainsi, c'est une approche commun de recourir au calcul d'une solution au sens des moindres carrés; on peut en fait prouver que la solution au sens des moindres carrés est égal à la solution au problème de minimisation quadratique susmentionné, dont dérive le nom de \"moindres carrés\".\n", "\n", "### Instructions\n", "e but de l'exercice est de montrer un scénario de cas réel où des solutions des moindres carrés aux systèmes linéaires sont employées; ainsi aucun calcul numérique n'est requis et peu de quantités doivent être correctement insérées.\n", "\n", "1. **GÉNÉRATION DE DONNÉES**: la cellule appelée \"GÉNÉRATION DE DONNÉES\" est responsable de la génération des données. En particulier, la méthode \"Ex3_Chapitre9_12_generate_data\" génère les données en superposant du bruit gaussien blanc à des données linéairement dépendantes. Les deux premiers arguments d'entrée régulent l'intensité du bruit. L'argument d'entrée appelée \"K\" définit le nombre de variables explicatives; les seules valeurs disponibles sont K = 1 et K = 2, de sorte que les données peuvent être visualisées via des nuages de points. Essayez les deux! Finalement, les variables X et Y stockent la matrice de gauche et le vecteur de droite du système linéaire précédemment introduit.\n", "\n", "2. **INSERTION DE SOLUTION**: la cellule appelée \"INSERTION DE SOLUTION\" vous permet de saisir les valeurs de la matrice de gauche M et du vecteur de droite f, définissant le système linéaire à résoudre afin de calculer la solution souhaitée. Dans ce but, nous rappelons que, étant donné deux matrices A, B:\n", " * A.T $\\rightarrow$ calcule la transposée de A\n", " * A @ B $\\rightarrow$ calcule le produit matriciel entre A et B\n", " * A * B $\\rightarrow$ calcule le produit élément par élément entre A et B\n", "\n", "\n", "3. **VISUALISATION DE LA SOLUTION**: la cellule appelée \"VISUALISATION DE LA SOLUTION\" vous permet de visualiser la solution au problème donnée." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# GÉNÉRATION DE DONNÉES\n", "data, fig = corrections.Ex3_Chapitre9_12_generate_data(0.15, 0.075, K=2)\n", "X = data[0]\n", "Y = data[1]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# INSERTION DE SOLUTION\n", "M = X.T @ X # !! inserez ici la matrice !!\n", "f = X.T @ Y # !! inserez ici le vecteur de droit !!\n", "sys = M, f" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "# VISUALISATION DE LA SOLUTION\n", "corrections.Ex3_Chapitre9_12(sys, data, fig)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Passez au notebook du chapitre 9.13-9.14: La factorisation QR: application à la résolution d'un système au sens du moindres carrées](./9.13-9.14%20La%20factorisation%20QR%20-%20application%20à%20la%20résolution%20d'un%20système%20au%20sens%20des%20moindres%20carrées.ipynb)" ] } ], "metadata": { "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 } diff --git "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.2 - Produit scalaires, d\303\251finitions, exemples.ipynb" "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.2 - Produit scalaires, d\303\251finitions, exemples.ipynb" index a5faaea..4dfbaa5 100644 --- "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.2 - Produit scalaires, d\303\251finitions, exemples.ipynb" +++ "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.2 - Produit scalaires, d\303\251finitions, exemples.ipynb" @@ -1,253 +1,193 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **Concept(s)-clé(s) et théorie**\n", "\n", "## Définition 1 - Produit Scalaire\n", "Soit $V$ un $\\mathbb{R}$-espace vectoriel. Un **produit scalaire** sur $V$ est une application qui fait correspondre à chaque paire ordonnée $(u,v) \\in V \\times V$ un nombre réel, noté $\\langle u, v \\rangle \\in \\mathbb{R}$, telle que les conditions suivantes soient vérifiées, pour tous $u,v,w \\in V, \\alpha \\in \\mathbb{R}$:\n", "\n", "1. *Symmétrie*: $\\langle u,v \\rangle = \\langle v, u \\rangle$\n", "2. *Additivité*: $\\langle u+v, w \\rangle = \\langle u,w \\rangle + \\langle v,w \\rangle$\n", "3. *Bilinearité (combinè avec 2)*: $\\langle \\alpha u, v \\rangle = \\alpha \\langle u,v \\rangle = \\langle u, \\alpha v \\rangle$\n", "4. *Definié Positivité*: $\\langle u,u \\rangle \\geq 0 \\ \\forall u \\in V$ et si $\\langle u,u \\rangle = 0$ alors $u=0$.\n", "\n", "## Définition 2 - Espace Euclidien\n", "Un $\\mathbb{R}$-espace vectoriel *de dimension finie* muni d'un produit scalaire s'appelle un **espace euclidien**.\n", "\n", "## Définition 3 - Orthogonalité\n", "Soiet $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot,\\cdot \\rangle$ et $u,v \\in V$. On dit que $u$ et $v$ sont **orthogonaux** si $\\langle u,v \\rangle = 0$. \n", "\n", "## Example 1 \n", "Un example de produit scalaire dans $V = \\mathcal{M}_{n \\times n}(\\mathbb{R})$ est: $$ \\langle A,B \\rangle = Trace(A^TB)$$ ou la trace d'un matrice carée de dimension $n$ est definie comme suit: $$Trace(A) = \\sum\\limits_{i=1}^n a_{ii}$$\n", "\n", "## Example 2\n", "Un example de produit scalaire dans $V = \\mathcal{C}^0([a;b], \\mathbb{R}) =: \\{f: [a;b] \\rightarrow \\mathbb{R} : f \\ fonction \\ continue\\}$ (avec $[a;b]$ un intervalle de $\\mathbb{R}$) est: $$ \\langle f,g \\rangle = \\int_a^b f(x)g(x) \\ dx$$ où $\\int_a^b f(x) \\ dx$ désigne l'intégrale de Riemann de $f$ dans l'intervalle $[a;b]$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercises et Exemples" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - " \n", - " " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import Librairie.AL_Fct as al\n", "import Corrections.corrections as corrections\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 1\n", "Considérez les couples de $\\mathbb{R}$-espaces vectoriels et d'opérateurs suivants et marquez ceux des déclarations suivantes qui sont corrects.\n", "\n", "1. $\\big(\\mathbf{V}, \\langle a, b \\rangle\\big) = \\big(\\mathbb{R}^3, \\ a_1b_1 - a_1b_2 - a_2b_1 + a_2b_2 - a_2b_3 - a_3b_2 + 2a_3b_3\\big)$\n", "2. $\\big(\\mathbf{V}, \\langle a, b \\rangle\\big) = \\big(\\mathbb{R}^3, \\ a^TMb\\big) \\qquad$ with $M = \\begin{pmatrix} 2 & 0 & 1\\\\ 0 & 2 & -1 \\\\ -1 & -1 & 2 \\end{pmatrix}$\n", "3. $\\big(\\mathbf{V}, \\langle a, b\\rangle\\big) = \\big(\\mathbb{P}^2(\\mathbb{R}), \\ 2c^a_0c^b_0 - c^a_0c^b_2 + c^a_1c^b_1 - c^a_2c^b_0 + c^a_2c^b_2\\big) \\qquad$ with $a(x) =: c^a_2 x^2 + c^a_1 x + c^a_0 \\ $ and $ \\ b(x) =: c^b_2x^2 + c^b_1 x + c^b_0$\n", "4. $\\big(\\mathbf{V}, \\langle a, b\\rangle\\big) = \\big(\\mathbb{P}^3(\\mathbb{R}), \\ 2c^a_0c^b_0 - c^a_0c^b_2 + c^a_1c^b_1 - c^a_2c^b_0 + c^a_2c^b_2\\big) \\qquad$ with $a(x) =: c^a_3 x^3 + c^a_2 x^2 + c^a_1 x + c^a_0 \\ $ and $ \\ b(x) =: c^a_3 x^3 + c^b_2x^2 + c^b_1 x + c^b_0$\n", "5. $\\big(\\mathbf{V}, \\langle a, b\\rangle\\big) = \\big(\\mathcal{C}^1([x_0, x_1]; \\mathbb{R}), \\ a(x_0)b(x_0) + \\int_{x_0}^{x_1} a'(x)b'(x) \\ dx \\big)$\n", "6. $\\big(\\mathbf{V}, \\langle a, b\\rangle\\big) = \\big(\\mathcal{C}^2([x_0, x_1]; \\mathbb{R}), \\ a(x_0)b(x_0) + \\int_{x_0}^{x_1} a''(x)b''(x) \\ dx \\big)$\n", "\n", "### Remarques\n", "- $\\mathbb{P}^n(\\mathbb{R})$ désigne l'ensemble des polynômes a valeurs réelles de degré au plus $n$, qui peuvent alors être exprimés de manière unique en termes de $n+1$ coefficients scalaires\n", "- $\\mathcal{C}^n([x_0, x_1]; \\mathbb{R})$ désigne l'ensemble des fonctions à valeurs réelles qui sont $n$-fois différenciables, avec toutes les dérivées continues, sur l'intervalle $[x_0; x_1]$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corrections.Ex1Chapitre9_2()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 2\n", "Étant donné les couples de matrices suivants, déterminez celles qui sont orthogonales par rapport au produit scalaire défini via l'opérateur de trace\n", "\n", "1. $ \\qquad A = \\begin{pmatrix} 1 & 2 & 0 \\\\ 0 & -1 & -1 \\\\ 1 & 3 & 1 \\end{pmatrix} \\qquad \\quad \\ \\ \n", " B = \\begin{pmatrix} 1 & -1 & 4 \\\\ 3 & 1 & -2 \\\\ 1 & 0 & -1 \\end{pmatrix}$ \n", "2. $ \\qquad A = \\begin{pmatrix} 0 & 2 \\\\ -1 & 3 \\end{pmatrix} \\qquad \\qquad \\quad\n", " B = \\begin{pmatrix} 3 & 1 \\\\ 1 & -1 \\end{pmatrix}$\n", "3. $ \\qquad A = \\begin{pmatrix} 0 & 1 & 3 & 0 \\\\ 1 & 0 & 1 & 0 \\\\ -1 & -2 & 2 & 1 \\\\ 3 & 4 & 1 & 2 \\end{pmatrix} \\qquad\n", " B = \\begin{pmatrix} 3 & 1 & -1 & 2 \\\\ 2 & 2 & 0 & 1 \\\\ -1 & 1 & -1 & 3 \\\\ -1 & 1 & 1 & -1 \\end{pmatrix}$\n", "4. $ \\qquad A = \\begin{pmatrix} 1 & -3 \\\\ 2 & 1 \\end{pmatrix} \\qquad \\qquad \\quad\n", " B = \\begin{pmatrix} 1 & -2 \\\\ -2 & 1 \\end{pmatrix}$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corrections.Ex2Chapitre9_2()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 3\n", "Étant donné les couples de fonctions suivants, déterminez s'ils sont orthogonaux par rapport au produit scalaire donné\n", "\n", "1. $\\qquad f(x) = 1 - x^2; \\quad g(x) = -(x-1)^2 \\qquad \\quad with: \\quad \\langle f, g \\rangle = c^f_0c^g_0 + c^f_1c^g_1 + c^f_2c^g_2$\n", "2. $\\qquad f(x) = 1 - x^2; \\quad g(x) = -(x-1)^2 \\qquad \\quad with: \\quad \\langle f, g \\rangle = \\int_{-1}^{1} f(x)g(x) \\ dx$\n", "3. $\\qquad f(x) = x - \\dfrac{1}{2}; \\quad g(x) = x^2 - x - \\dfrac{1}{6} \\qquad \\ \\ with: \\quad \\langle f, g \\rangle = 2c^f_0c^g_0 - c^f_0c^g_0 + 2c^f_1c^g_1 - c^f_1c^g_2 - c^f_2c^g_0 - c^f_2c^g_1 + 2c^f_2c^g_2$\n", "4. $\\qquad f(x) = x - \\dfrac{1}{2}; \\quad g(x) = x^2 - x - \\dfrac{1}{6} \\qquad \\ \\ with: \\quad \\langle f, g \\rangle = \\int_0^1 f(x)g(x) \\ dx$\n", "5. $\\qquad f(x) = \\sin(x); \\quad \\ g(x) = \\cos(x) \\qquad \\qquad \\ \\ with: \\quad \\langle f,g \\rangle = \\int_{-\\pi}^{\\pi} f(x)g(x) \\ dx$\n", "6. $\\qquad f(x) = \\sin(x); \\quad \\ g(x) = \\cos(x) \\qquad \\qquad \\ \\ with: \\quad \\langle f,g \\rangle = \\int_{0}^{\\pi / 2} f(x)g(x) \\ dx$" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cliquer sur CTRL pour sélectionner plusieurs réponses\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "daffcdc93f9841568bb81cbcff6cbcad", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(SelectMultiple(description='Les fonctions sont orthogonales dans les cas:', layout=Layou…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "corrections.Ex3Chapitre9_2()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aide**: Vous pouvez vous aider en exécutant les cellules suivantes, qui permettent de tracer les 3 couples de fonctions considérés dans l'exercice 3" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# CASES 1-2\n", "corrections.Ex3Chapitre9_2_plotter(case_nb=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CASES 3-4\n", "corrections.Ex3Chapitre9_2_plotter(case_nb=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CASES 5-6\n", "corrections.Ex3Chapitre9_2_plotter(case_nb=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Passez au notebook du chapitre 9.3-9.4: Norme, inegalité de Cauchy-Schwarz, orthogonalité, inegalité du triangle, Pythagore](./9.3-9.4%20Norme%2C%20inégalité%20de%20Cauchy-Schwarz%2C%20orthogonalité%2C%20inegalité%20du%20triangle%2C%20Pythagore.ipynb)" ] } ], "metadata": { "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 } diff --git "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.6-9.7 Comment trouver une base orthogonale au orthonormale - Le proc\303\251d\303\251 de Gram-Schmidt.ipynb" "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.6-9.7 Comment trouver une base orthogonale au orthonormale - Le proc\303\251d\303\251 de Gram-Schmidt.ipynb" index 280c74c..d325183 100644 --- "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.6-9.7 Comment trouver une base orthogonale au orthonormale - Le proc\303\251d\303\251 de Gram-Schmidt.ipynb" +++ "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.6-9.7 Comment trouver une base orthogonale au orthonormale - Le proc\303\251d\303\251 de Gram-Schmidt.ipynb" @@ -1,356 +1,361 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **Concept(s)-clé(s) et théorie**\n", "\n", "## Proposition 1\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot,\\cdot\\rangle$ et $S = \\{v_1, \\dots, v_k\\} \\subset V$ une famille orthogonale de vecteurs non-nuls. Alors $S$ est une famille libre.\n", "\n", "## Définition 1\n", "Soit $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot,\\cdot\\rangle$. Pour $u,v \\in V$, on définit la **projection orthogonale de $u$ sur $v$** par $$ proj_v u = \\dfrac{\\langle u,v \\rangle}{\\langle v,v \\rangle} v = \\dfrac{\\langle u,v \\rangle}{||v||^2}v$$\n", "\n", "## Proposition 2\n", "Soit $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot,\\cdot\\rangle$. Alors les affirmations suivantes sont vérifiée:\n", "\n", "1. Pour tous $u,v \\in V$ le vecteur $proj_v u \\in V$ appartient à $Vect(\\{v\\})$\n", "2. Pour tous $u,v \\in V$, on a $\\langle u - proj_v u, v \\rangle = 0$\n", "\n", "## Théorème 1: Procédé de Gram-Schmidt\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot,\\cdot \\rangle$ et $S = \\{x_1, \\dots, x_k\\}$ une famille de vecteurs dans $V$. Alors en posant successivement\n", "\\begin{equation}\n", "\\begin{aligned}\n", "v_1 &= x_1 \\\\\n", "v_2 &= x_2 - proj_{v_1}x_2 \\\\\n", "v_3 &= x_3 - proj_{v_1}x_3 - proj_{v_2}x_3 \\\\\n", "\\vdots & \\qquad \\\\\n", "v_k &= x_k - proj_{v_1}x_k - proj_{v_2}x_k - \\cdots - proj_{v_{k-1}}x_k\n", "\\end{aligned}\n", "\\end{equation}\n", "la famille $\\{v_1, \\dots, v_k\\}$ ainsi obtenue est une famille orthogonale.\n", "\n", "## Théorème 2: Proprietes du procédé de Gram-Schmidt\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot,\\cdot \\rangle$ et $S = \\{x_1, \\dots, x_k\\}$ une famille de vecteurs *linéarment indépentants* dans $V$. La procédé de Gram-Schmidt applique à la famille $S$ définit une suite de vecteurs $v_1, \\dots v_k$ telle que $\\{v_1, \\dots, v_k\\}$ est une famille de vecteurs deux-à-deux ortogonaux, non-nuls et donc linéarment indédendants. De plus, on a $$ Vect(S) = Vect(v_1, \\dots, v_k)$$\n", "\n", "## Remarque 1\n", "1. Si $\\{x_1, \\dots, x_k\\}$ est une base de $V$, le procédé de Gram-Schmidt donne une base orthogonale $\\{v_1,\\dots, v_k\\}$ de $V$.\n", "2. Si l'on souhaite avoir une base orthonormale de $V$, il suffit de normaliser la base obtenue." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercises et Exemples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import Librairie.AL_Fct as al\n", "import Corrections.corrections as corrections\n", "import numpy as np\n", "import sympy as sp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 1\n", "\n", "Considérez les $\\mathbb{R}$-espaces vectoriels suivants, équipés avec le produit scalaire donnè. Considérez les éléments donnés $u$ et $v$ de ces espaces. Calculez la projection orthogonale de $u$ sur $v$.\n", "\n", "1. $\\quad$ $V = \\mathbb{R}^2$; $\\qquad \\qquad$ $\\langle u,v \\rangle_V = u^Tv$; $\\qquad \\qquad \\qquad \\qquad \\qquad \\qquad \\quad$ $u = \\begin{pmatrix} -1 \\\\ 2 \\end{pmatrix}$ $\\qquad \\ \\ $ $v = \\begin{pmatrix} 1 \\\\ 1 \\end{pmatrix}$\n", "\n", "2. $\\quad$ $V = \\mathbb{R}^3$; $\\qquad \\qquad$ $\\langle u,v \\rangle_V = u^TAv \\quad avec \\ \\ A=\\begin{bmatrix} 2 & 0 & -1\\\\ 0 & 1 & 0\\\\ -1 & 0 & 2 \\end{bmatrix}$ $\\qquad$ $u = \\begin{pmatrix} 1 \\\\ 2 \\\\ 1 \\end{pmatrix}$ $\\qquad \\quad \\ \\ $ $v = \\begin{pmatrix} 0 \\\\ 1 \\\\ -1 \\end{pmatrix}$\n", "\n", "3. $\\quad$ $V = \\mathbb{R}^5$; $\\qquad \\qquad$ $\\langle u,v \\rangle_V = u^Tv$; $\\qquad \\qquad \\qquad \\qquad \\qquad \\qquad \\quad \\ $ $u = \\begin{pmatrix} -1 \\\\ 0 \\\\ 1 \\\\ 0 \\\\ 1 \\end{pmatrix}$ $\\qquad \\quad $ $v = \\begin{pmatrix} 0 \\\\ 1 \\\\ -1 \\\\ 1 \\\\ 0 \\end{pmatrix}$\n", "\n", "4. $\\quad$ $V = \\mathbb{P}^2(\\mathbb{R})$; $\\qquad \\quad$ $\\langle f,g \\rangle_V = \\int_0^1 f(x)g(x) \\ dx$; $\\qquad \\qquad \\qquad \\qquad \\ \\ \\ $ $f(x) = x^2 - 1$ $\\qquad$ $g(x) = x$\n", "\n", "5. $\\quad$ $V = \\mathbb{P}^3(\\mathbb{R})$; $\\qquad \\quad$ $\\langle f,g \\rangle_V = \\int_{-1}^1 (1-x^2)f(x)g(x) \\ dx$; $\\qquad \\qquad \\quad \\ \\ \\ $ $f(x) = x^2 -x$ $\\qquad$ $g(x)=x+1$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CAS 1\n", "ans = [1/2,1/2] # inserez ici votre réponse\n", "corrections.Ex1Chapitre9_6_7(ans, case_nb=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CAS 2\n", "ans = [0, 1/3, -1/3] # inserez ici votre réponse\n", "corrections.Ex1Chapitre9_6_7(ans, case_nb=2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CAS 3\n", "ans = [0, 0, 0, 0, 0] # inserez ici votre réponse\n", "corrections.Ex1Chapitre9_6_7(ans, case_nb=3)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CAS 4\n", "x = sp.Symbol('x')\n", "ans = x**1 # inserez ici votre réponse\n", "corrections.Ex1Chapitre9_6_7(ans, case_nb=4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# CAS 5\n", "x = sp.Symbol('x')\n", "ans = x**1 # inserez ici votre réponse\n", "corrections.Ex1Chapitre9_6_7(ans, case_nb=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2\n", "\n", "Considérez les ensembles de vecteurs suivants dans $\\mathbb{R}^n, \\ n \\in \\{2,3,4\\}$. Tirez parti de la méthode interactive qui suit pour appliquer la méthode de Gram-Schmidt et dériver un ensemble orthonormé de vecteurs.\n", "Supposez que le produit scalair soit le produit standard $\\langle u,v \\rangle = u^Tv$ dans tous les cas.\n", "\n", "**Remarque**: pour exécuter correctement l'algorithme, gardez l'ordre donné des vecteurs!\n", "\n", "1. $\\mathcal{S}_1 = \\left\\{ \\begin{bmatrix} 2 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} -1 \\\\ -1 \\end{bmatrix} \\right\\}$\n", "\n", "2. $\\mathcal{S}_2 = \\left\\{ \\begin{bmatrix} 2 \\\\ 0 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 1 \\\\ 1 \\\\ 0 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 0 \\\\ 1 \\end{bmatrix} \\right\\}$\n", "\n", "3. $\\mathcal{S}_3 = \\left\\{ \\begin{bmatrix} 1 \\\\ 0 \\\\ -1 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 0 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\end{bmatrix} \\right\\}$\n", "\n", "4. $\\mathcal{S}_4 = \\left\\{ \\begin{bmatrix} 1 \\\\ 0 \\\\ 0 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 1 \\\\ -1\\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 0 \\\\ 1 \\end{bmatrix}, \\begin{bmatrix} 0 \\\\ 1 \\\\ 1 \\\\ 0\\end{bmatrix} \\right\\}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Instructions\n", "\n", "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", "\n", - "1. Insérez le numéro de dossier souhaité dans la cellule suivante\n", + "1. Insérez le numéro du cas souhaité dans la cellule suivante. Exécutez le cellules appelées \"SÉLECTION DU CAS\" et \"INITIALISATION DES VARIABLES\"\n", "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", + "4. Répétez les étapes 2 et 3 jusqu'à ce que l'algorithme soit terminée\n", "\n", "En outre:\n", "\n", "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", "\n", "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", "\n", "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "case_number = 3" + "# SÉLECTION DU CAS\n", + "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "if case_number == 1:\n", " vectors = [[2,1], [-1,-1]]\n", " dim=2\n", "elif case_number == 2:\n", " vectors = [[2,0,1], [1,1,0], [0,0,1]]\n", " dim=3\n", "elif case_number == 3:\n", " vectors = [[1,0,-1], [0,1,1], [0,0,1], [1,1,1]]\n", " dim=4\n", "elif case_number == 4:\n", " vectors = [[1,0,0,1], [0,1,1,-1], [0,1,0,1],[0,1,1,0]]\n", " dim=4\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")\n", "step = 0\n", "VectorsList = [vectors]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "vectors = al.interactive_gram_schmidt(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " vectors.copy(), VectorsList)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercise 3\n", "\n", "Considérez les ensembles de fonctions suivants, dans les intervalles donnés et avec le produit scalir donné. Tirez parti de la méthode interactive qui suit pour appliquer la méthode de Gram-Schmidt et dériver un ensemble orthonormé de vecteurs. Vous pouvez vous aider à calculer les intégrales en exécutant la cellule appelée \"Cellule d'aide pour calculer les intégrales\"\n", "\n", "\n", "**Remarque**: pour exécuter correctement l'algorithme, gardez l'ordre donné des fonctions!\n", "\n", "1. $\\mathcal{F}_1 = \\left\\{1, x, x^2\\right\\}; \\qquad \\quad \\ \\ [a;b] = [-1;1] \\qquad \\langle f,g \\rangle = \\int_a^b f(x) g(x) \\ dx$\n", "2. $\\mathcal{F}_2 = \\left\\{1, x, x^2, x^3 \\right\\}; \\qquad \\ [a;b] = [0;1] \\qquad \\ \\ \\langle f,g \\rangle = \\int_a^b f(x) g(x) \\ dx$\n", "3. $\\mathcal{F}_3 = \\left\\{1, x^2, x^4 \\right\\}; \\qquad \\quad [a;b] = [-1;1] \\qquad \\langle f,g \\rangle = \\int_a^b (1-|x|) f(x) g(x) \\ dx$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "case_number = 2" + "# SÉLECTION DU CAS\n", + "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "x = sp.Symbol('x')\n", "\n", "if case_number == 1:\n", " functions = [1 + 0*x, x, x**2]\n", " int_limits = [-1, 1]\n", " weight_function = 1.0 + 0*x\n", " dim=3\n", "elif case_number == 2:\n", " functions = [1.0 + 0*x, x, x**2, x**3]\n", " int_limits = [0, 1]\n", " weight_function = 1.0 + 0*x\n", " dim=4\n", "elif case_number == 3:\n", " functions = [1.0 + 0*x, x**2, x**4]\n", " int_limits = [-1, 1]\n", " weight_function = (1 - sp.abs(x))\n", " dim=3\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")\n", " \n", "step = 0\n", "FunctionsList = [functions]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "functions = al.interactive_gram_schmidt_func(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " functions.copy(), \n", " FunctionsList,\n", " int_limits=int_limits,\n", " weight_function=weight_function)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Cellule d'aide pour calculer les intégrales\n", "x = sp.Symbol('x')\n", "func = weight_function * x # insert here the expression of your function, using 'x' as variable\n", "I = al.integrate_sp_function(func, x, int_limits)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Passez au notebook du chapitre 9.8-9.9: La projection orthgonale sur un sous-espace vectoriel - La projection orthogonale: examples et remarques supplémentaires](./9.8-9.9%20La%20projection%20orthogonale%20sur%20un%20sous-espace%20vectoriel%20-%20La%20projection%20orthogonale%20examples%20et%20remarques%20supplémentaires.ipynb)" ] } ], "metadata": { "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 } diff --git "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.8-9.9 La projection orthogonale sur un sous-espace vectoriel - La projection orthogonale examples et remarques suppl\303\251mentaires.ipynb" "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.8-9.9 La projection orthogonale sur un sous-espace vectoriel - La projection orthogonale examples et remarques suppl\303\251mentaires.ipynb" index a48e685..c6cb948 100644 --- "a/Chapitre 9 - Produits scalaires et espaces euclidens/9.8-9.9 La projection orthogonale sur un sous-espace vectoriel - La projection orthogonale examples et remarques suppl\303\251mentaires.ipynb" +++ "b/Chapitre 9 - Produits scalaires et espaces euclidens/9.8-9.9 La projection orthogonale sur un sous-espace vectoriel - La projection orthogonale examples et remarques suppl\303\251mentaires.ipynb" @@ -1,357 +1,362 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# **Concept(s)-clé(s) et théorie**\n", "\n", "## Définition 1\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot, \\cdot \\rangle$ et $W \\subset V$ un sous-espace vectoriel de $V$. L'**orthogonal à $W$ dans $V$** est le sous-ensemble de $V$ défini par $$W^\\perp = \\left\\{v \\in V: \\langle v,w \\rangle = 0 \\quad \\forall \\ w \\in W\\right\\}$$\n", "\n", "## Proposition 1\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel muni d'un produit scalaire $\\langle \\cdot, \\cdot \\rangle$ et $W \\subset V$ un sous-espace vectoriel de $V$. Alors le sous-ensamble $W^\\perp$ de $V$ est un sous-espace vectoriel de $V$.\n", "\n", "## Proposition 2\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel et $W \\subset V$ un sous-espace vectoriel de $V$. Alors pour tout $v \\in V$, il existe $w \\in W$ et $x \\in W^\\perp$ tels que $v = w + x$. De plus, $w$ et $x$ sont uniquement déterminés par $v$. Donc, cela revient à dire que $V = W \\oplus W^{\\perp}$.\n", "\n", "## Définition 2\n", "Soient $V$ un $\\mathbb{R}$-espace vectoriel et $W \\subset V$ un sous-espace vectoriel de $V$. Soient également $v \\in V$ et $w \\in W, x \\in W^\\perp$ tels que $v = w+x$, come ci-dessus. On appelle $w$ la **projection orthogonale de $v$ sur $W$** et on écrit $w = proj_Wv$.\n", "\n", "## Proposition 3\n", "Soient $V$ un $\\mathbb{R}$-espace euclidien de dimension $n$ et $W \\subset V$ un sous-espace vectoriel de $V$ de dimension $k$. Soit également $\\{v_1, \\dots, v_k, v_{k+1}, \\dots, v_n\\}$ un base orthonormée de $V$ tel que $\\{v_1, \\dots, v_k\\}$ est une base orthonormée de $W$ et $\\{v_{k+1}, \\dots, v_n\\}$ est une base orthonormée de $W^\\perp$. Alors nous pouvons calculer les projections orthogonales de $v \\in V$ sur $W$ et sur $W^\\perp$ respectivement comme suit:\n", "\\begin{align*}\n", "proj_Wv &= \\sum\\limits_{i=1}^k \\dfrac{\\langle v, v_i \\rangle}{\\langle v_i,v_i \\rangle} v_i\\\\\n", "proj_{W^\\perp}v &= \\sum\\limits_{j=k+1}^n \\dfrac{\\langle v, v_j \\rangle}{\\langle v_j,v_j \\rangle} v_j\n", "\\end{align*}\n", "\n", "## Corollaire 1 (de Gram-Schmidt)\n", "Soient $V$ un espace euclidien et $W \\subset V$ un sous-espace vectoriel de $V$. Alors $$dim W^\\perp = dim V - dim W$$\n", "\n", "## Corollaire 2\n", "Soient $V$ un espace euclidien et $W \\subset V$ un sous-espace vectoriel de $V$. Alors $$\\left(W^\\perp\\right)^\\perp = W$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercises et Examples" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import Librairie.AL_Fct as al\n", "import Corrections.corrections as corrections\n", "import numpy as np\n", "import sympy as sp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 1\n", "\n", "Soit $V = \\mathbb{R}^n, \\ n=2,3$. Considérez les paires suivantes, faites par un ensemble de vecteurs $\\mathcal{S}$ générant un sous-espace vectoriel $W$ de $V$ et par un élément $v$ de $V$. Calculez les projections orthogonales de $v$ sur $W$ et $W^\\perp$. Tous les produits scalaires sont censés être les produits usuels.\n", "\n", "1. $V = \\mathbb{R}^2 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}1 \\\\ 1\\end{pmatrix} \\right\\} \\qquad \\qquad \\quad \\ v = \\begin{pmatrix} -1 \\\\ 0 \\end{pmatrix}$\n", "2. $V = \\mathbb{R}^2 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}0 \\\\ 1\\end{pmatrix}, \\begin{pmatrix} 1 \\\\ -1 \\end{pmatrix} \\right\\} \\qquad v = \\begin{pmatrix} -3 \\\\ 5 \\end{pmatrix}$\n", "3. $V = \\mathbb{R}^3 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}1 \\\\ 2 \\\\ 1\\end{pmatrix} \\right\\} \\qquad \\qquad \\qquad \\ v = \\begin{pmatrix} 1 \\\\ 0 \\\\ 1\\end{pmatrix}$\n", "4. $V = \\mathbb{R}^3 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix}1 \\\\ -1\\\\ 1\\end{pmatrix}, \\begin{pmatrix} 0 \\\\ 1 \\\\ 1 \\end{pmatrix}\\right\\} \\qquad \\quad \\ \\ v = \\begin{pmatrix} -1 \\\\ 0 \\\\ 1 \\end{pmatrix}$" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Aide\n", + "\n", + "Pour calculer la projection orthogonal de $v$ sur $W$, il peut être utile de dériver une base ortogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt.\n", + "\n", + "#### Instructions\n", + "\n", + "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", + "\n", + "1. Insérez le numéro du cas souhaité dans la cellule suivante. Exécutez le cellules appelées \"SÉLECTION DU CAS\" et \"INITIALISATION DES VARIABLES\"\n", + "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", + "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", + "4. Répétez les étapes 2 et 3 jusqu'à ce que l'algorithme soit terminée\n", + "\n", + "En outre:\n", + "\n", + "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", + "\n", + "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", + "\n", + "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "case_number = 4" + "# SÉLECTION DU CAS\n", + "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "if case_number == 1:\n", " S = [[1,1]]\n", " v = [-1,0]\n", " dim=1\n", "elif case_number == 2:\n", " S = [[0,1], [-1,1]]\n", " v = [-3,5]\n", " dim=2\n", "elif case_number == 3:\n", " S = [[1,2,1]]\n", " v = [1,0,1]\n", " dim=1\n", "elif case_number == 4:\n", " S = [[1,-1,1], [0,1,1]]\n", " v = [-1,0,1]\n", " dim=2\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")\n", "\n", "step = 0\n", "VectorsList = [S]" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Aide\n", - "\n", - "Pour calculer la projection orthogonal de $v$ sur $W$, il peut être utile de dériver une base ortogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt.\n", - "\n", - "#### Instructions\n", - "\n", - "Pour utiliser la méthode interactive de Gram-Schmidt, procédez comme suit:\n", - "\n", - "1. Insérez le numéro de dossier souhaité dans la cellule suivante\n", - "2. Exécutez la cellule appelée \"SÉLECTION DES PARAMÈTRES\" pour sélectionner le type d'opération et les coefficients nécessaires\n", - "3. Exécutez la cellule appelée \"EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\" pour exécuter l'étape de l'algorithme de Gram-Schmidt avec les paramètres précédemment sélectionnés\n", - "\n", - "En outre:\n", - "\n", - "1. Vous pouvez annuler une opération en sélectionnant le bouton \"Revert\".\n", - "\n", - "2. Si les coefficients insérés sont incorrects, vous pouvez essayer avec de nouvelles valeurs sans effectuer une opération \"Revert\".\n", - "\n", - "3. Les coefficients qui ne sont pas liés à l'opération sélectionnée peuvent être définis sur n'importe quelle valeur, car ils ne sont pas utilisés dans le code." - ] - }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "S = al.interactive_gram_schmidt(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " S.copy(), VectorsList)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# IINSÉREZ ICI LES VALEURS DES DEUX PROJECTIONS\n", "proj1 = [1,1,1] # projection sur W\n", "proj2 = [0,0,0] # projection sur le complément orthogonal de W en V" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "corrections.Ex1Chapitre9_8_9(proj1, proj2, case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 2\n", "\n", "Soit $V = \\mathbb{P}^n(\\mathbb{R}), \\ n=2,3$. Considérez les paires suivantes, faites par un ensemble de fonctions $\\mathcal{S}$ générant un sous-espace vectoriel $W$ de $V$ et par un élément $v$ de $V$. Calculez les projections orthogonales de $v$ sur $W$ e $W^\\perp$. Tous les produits scalaires sont censés être les produits usuels, dans l'intervalle spécifié $I$.\n", "\n", "1. $V = \\mathbb{P}^2(\\mathbb{R}) \\qquad \\mathcal{S} = \\left\\{ 1, x \\right\\} \\qquad \\qquad \\ \\ \\ v = x^2 \\qquad \\qquad \\qquad \\\n", "I = [-1,1]$\n", "2. $V = \\mathbb{P}^2(\\mathbb{R}) \\qquad \\mathcal{S} = \\left\\{ 1, x^2 \\right\\} \\qquad \\qquad v = x \\qquad \\qquad \\qquad \\ \\ \\ I = [0,1]$\n", "3. $V = \\mathbb{P}^3(\\mathbb{R}) \\qquad \\mathcal{S} = \\left\\{ 1, 1+x^2, x^3 \\right\\} \\quad \\ v = x^2 + x \\qquad \\qquad \\ \\ \\ I = [-1,1]$\n", "4. $V = \\mathbb{P}^3(\\mathbb{R}) \\qquad \\mathcal{S} = \\left\\{ x^2, x^3 \\right\\} \\qquad \\quad \\ \\ v = 1 + x + x^2 + x^3 \\quad \\ I=[-1,1]$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "case_number = 1" + "# SÉLECTION DU CAS\n", + "case_number = 1 # CHOISISSEZ LE NUMÉRO DE CAS ICI ET EXECUTEZ LA CELLULE SUIVANTE!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# INITIALISATION DES VARIABLES\n", "x = sp.Symbol('x')\n", "if case_number == 1:\n", " S = [1+0*x, x]\n", " v = x**2\n", " int_limits = [-1,1]\n", " dim=2\n", "elif case_number == 2:\n", " S = [1+0*x, x**2]\n", " v = x\n", " int_limits = [0,1]\n", " dim=2\n", "elif case_number == 3:\n", " S = [1+0*x, x**2, x**3]\n", " v = x**2 + x\n", " int_limits = [-1,1]\n", " dim=3\n", "elif case_number == 4:\n", " S = [x**2, x**3]\n", " v = 1 + x + x**2 + x**3\n", " int_limits = [-1,1]\n", " dim=2\n", "else:\n", " print(f\"{case_number} n'est pas un numéro de cas valide!\" \n", " f\"Numéros de cas disponibles: [1,2,3,4]\")\n", "\n", "step = 0\n", "VectorsList = [S]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aide\n", "\n", "Pour calculer la projection de $v$ sur $W$, il peut\n", "aider à dériver une base orthogonale (ou orthonormée) pour ce dernier. Vous pouvez utiliser la cellule suivante pour exécuter l'algorithme interactif de Gram-Schmidt pour fonctions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# SÉLECTION DES PARAMÈTRES\n", "norm_coeff, proj_coeffs, operation, step_number = al.manual_GS(dim=dim)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# EXÉCUTER L'ÉTAPE DE L'ALGORITHME GRAM-SCHMIDT\n", "S = al.interactive_gram_schmidt_func(norm_coeff, proj_coeffs,\n", " operation, step_number, \n", " S.copy(), VectorsList,\n", " int_limits=int_limits,\n", " weight_function=None)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# INSÉREZ ICI LES VALEURS DES DEUX PROJECTIONS\n", "proj1 = 1 + 0*x # projection sur W\n", "proj2 = x # projection sur le complément orthogonal de W en V" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corrections.Ex2Chapitre9_8_9(proj1, proj2, \n", " int_limits=int_limits, \n", " case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice 3\n", "\n", "Soit $V = \\mathbb{R}^n, \\ n=2,3$. Étant donné les ensembles de vecteurs suivants $\\mathcal{S}$, générant un sous-espace $W$ de $V$, déterminez une *base orthogonale* pour $W^\\perp$.\n", "\n", "1. $ \\qquad V=\\mathbb{R}^2 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix} 1 \\\\ 2 \\end{pmatrix}, \\begin{pmatrix} 1 \\\\ 0 \\end{pmatrix} \\right\\}$\n", "2. $ \\qquad V=\\mathbb{R}^2 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix} 1 \\\\ -1 \\end{pmatrix}\\right\\}$\n", "3. $ \\qquad V=\\mathbb{R}^3 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix} 1 \\\\ 2 \\\\1 \\end{pmatrix}, \\begin{pmatrix} 0 \\\\ 1 \\\\ 0 \\end{pmatrix}, \\begin{pmatrix} -2 \\\\ 0 \\\\ -2 \\end{pmatrix} \\right\\}$\n", "4. $ \\qquad V=\\mathbb{R}^3 \\qquad \\mathcal{S} = \\left\\{ \\begin{pmatrix} -1 \\\\ 1 \\\\ 2 \\end{pmatrix}\\right\\}$\n", "\n", "### Instructions \n", "1. Si $W^\\perp$ ne contient que le vecteur nul (i.e. si $W \\equiv \\mathbb{R}^n$), entrez simplement une liste vide comme suit \"base = $[ \\ ]$\" (et non comme \"base = $[[ \\ ]]$\").\n", "2. Si $W^\\perp$ a une dimension supérieure à $0$, entrez les éléments de sa base sous forme de liste de listes. Ainsi, même si la base de $W^ \\perp$ contient un élément, entrez-le comme \"base = $[[a, b]]$\" et non comme \"base = $[a, b]$\"." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "case_number = 4\n", "basis = []" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corrections.Ex3Chapitre9_8_9(basis, case_nb=case_number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Passez au notebook du chapitre 9.10-9.11: La meilleure approximation quadratique](./9.10-9.11%20La%20meilleure%20approximation%20quadratique.ipynb)" ] } ], "metadata": { "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.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }