{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from IPython.display import HTML\n", "from ipywidgets import interact\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "Le code de ce notebook est caché pour faciliter la lecture. \n", "Pour afficher le code, cliquez ici." ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HTML('''\n", "Le code de ce notebook est caché pour faciliter la lecture. \n", "Pour afficher le code, cliquez ici.''')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Suites de fonctions: Exemples et contre-exemples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Les normes $L^p$ sur $C^0([0,1])$ ne sont pas équivalentes\n", "\n", "Si elles l'étaient, toute suite de $C^0([0,1])$ convergente pour la norme\n", "\n", "$$\\|f\\|_p = \\left( \\int_0^1 |f(t)|^p dt \\right)^{\\frac 1p}$$\n", "\n", "serait aussi convergente pour tout autre norme $\\|f\\|_q$. Mais ce n'est pas le cas. Prenons un paramètre $a > 0$ et définissons la suite de fonctions\n", "\n", "$$f_{n}^{a}(x) = \n", "\\begin{cases}\n", "n^a (1-nx) \\text{ si } x \\in [0, \\frac 1n] \\\\\n", "0 \\text{ si } x \\in [\\frac 1n, 1]\n", "\\end{cases}\n", "$$\n", "\n", "Ci-dessous le graphe de $f_{n}^{a}$ pour différentes valeurs de $n$ et $a$, et la norme $\\|f_{n}^a\\|_p$:\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "98071b70184f47a29de3b620c597a0f8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='a', max=1.0), IntSlider(value=50, description='n', m…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "from ipywidgets import interact\n", "%matplotlib inline\n", "\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from math import pi\n", "\n", "from math import pi\n", "\n", "def f1(x,a,n):\n", " x = np.atleast_1d(x)\n", " f = np.zeros(len(x))\n", " for i, x_i in enumerate(x):\n", " if x_i<1/n:\n", " f[i] = (n**a)*(1-n*x_i)\n", " else:\n", " f[i] = 0\n", " return f\n", "\n", "\n", "\n", "def update_plot(a,n,p):\n", " X = np.linspace(0,1,500)\n", " norme=n**(a*p-1)/(p+1)\n", " fig, ax= plt.subplots(figsize=(15, 5))\n", " ax.set_ylim([-0.1, n**a])\n", " ax.set_xlim([0, 1])\n", " plt.plot(X,f1(X, a,n),'b')\n", " plt.title(r'Graphe et norme $L^p$ de $f_n^a$: $||f_n^a||_p$={}'.format(norme ))\n", " plt.show()\n", "\n", "\n", "interact ( update_plot, n=(1,100,1), a=(0,1,0.1), p=(1,20,0.5) )\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ci dessous, le graphe de la fonction $|f_n^a|^p$ (i.e, celle qu'on intère pour obtenir la norme $L^p$ de $f_n^a$) :" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "29c1720acfcd41b394492956c0990a83", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=0.0, description='a', max=1.0), IntSlider(value=50, description='n', m…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "from ipywidgets import interact\n", "%matplotlib inline\n", "\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from math import pi\n", "\n", "from math import pi\n", "\n", "def fp(x,a,n,p):\n", " x = np.atleast_1d(x)\n", " f = np.zeros(len(x))\n", " for i, x_i in enumerate(x):\n", " if x_i<1/n:\n", " f[i] = (n**(a*p))*((1-n*x_i)**p)\n", " else:\n", " f[i] = 0\n", " return f\n", "\n", "\n", "\n", "def update_plot(a,n,p):\n", " X = np.linspace(0,1,500)\n", " norme=n**(a*p-1)/(p+1)\n", " fig, ax= plt.subplots(figsize=(15, 5))\n", " ax.set_ylim([-0.1, n**a])\n", " ax.set_xlim([0, 2/(n+1)])\n", " plt.plot(X,fp(X, a,n,p),'c')\n", " plt.title(r'Graphe et norme $L^p$ de $f_n^a$: $||f_n^a||_p$={}'.format(norme ))\n", " plt.show()\n", "\n", "\n", "interact ( update_plot, n=(1,100,1), a=(0,1,0.1), p=(1,20,0.5) )\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On montre, par un calcul rapide, que dans le cas général,\n", "\n", "$$\n", "\\|f_{n}^a\\|_p = \\frac{n^{ap-1}}{p+1}\n", "$$\n", "\n", "et tend vers 0 quand $n\\rightarrow \\infty$ si, et seulement si, $a < \\frac 1p$. \n", "\n", "Donc, si $p\\neq q$, mettons $p>q$, alors $\\frac 1p < \\frac 1q$ et, pour tout $a \\in ] \\frac 1p, \\frac 1q[$, la suite $(f_{n}^a)_n$ de $C^0([0,1])$ converge pour $\\|.\\|_q$, mais pas pour $\\|.\\|_p$. Ces deux normes ne sont donc pas équivalentes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparaison des normes $\\|.\\|_\\infty$ et $\\|.\\|_1$ sur $C^0([-1,1])$\n", "\n", "On peut se demander si les normes\n", "$$\n", "\\|f\\|_\\infty= \\max_{[-1,1]} |f(x)|\n", "$$\n", "et la norme \n", "$$\n", "\\|f\\|_1 = \\inf_{-1}^1 |f(t)|dt\n", "$$ \n", "sont équivalentes sur $C^0([-1,1])$.\n", "\n", "On montre par le calcul que, pour toute $f\\in C^0([-1,1])$, \n", "$$\\|f\\|_1 \\leq 2 \\|f\\|_\\infty$$\n", "\n", "En revanche, quel que soit $c>0$, on n'a pas\n", "$$ \\|f\\|_\\infty \\leq c \\|f\\|_1$$\n", "pour tout $f\\in C^0([-1,1])$. \n", "\n", "En effet, on peut considérer des fonctions \"pointues\", dont l'intégrale est bornée, mais dont le max est très grand: par exemple\n", "\n", "$$f_{n}(x) = \n", "\\begin{cases}\n", "n(1+nx) \\text{ si } x \\in [-\\frac 1n, 0] \\\\\n", "n (1-nx) \\text{ si } x \\in [0, \\frac 1n] \\\\\n", "0 \\text{ si } x \\geq \\frac 1n \\text{ ou } x \\leq -\\frac 1n\n", "\\end{cases}\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c21fe1375cd0475585032fc8290f0c30", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=25, description='n', max=50, min=1), Output()), _dom_classes=('widget-in…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "from ipywidgets import interact\n", "%matplotlib inline\n", "\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from math import pi\n", "\n", "from math import pi\n", "\n", "def f2(x,n):\n", " x = np.atleast_1d(x)\n", " f = np.zeros(len(x))\n", " for i, x_i in enumerate(x):\n", " if x_i<-1/n:\n", " f[i] = 0\n", " elif -1/n < x_i <=0:\n", " f[i]=n*(1+n*x_i)\n", " elif 0 < x_i <=1/n:\n", " f[i]=n*(1-n*x_i)\n", " else:\n", " f[i] = 0\n", " return f\n", "\n", "\n", "\n", "def update_plot(n):\n", " X = np.linspace(-1,1,500)\n", " fig, ax= plt.subplots(figsize=(15, 5))\n", " ax.set_ylim([-0.1, 51])\n", " ax.set_xlim([-1.1, 1.1])\n", " plt.plot(X,f2(X,n),'b')\n", " \n", " ax.fill_between(X, 0, f2(X,n))\n", " plt.title(r'Graphe de $f_n$; normes $||f_n||_1 = 1$, $||f_n||_\\infty = {}$'.format(n ))\n", "\n", "\n", " plt.show()\n", " print('Pour n assez grand, la norme infinie de fn est plus grande que c')\n", "\n", "\n", "interact ( update_plot, n=(1,50,1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Incomplétude de $(C^0([-1,1]), \\|.\\|_1) $\n", "\n", "On montre que $(C^0([-1,1]), \\|.\\|_1) $ n'est pas complet en exhibant une suite de Cauchy pour $ \\|.\\|_1$ qui ne converge pas dans $(C^0([-1,1])$. \n", "\n", "Pour cela, on trouve une suite de fonctions, toutes continues, mais qui deviennent de plus en plus \"raides\": à l'infini, on se retrouve avec un \"saut\" en 0, donc cette suite \"converge\", mais sa limite n'est pas continue. Donc elle ne converge pas dans $(C^0([-1,1]), \\|.\\|_1) $, mais elle est de Cauchy puisque les termes de la suite se rapprochent tous de la même fonction discontinue, donc se rapprochent entre eux.\n", "\n", "Considérons donc une suite de fonctions affines par morceaux, dont la pente est de plus en plus grande:\n", "$$\n", "f_n(x)=\n", "\\begin{cases}\n", "-1 \\text{ si } x \\leq -\\frac 1n \\\\\n", "nx \\text{ si } -\\frac 1n \\leq x \\leq \\frac 1n \\\\\n", "1 \\text{ si } x \\geq \\frac 1n \n", "\\end{cases}\n", "$$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "76d1e6e90c784f469dddbeec6ea0fec3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=25, description='n', max=50, min=1), Output()), _dom_classes=('widget-in…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "from ipywidgets import interact\n", "%matplotlib inline\n", "\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from math import pi\n", "\n", "from math import pi\n", "\n", "def f3(x,n):\n", " x = np.atleast_1d(x)\n", " f = np.zeros(len(x))\n", " for i, x_i in enumerate(x):\n", " if x_i<-1/n:\n", " f[i] = -1\n", " elif -1/n < x_i < 1/n:\n", " f[i]=n*x_i\n", " else:\n", " f[i] = 1\n", " return f\n", "\n", "\n", "\n", "def update_plot(n):\n", " X = np.linspace(-1,1,500)\n", " fig, ax= plt.subplots(figsize=(15, 5))\n", " ax.set_ylim([-1.1, 1.1])\n", " ax.set_xlim([-1.1, 1.1])\n", " plt.plot(X,f3(X,n),'b')\n", " \n", " \n", " plt.title(r'Graphe de $f_n$')\n", "\n", "\n", " plt.show()\n", "\n", "\n", "interact ( update_plot, n=(1,50,1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette suite est de Cauchy: on montre par le calcul que pour tous $p, q \\in \\mathbb N^*$\n", "$$||f_{p+q}- f_p ||_1 \\leq \\frac 1p$$\n", "Sur le graphique:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "21bbd56934dd4387a5ed1fbfba89dbf7", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(IntSlider(value=50, description='p', min=1), IntSlider(value=7, description='q', max=15)…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "from ipywidgets import interact\n", "%matplotlib inline\n", "\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from math import pi\n", "\n", "from math import pi\n", "\n", "def f(x,n):\n", " x = np.atleast_1d(x)\n", " f = np.zeros(len(x))\n", " for i, x_i in enumerate(x):\n", " if x_i<-1/n:\n", " f[i] = -1\n", " elif -1/n < x_i < 1/n:\n", " f[i]=n*x_i\n", " else:\n", " f[i] = 1\n", " return f\n", "\n", "\n", "\n", "def update_plot(p,q):\n", " X = np.linspace(-1,1,500)\n", " fig, ax= plt.subplots(figsize=(15, 5))\n", " ax.set_ylim([-1.1, 1.1])\n", " ax.set_xlim([-1.1/p, 1.1/p])\n", " plt.plot(X,f(X,p),'b')\n", " plt.plot(X,f(X,p+q),'r')\n", " ax.fill_between(X, f(X,p), f(X,p+q))\n", " \n", " diffarea=q/(p*(p+q))\n", " plt.title(r' $||f_p - f_q||_1$={}'.format(diffarea ))\n", "\n", "\n", " plt.show()\n", "\n", "\n", "interact ( update_plot, p=(1,100,1), q=(0,15,1))\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mais, comme on l'a dit, sa \"limite\" n'est pas dans $C^0([-1,1])$, qui n'est donc pas complet pour la norme $\\|.\\|_1$. \n", "\n", "En revanche, il l'est pour la norme $\\|.\\|_\\infty$. L'idée est que la convergence d'une suite de fonctions avec $\\|.\\|_\\infty$ n'est autre que la convergence uniforme pour les fonctions, et une limite uniforme de fonctions continues étant continue, on n'a pas le problème posé par la norme 1. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "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.2" } }, "nbformat": 4, "nbformat_minor": 2 }