{ "cells": [ { "cell_type": "markdown", "id": "291e9ef6-7742-47c1-9540-5b131202e59f", "metadata": {}, "source": [ "# MT94/P25/TD1 - Approximation d'une dérivée et pas complexe" ] }, { "cell_type": "markdown", "id": "4ff19b6e-0e87-4862-9cd0-985d5a9a0d08", "metadata": {}, "source": [ "
\"graph\"\n", "
" ] }, { "cell_type": "markdown", "id": "07d9001e-ade1-40e5-a6a1-6723c63890c2", "metadata": {}, "source": [ "Graphe d'une fonction $f:\\mathbb{R}\\rightarrow \\mathbb{R}$ (en gras)\n", "et de la partie réelle de son extension complexe" ] }, { "cell_type": "markdown", "id": "76e3aaa4-56fa-4e26-a03e-f2059eb2a6b1", "metadata": {}, "source": [ "## Approximation basée sur des différences finies" ] }, { "cell_type": "markdown", "id": "2d0f5bf4-276c-401e-b23d-e135309a681c", "metadata": {}, "source": [ "On considère la fonction $x\\rightarrow f(x)$ calculée par la fonction\n", "Scilab suivante :" ] }, { "cell_type": "code", "execution_count": null, "id": "a1b3cef4-1a8b-42f3-8a23-53c47ef797f2", "metadata": {}, "outputs": [], "source": [ "function y7 = f(x)\n", " y1 = exp(x); \n", " y2 = cos(x);\n", " y3 = sin(x);\n", " y5 = y2.^3;\n", " y6 = y3.^3;\n", " y7 = y1./(y5+y6);\n", "end" ] }, { "cell_type": "markdown", "id": "a0d45678-6a59-4513-b92e-1d5fb25b0b16", "metadata": {}, "source": [ "1. Tracer le graphe de $f$ sur $[-\\pi/5,\\pi/2]$ avec Scilab." ] }, { "cell_type": "code", "execution_count": null, "id": "db19abac-1ade-43e2-8938-2be270945209", "metadata": {}, "outputs": [], "source": [ "x = linspace(-%pi/5,%pi/2,500);\n", "plot(x,f(x))" ] }, { "cell_type": "markdown", "id": "034727d9-800e-4c93-ba6e-ef0463ea8fa6", "metadata": {}, "source": [ "2. Vérifier que $\\displaystyle f(x)=\\frac{\\exp(x)}{\\cos^3 x+\\sin^3 x}\\cdot$, puis calculer sa dérivée \\\"à la main\\\" ou en utilisant Wolfram Alpha (https://www.wolframalpha.com)." ] }, { "cell_type": "markdown", "id": "8283959c-a47d-4fe4-a932-264edfe23a0b", "metadata": {}, "source": [ "On a\n", "$$\n", "f'(x)=\\exp(x)\\frac{3\\sin x+\\sin 3x+2\\cos 3x}{2(\\sin^3 x+\\cos^3 x)^2}\n", "$$" ] }, { "cell_type": "code", "execution_count": null, "id": "004b4200-1928-4725-9b46-0a678b0881e8", "metadata": {}, "outputs": [], "source": [ "function d=fprime(x)\n", " d=exp(x).*(3*sin(x)+sin(3*x)+2*cos(3*x))./(2*(sin(x).^3+cos(x).^3).^2)\n", "endfunction" ] }, { "attachments": {}, "cell_type": "markdown", "id": "6f219644-530d-4b8a-82dd-23124b868280", "metadata": {}, "source": [ "3. On considère une approximation de la dérivée de $f$ pour\n", " $x_0\\in\\mathbb{R}$ par la fonction\n", " $D_1:[-\\pi/5,\\pi/2]\\times \\mathbb{R}\\rightarrow \\mathbb{R}$ définie\n", " par $$D_1(x_0,h)=\\frac{f(x_0+h)-f(x_0)}{h}\\cdot$$ Soit $x_0=\\pi/4$,\n", " écrire un programme Scilab permettant de vérifier que :\n", " \n", " - pour $h$ suffisamment petit (mais pas trop), $D_1(x_0,h)$ est une approximation d'ordre 1 de $f'(x_0)$, c'est à dire que $f'(x_0)-D_1(x_0,h)=O(h)$ (un infiniment petit d'ordre 1). Pour cela on pourra tracer le graphe de l'erreur relative $$E_1(h)=\\left \\vert \\frac{f'(x_0)-D_1(x_0,h)}{f'(x_0)} \\right\\vert$$ pour des valeurs entre $10^ {-20}$ et $10^{-1}$. L'utilisation de l'échelle logarithmique est recommandée (voir https://help.scilab.org/plot).\n", "\n", " - il existe une valeur optimale $h^*$ telle que $$\\forall h\\in\\mathbb{R},\\;E_1(h^*) \\leq E_1(h),$$ pour laquelle la précision relative maximale (donnée par `%eps`) n'est pas atteinte par $E_1(h^*) $,\n", " - si $h$ est trop petit la précision relative obtenue est à peu près aussi mauvaise que pour un $h$ trop grand." ] }, { "cell_type": "code", "execution_count": null, "id": "ee61a644-99b8-4025-aa04-ea13a620a7cf", "metadata": {}, "outputs": [], "source": [ "x0 = %pi/4;\n", "h = 2.^(-66:0.25:-1); \n", "E1 = abs(((f(x0+h)-f(x0))./h - fprime(x0))/fprime(x0));\n", "plot(\"ll\",h,E1)\n", "xlabel(\"h\")\n", "ylabel(\"E1(h)\")\n", "isoview on" ] }, { "cell_type": "markdown", "id": "d982da01-6ce4-4384-972b-69b07fba662b", "metadata": {}, "source": [ "4. Refaire l'analyse de la question précédente en considérant les deux premières formules centrées (https://en.wikipedia.org/wiki/Finite_difference_coefficient)" ] }, { "cell_type": "code", "execution_count": null, "id": "a2ea8bb1-89cc-4dd5-841d-95be16a4f1ed", "metadata": {}, "outputs": [], "source": [ "E2 = abs(((f(x0+h)-f(x0-h))./h/2 - fprime(x0))/fprime(x0));\n", "E3 = abs(((-1/12*f(x0+2*h)+2/3*f(x0+h)-2/3*f(x0-h)+1/12*f(x0-2*h))./h - fprime(x0))/fprime(x0));\n", "plot(\"ll\",h,E1,h,E2,h,E3)\n", "xlabel(\"h\")\n", "legend(\"E1(h)\",\"E2(h)\",\"E3(h)\",-1)\n", "isoview on" ] }, { "cell_type": "markdown", "id": "c2a14d9e-e6a2-4271-9025-1395677ede4b", "metadata": {}, "source": [ "## Méthode du pas complexe" ] }, { "cell_type": "markdown", "id": "3a62a1e3-c906-48ae-9726-56a11588c94e", "metadata": {}, "source": [ "On considère $F:\\mathbb{C}\\rightarrow\\mathbb{C}$ l'extension de $f$ au plan complexe définie par\n", "$$\n", "F(z) = \\frac{\\exp(z)}{\\cos^3 z+\\sin^3 z}\\cdot\n", "$$" ] }, { "cell_type": "markdown", "id": "da848e09-08a4-46bc-aa9d-2f3dd7a26c17", "metadata": {}, "source": [ "1. Vérifier que la fonction Scilab calculant $f(x)$ pour $x$ réel accepte sans problème un argument d'entrée complexe." ] }, { "cell_type": "code", "execution_count": null, "id": "5b2af172-9912-40fc-83da-93c8c0f31c80", "metadata": {}, "outputs": [], "source": [ "f(x0+%i)" ] }, { "cell_type": "markdown", "id": "6d0849de-0ffc-4283-924d-eb68434f8c5a", "metadata": {}, "source": [ "2. Représenter dans l'espace le graphe de la fonction $(x,y)\\rightarrow \\operatorname{Re}(F(x+iy))$ sur $[-\\pi/5,\\pi/2]\\times[-1/2,1/2]$ ainsi que la courbe $x\\rightarrow (x,0,f(x))$ pour $x\\in[-\\pi/5,\\pi/2]$. Comment proposeriez-vous de représenter l'argument sur le même graphe ? Proposez d'autres modes de représentation (le but est de générer la figure du début du TD pour le type de représentation demandé, pour cela la ligne à ajouter à la fin du code Scilab ci-dessous est la suivante :\n", "```\n", "xs2svg(0,\"absF_and_f.svg\")\n", "```" ] }, { "cell_type": "code", "execution_count": null, "id": "dc2fb96b-3b0f-4f5c-8ee7-d606ac34e5f5", "metadata": {}, "outputs": [], "source": [ "x = linspace(-%pi/5,%pi/2,41);\n", "y = linspace(-0.5,0.5,41);\n", "[X,Y] = meshgrid(x,y);\n", "c = param3d(x,0*x,f(x)+0.01);\n", "c.foreground = color('red');\n", "c.thickness = 4;\n", "mesh(X,Y,real(f(X+%i*Y)))\n", "xlabel(\"$x$\")\n", "ylabel(\"$y$\")\n", "zlabel(\"$z$\")\n", "xs2svg(0,\"absF_and_f.svg\")" ] }, { "cell_type": "markdown", "id": "c069e4d0-c254-4450-a068-c0a31decbf8a", "metadata": {}, "source": [ "3. On considère l'approximation de la dérivée de $f$ pour $x_0\\in\\mathbb{R}$ par la fonction $D_c:[-\\pi/5,\\pi/2]\\times \\mathbb{R}\\rightarrow \\mathbb{R}$ définie par\n", "$$\n", "D_c(x_0,h)=\\frac{\\operatorname{Im} (F(x_0+ih))}{h}\\cdot\n", "$$" ] }, { "cell_type": "code", "execution_count": null, "id": "b82643f6-47a5-4e23-8460-ca8a8e4e8835", "metadata": {}, "outputs": [], "source": [ "function d=Dc(x0,h)\n", " d=imag(f(x0+%i*h))./h;\n", "end" ] }, { "cell_type": "markdown", "id": "8fd797cc-d811-4384-b20d-0c10380cca32", "metadata": {}, "source": [ "et\n", "$$\n", "E_c(h)=\\left \\vert \\frac{f'(x_0)-D_c(x_0,h)}{f'(x_0)} \\right\\vert\n", "$$\n", "\n", "Soit $x_0=\\pi/4$, écrire un programme Scilab permettant de vérifier que :\n", "- pour $h$ suffisamment petit (mais pas trop), $D_c(x_0,h)$ est une approximation d'ordre 2 de $f'(x_0)$, c'est à dire que $f'(x_0,h)-D_c(x_0,h)=O(h^2)$ (un infiniment petit d'ordre 2).\n", "- il existe une valeur $\\hat h$ telle que $$\\forall h < \\hat h,\\;E_c(h) \\approx \\delta $$ où $\\delta$\n", "est d'une magnitude (puissance de 10) du même ordre que celui de la précision relative de Scilab." ] }, { "cell_type": "code", "execution_count": null, "id": "e92bbd37-feb6-4572-8c46-5c8f73fd8821", "metadata": {}, "outputs": [], "source": [ "Ec = abs( (Dc(x0,h) - fprime(x0)) / fprime(x0));\n", "plot(\"ll\",h,E1,h,E2,h,Ec)\n", "xlabel(\"h\")\n", "legend(\"E1(h)\",\"E2(h)\",\"EC(h)\",-1);\n", "isoview on" ] }, { "cell_type": "markdown", "id": "c3e4d127-3a2b-43d2-b763-367943dff8c4", "metadata": {}, "source": [ "4. Calculer et représenter l'approximation de la dérivée de $f$ sur tout son domaine de définition (le plus simplement possible)." ] }, { "cell_type": "code", "execution_count": null, "id": "46897c50-e573-4fc6-b326-70adfeedce83", "metadata": {}, "outputs": [], "source": [ "x = linspace(-%pi/5,%pi/2,500);\n", "fp = fprime(x);\n", "h = 2^-100;\n", "fpc = imag(f(x+%i*h)/h);\n", "subplot(1,3,1)\n", "plot(x,fp)\n", "title(\"fprime(x)\")\n", "subplot(1,3,2)\n", "plot(x,fpc,\"r\")\n", "title(\"imag(f(x+%i*h)/h)\")\n", "subplot(1,3,3)\n", "plot(\"nl\",x,abs((fp-fpc)./fpc))\n", "title(\"erreur relative\")\n", "gcf().axes_size(1)=800;" ] } ], "metadata": { "kernelspec": { "display_name": "Scilab", "language": "scilab", "name": "scilab" }, "language_info": { "file_extension": ".sci", "help_links": [ { "text": "MetaKernel Magics", "url": "https://metakernel.readthedocs.io/en/latest/source/README.html" } ], "mimetype": "text/x-scilab", "name": "scilab", "version": "0.10.2" } }, "nbformat": 4, "nbformat_minor": 5 }