{ "cells": [ { "cell_type": "markdown", "id": "066d4f2e-5eba-4304-b6ac-7a5c53f98832", "metadata": {}, "source": [ "Notebook Jupyter UTC MT12 \n", "$$ \\text{UTC MT12} \\quad \\quad \\text{TP} 2 $$\n", "###### Cette cellule est une cellule Markdown" ] }, { "cell_type": "markdown", "id": "fa2bf806-cdc1-4a32-aa38-77d951f4ff25", "metadata": {}, "source": [ "Dans ce TP, on considère l'espace des fonctions continues sur $[-1,1]$ à valeurs dans $\\mathbb{R},$ noté $\\mathcal{H} = C^0([-1,1];\\mathbb{R})$, muni du produit scalaire $$\\langle f,g \\rangle = \\int_{-1}^1 f(t) g(t)\\, dt,\\qquad f,g\\in \\mathcal{H},$$ et la norme associée $\\|f\\|=\\sqrt{\\langle f,f \\rangle}$.\n", "\n", "Le but de cette séance est d'introduire une famille de polynôme orthogonaux, les polynômes de Legendre notés $(P_k)_{k\\ge 0}$, qui forme une famille totale de $\\mathcal{H}$, i.e., $(P_k)_{k\\ge 0}$ engendre un sous-espace vectoriel dense dans $\\mathcal{H}$. Plus précisément, pour toute fonction $f \\in \\mathcal{H}$, pour tout $\\varepsilon > 0$, il existe $n \\in \\mathbb{N}$ et $a_{f,0}, \\ldots, a_{f,n} \\in \\mathbb{R}$ tels que $$\\begin{array}{1} \\left|\\left|f - \\sum_{k=0}^n a_{f,k} P_k \\right|\\right| \\leq \\varepsilon. \\end{array}$$ \n", "\n", "Intuitivement, on peut voir les polynômes $(P_k)_{k \\geq 0}$ comme une ``base'' de $\\mathcal{H}$. Il faut faire cependant attention, car ici $\\mathcal{H}$ est de dimension infinie. La notion de famille totale généralise la notion de base algébrique d'un espace vectoriel de dimension finie. Nous allons voir dans cette séance des applications pratiques de cette notion de famille totale. " ] }, { "cell_type": "markdown", "id": "82ac1981-08cf-4965-a2a0-938580b9172a", "metadata": {}, "source": [ "#### Plan \n", "[1. Exercice préliminaire : récursivité](#1.-Exercice-préliminaire-récursivité)\n", "\n", "[2. Polynômes de Legendre](#2.-Polynômes-de-Legendre)" ] }, { "cell_type": "markdown", "id": "d6245769-e438-448d-b2f1-f8fae9850ac5", "metadata": {}, "source": [ "# 1. Préliminaire : récursivité" ] }, { "cell_type": "markdown", "id": "bfc1bad9-413c-42d9-83ac-7690a4f0dadc", "metadata": {}, "source": [ "## 1.1 Suite récurrente" ] }, { "cell_type": "markdown", "id": "e082528b-7e0a-4aee-a8ab-834cb74a2fc5", "metadata": {}, "source": [ "On a vu dans le TP1 comment coder une suite définie par un terme général. Lorsqu'une suite est définie à partir d'une formule de récurrence, pour la coder, il faut utiliser *la récursivité*, c'est à dire, \n", "\n", " * (a) définir un terme de départ. \n", " * (b) définir un terme en fonction du précédent. " ] }, { "cell_type": "markdown", "id": "fe9fb0dd-82b9-4fec-989d-1872aba34661", "metadata": {}, "source": [ "Exemple : fonction \"SUITE\" qui implémente la suite $(U_n)_{n \\geq 1}$ définie par récurrence comme suit : $$ \\left\\lbrace \\begin{array}{l} U_1 = 1,\\\\ U_{n+1} = \\frac{U_n}{2}. \\end{array} \\right.$$" ] }, { "cell_type": "code", "execution_count": null, "id": "1d4f8009-607e-4548-ac25-50a80f67540e", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "def SUITE (n):\n", " if n < 1:\n", " return('la valeur de n est incorrecte') \n", " elif n == 1:\n", " return(1)\n", " else:\n", " return(SUITE(n-1)/2)\n" ] }, { "cell_type": "markdown", "id": "9d1bced5-68be-47ad-b425-6bf5da14cdc2", "metadata": {}, "source": [ "**Note importante**\n", "\n", "Si l'argument d'entrée (\"input\") de la fonction est un nombre négatif, par exemple $-3$, il faut s'assurer que votre fonction va renvoyer un message d'erreur. Sinon, la machine va chercher à calculer SUITE(-4), qui elle-même va chercher à calculer SUITE(-5), etc, et ne va jamais s'arrêter. Il faut dont s'assurer que la condition d'arrêt (calcul de $U_1$) est bien satisfaite à un moment donné quand on écrit une fonction récursive." ] }, { "cell_type": "markdown", "id": "dad6ebca-9d0c-4d90-abce-06add9d0ee70", "metadata": {}, "source": [ "## 1.2 Questions \n", "\n", "###### Cette cellule est une cellule Markdown " ] }, { "cell_type": "markdown", "id": "47791b15-89f3-4f38-b66d-9ecc696f2f0b", "metadata": {}, "source": [ "### Q1 Ecrire une fonction qui code \n", "\n", "$$\\left\\{ \\begin{array}{l} U_0 = 1,\\\\ U_{n+1} = U_n + 1. \\end{array} \\right. $$" ] }, { "cell_type": "markdown", "id": "811dd969-ce48-4883-95c1-50061e31e207", "metadata": {}, "source": [ "### Q2 Écrire une fonction qui code la suite de Fibonacci \n", "\n", "$$\\left\\lbrace \\begin{array}{l} U_0 = 0,\\\\ U_1 = 1,\\\\ U_{n+2} = U_{n+1} + U_n. \\end{array} \\right.$$" ] }, { "cell_type": "markdown", "id": "c9fc5bed-c706-4d6d-ab89-86724645f39d", "metadata": {}, "source": [ "### Q3 Écrire une fonction qui code la suite de fonctions \n", "\n", "$$\\left\\lbrace \\begin{array}{l} f_0(x) = x,\\\\ f_{n+1}(x) = x \\cdot f_n(x) \\end{array} \\right.$$\n", "L' argument d'entrée de votre fonction est donc la paire $(n,x)$ ou $(x,n)$." ] }, { "cell_type": "markdown", "id": "6f01ce21-a297-4d8a-bd7e-c7ff93665368", "metadata": {}, "source": [ "### Q4 \n", "\n", "* Quelle est cette suite de fonctions ? \n", "* Représenter graphiquement les trois premiers termes de cette suite de fonctions sur l'intervalle $[-1,1]$." ] }, { "cell_type": "markdown", "id": "7f4f3754-37ae-4b3a-9793-dba2515dfd90", "metadata": {}, "source": [ "# 2. Polynômes de Legendre" ] }, { "cell_type": "markdown", "id": "7a2eb135-a8f5-41d5-810f-13891f36bb1b", "metadata": {}, "source": [ "## 2.1. Introduction" ] }, { "cell_type": "markdown", "id": "7119b2b2-ba63-4dcb-892b-765a437ff675", "metadata": {}, "source": [ "Les polynômes de Legendre sont des polynômes solutions sur l'intervalle $[-1,1]$ de l'équation différentielle suivante :\n", "\n", "$${\\displaystyle {\\frac {\\textrm {d}}{{\\textrm {d}}x}}\\left[(1-x^{2}){\\frac {{\\textrm {d}}P_{n}(x)}{{\\textrm {d}}x}}\\right]+n(n+1)\\,P_{n}(x)=0,\\qquad P_{n}(1)=1.}$$ \n", "\n", "Pour tout entier $n\\geq 1$ et pour $x\\in [-1,1]$, partant de $P_0(x)=1$, $P_1(x)=x$, on peut démontrer la formule de récurrence $$(n+1)\\,P_{n+1}(x)=(2n+1)\\,x\\,P_{n}(x)-n\\,P_{n-1}(x)\\qquad (2)$$ " ] }, { "cell_type": "markdown", "id": "9547516e-147f-41d9-9f06-44898df11101", "metadata": {}, "source": [ "Les polynômes de Legendre sont deux à deux orthogonaux (mais pas orthonormés) pour le produit scalaire dans $\\mathcal{H}$, et on montre que \n", "$$\\langle P_n,P_m\\rangle = \\int _{-1}^{1}P_{m}(x)P_{n}(x)\\,dx={2 \\over {2n+1}}\\,\\delta _{mn},\\qquad (3)$$\n", "où\n", "$\\delta$ désigne le symbole de Kronecker." ] }, { "cell_type": "markdown", "id": "89ce7b84-167a-400b-9394-ad2e04e1da47", "metadata": {}, "source": [ "**Remarques**\n", "\n", "* La famille $(P_k/\\|P_k \\|)_k$ est donc orthonormée dans $\\mathcal{H}$. \n", "\n", "* On peut montrer que c'est une \"base\" (famille totale ) de $\\mathcal{H}$. \n", "\n", "* Les polynômes $P_{2p}$ sont des fonctions paires tandis que les polynômes $P_{2p+1}$ sont des fonctions impaires. " ] }, { "cell_type": "markdown", "id": "07889d4a-48fc-4c6d-a76d-7d5257c662e3", "metadata": {}, "source": [ "## 2.2 Questions \"Polynômes de Legendre\"" ] }, { "cell_type": "markdown", "id": "a60a8e0f-7c1e-4ff4-8cba-4691f02bcbb4", "metadata": {}, "source": [ "### Q5 Calculer à la main les six premiers polynômes de Legendre et vérifier que \n", "$$\\begin{array}{l}P_2(x) = \\frac{3}{2}x^2-\\frac{1}{2},\\\\ P_3(x) = \\frac{5}{2}x^3 - \\frac{3}{2}x, \\\\ P_{{4}}(x)={\\frac {1}{8}}\\left( 35x^{{4}}-30x^{{2}}+3 \\right),\\\\ P_{{5}}(x)={\\frac {1}{8}} \\left( 63x^{{5}}-70x^{{3}}+15x \\right),\\\\ P_{{6}}(x)={\\frac {1}{16}}\\left( 231x^{{6}}-315x^{{4}}+105x^{{2}}-5 \\right)\\end{array}$$" ] }, { "cell_type": "markdown", "id": "cd8e3b4b-c97b-4d7b-b15b-73592e23ed2d", "metadata": {}, "source": [ "### Q6 Écrire une fonction qui code les polynômes de Legendre de degré $n$ au moyen de la formule de récurrence (2). \n", "\n", "Cette fonction a pour argument d'entrée le couple $(n,x)$. " ] }, { "cell_type": "markdown", "id": "07a2cf69-cf51-451f-b1af-788dd17c13af", "metadata": {}, "source": [ "## 2.3 Questions \"Meilleure approximation de la fonction $f :x \\in [-1,1] \\mapsto \\exp(-x)$\"" ] }, { "cell_type": "markdown", "id": "acdbc6e7-2852-434a-b198-9b99dc20adf3", "metadata": {}, "source": [ "Dans cette section, on cherche à détemriner la meilleure approximation de la fonction $f :x \\in [-1,1] \\mapsto \\exp(-x)$ sur le sous-espace vectoriel engendré par les polynômes de Legendre de degré inférieur à $n$. Remarquons que $f \\in \\mathcal{H}$. \n", "\n", "Plus précisément, en reprenant les notations du Chapitre $2$, si on note $\\mathcal{P}_n = \\operatorname{Vect}\\left\\langle P_0,\\ldots,P_n \\right\\rangle \\subset \\mathcal{H}$, on cherche un polynôme $P$ de $\\mathcal{P}_n$ réalisant la meilleure approximation de $f$ dans $\\mathcal{P}_n$. Autrement dit, on cherche un polynôme $P \\in \\mathcal{P}_n$ solution du problème de minimisation suivant $$\\|f-P\\| = \\min \\lbrace \\|f - Q \\|, \\, \\, Q \\in \\mathcal{P}_n \\rbrace$$ En reprenant les calculs du Chapitre $2$, on montre que l'unique polynôme, noté $\\pi_n f$, solution de ce problème est donné par la formule $$\\pi_n f(x) = \\sum_{k=0}^n a_{f,k}\\, \\dfrac{P_k(x)}{\\|P_k\\|},\\qquad \\text{avec} \\quad a_k:= a_{f,k}= \\langle f,\\dfrac{P_k}{\\|P_k\\|}\\rangle \n", "\\quad \\text{et}\\quad \\|P_k\\|=\\sqrt{\\langle P_k,P_k\\rangle}.$$" ] }, { "cell_type": "markdown", "id": "b95bf91e-dde3-4d31-8826-9428298204ee", "metadata": {}, "source": [ "#### On liste ci-dessous la valeur de $a=(a_0,a_1,a_2,a_3,a_4,a_5,a_6)$, \n", "$$\\begin{array}{lcl} a_0& =& \\sqrt{2}*\\sinh(1)\\\\ a_1& =& -\\frac{\\sqrt{6}}{\\exp(1)} \\\\ a_2& =& \\frac{\\exp(2)-7}{\\exp(1)}*\\sqrt{\\frac{5}{2}} \\\\ a_3 &=& \\frac{5*\\exp(2)-37}{\\exp(1)}*\\sqrt{\\frac{7}{2}}\\\\ a_4 &=& 3*\\sqrt{2}*\\frac{18*\\exp(2)-133}{\\exp(1)}\\\\ a_5 &=& \\frac{329*\\exp(2)-2431}{\\exp(1)}*\\sqrt{\\frac{11}{2}}\\\\ a_6 &=& \\frac{3655*\\exp(2)-27007}{\\exp(1)}*\\sqrt{\\frac{13}{2}}\\end{array}$$" ] }, { "cell_type": "markdown", "id": "640ae29f-3162-46a9-ae65-425abf5ba2d1", "metadata": {}, "source": [ "### Q7 Écrire une fonction \"approx\" qui, prend en entrée le triplet $(x,n,a)$ et qui renvoie $\\pi_n f(x)$" ] }, { "cell_type": "markdown", "id": "45003e35-3fbd-49e6-a1c2-d22e488824dd", "metadata": {}, "source": [ "### Q8 Écrire un script qui propose une vérification de l'inégalité de Bessel, à savoir \n", "$$\\|\\pi_6 f\\|^2 = \\sum_{k=0}^6 a_k^2 \\leq \\|f\\|^2.$$ \n", "\n", "Pour ce faire on calculera la valeur exacte de $\\|f\\|^2$." ] }, { "cell_type": "markdown", "id": "a47bed42-6671-48b5-ac8a-869e8c152a0c", "metadata": {}, "source": [ "### Q9 Considérer une discrétisation uniforme de l'intervalle $[-1,1]$ avec $400$ points, représenter graphiquement sur 3 graphiques distincts :\n", "1) les $7$ premiers polynômes de Legendre $P_k$,\n", "2) la fonction $x\\mapsto f(x)$ ainsi que $\\pi_6 f (x)$, la meilleure approximation de $f$ sur le sous-espace vectoriel engendré par les polynômes de Legendre de degré inférieur ou égal à $6$,\n", "3) la fonction d'erreur d'approximation définie ci-après,\n", " $$\\varepsilon(x) = f(x) - \\pi_6 f(x)$$" ] }, { "cell_type": "markdown", "id": "2aff8e3f-cf22-425e-aa23-06a48f6a8319", "metadata": {}, "source": [ "## 2.4 Questions \"Meilleure approximation de la fonction $g :x \\in[-1,1] \\mapsto |x|$" ] }, { "cell_type": "markdown", "id": "804c1138-f2f5-45e7-8f8a-9f7c03d98d6c", "metadata": {}, "source": [ "### Q10 On cherche désormais à déterminer la meilleurs approximation de la fonction $g :x \\in [-1,1] \\mapsto |x|$ sur le sous-espace vectoriel engendré par les polynômes de Legendre de degré inférieur à $n$. Remarquons que $g \\in \\mathcal{H}$. \n", "\n", "1) Déterminer à la main l'expression des $a_k$ pour cette fonction;\n", "\n", "2) Prouver que ces $a_k$ sont nuls pour k impair et simplifier l'expression pour les k pairs." ] }, { "cell_type": "markdown", "id": "6c9202cf-9e0d-45c7-951c-759a85943763", "metadata": {}, "source": [ "### Q11 Importer la librairie \"scipy.integrate\" \n", "1) utiliser la fonction fonction \"scipy.integrate.quad\" qui permet le calcul d'une integrale\n", "2) Créer une fonction \"$g_{coeff}$' qui, à partir de l'ordre $k$, retourne le coefficient $a_k$ " ] }, { "cell_type": "markdown", "id": "ffec3af1-ebda-4070-8f50-7629941819ca", "metadata": {}, "source": [ "### Q12 \n", "Sachant que $a_0 = 1/\\sqrt{2}$, $a_2 = \\sqrt{10}/8$ et $a_4 = -\\sqrt{2}/16$, vérifier que l'application \"$g_{coeff}$\" est correcte." ] }, { "cell_type": "markdown", "id": "6f150204-6f0e-4e67-a8b0-f1113362f970", "metadata": {}, "source": [ "### Q13 Représenter sur une même fenêtre graphique\n", "1) les polynômes $\\pi_n g$ pour $n=2$, $n=4$ et $n=6$,\n", "2) l'erreur d'approximation pour $n=2$, $n=4$ et $n=6$." ] }, { "cell_type": "markdown", "id": "72f7228b-a3ba-4720-b621-6748c58a8977", "metadata": {}, "source": [ "### Q14 Commenter la figure obtenue. Cette méthode d'approximation semble-t-elle converger rapidement ?" ] }, { "cell_type": "code", "execution_count": null, "id": "be557b69-9125-4dd5-a16d-7e677a9d59f1", "metadata": {}, "outputs": [], "source": [] } ], "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.12.2" } }, "nbformat": 4, "nbformat_minor": 5 }