{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Intégration - Méthode des rectangles\n", "\n", "> Découverte de l'algorithme des rectangles pour le calcul approché d'une intégrale\n", "\n", "- toc: true\n", "- badges: true\n", "- comments: false\n", "- categories: [maths, TS, algorithmique]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problématique" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On considère dans cette activité la fonction $f$ définie sur\n", "$[0 ;2]$ par $f (x) = 4 − x^2$ et $\\mathcal C$ sa courbe représentative dans\n", "un repère orthonormé.\n", "\n", "L'objectif de cette activité est de calculer l'aire du domaine délimité \n", "- d'une part par les droites d'équation $x=0$ et $x=2$\n", "- d'autre part par l'axe des asbcisses et la courbe $\\mathcal C$\n", "\n", "![](my_icons/img1.png)\n", "\n", "En d'autre termes, nous cherchons à déterminer l'aire hachurée en rouge sous la courbe $\\mathcal C$ pour $x$ compris entre 0 et 2." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## La méthode des rectangles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L’idée va être d’encadrer l’aire recherchée par deux aires que l’on peut calculer aisément. On utilise pour\n", "cela des figures très élémentaires : des rectangles. \n", "\n", "Nous allons calculer un minorant de l'aire en inscrivant des rectangles sous la courbe (voir rectangles rouges) et un majorant de l'aire en construisant des rectangles au dessus de la courbe (voir rectangles bleus).\n", "\n", "![](my_icons/img2.png)\n", "\n", "En effet, l'aire d'un rectangle est facile à calculer. Il suffit donc de faire la somme des aires de chacun des rectangles pour obtenir un encadrement de l'aire recherchée." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Rectangles inférieurs (rouges)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On cherche à déterminer l'aire du rectangle dont la base est située entre les abscisses $x$ et $x+dx$ (dx désignant la largeur de chaque rectangle) et dont la hauteur est telle que le rectangle soit situé juste sous la courbe $\\mathcal C$.\n", "\n", "Exprimer cette aire en fonction de $x$, $dx$ et la fonction $f$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# collapse\n", "\n", "# aireInf = dx * f(x+dx)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Rectangles supérieurs (bleus)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On cherche à déterminer l'aire du rectangle dont la base est située entre les abscisses $x$ et $x+dx$ (dx désignant la largeur de chaque rectangle) et dont la hauteur est telle que le rectangle soit situé juste au dessus de la courbe $\\mathcal C$.\n", "\n", "Exprimer cette aire en fonction de $x$, $dx$ et la fonction $f$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# collapse\n", "\n", "# aireSup = dx * f(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Le programme" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# On définit notre fonction f\n", "\n", "def f(x):\n", " return 4-x*x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compléter le programme ci-dessous dont le but est de calculer la somme des aires des rectangles sous la courbe (rouges) et la somme des aires des rectangles au dessus de la courbe (bleus)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Complétez l'algorithme\n", "\n", "def rectangles(xmin, xmax, n):\n", " dx=... # ... Largeur d'un rectangle\n", "\n", " sommeInf = ... # Aire des rectangles inférieurs\n", " sommeSup = ... # Aire des rectangles supérieurs\n", "\n", " # Traitement\n", "\n", " x=... # Bord gauche du rectangle considéré\n", " for i in range(...): # répéter ... fois\n", " sommeInf = ...\n", " sommeSup = ...\n", " x = ...\n", "\n", " return (sommeInf, sommeSup)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# collapse\n", "def rectangles(xmin, xmax, n):\n", " dx=(xmax - xmin) / n # ... Largeur d'un rectangle\n", "\n", " sommeInf = 0 # Aire des rectangles inférieurs\n", " sommeSup = 0 # Aire des rectangles supérieurs\n", "\n", " # Traitement\n", "\n", " x=xmin # Bord gauche du rectangle considéré\n", " for i in range(n): # Répéter n fois\n", " sommeInf = sommeInf + dx*f(x+dx)\n", " sommeSup = sommeSup + dx*f(x)\n", " x = x + dx\n", "\n", " return (sommeInf, sommeSup)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(4.4799999999999995, 6.08)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Votre calcul ici \n", "r = rectangles(0, 2, 5)\n", "r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quelle est l'incertitude commise par cet encadrement ?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.6000000000000005" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r[1]-r[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comment augmenter la précision de ce calcul et diminuer cette incertitude ? Modifier votre programme pour donner une valeur de l'aire sous la courbe d'une précision d'au moins 0,1" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Précision : 0.08000000000000007\n" ] }, { "data": { "text/plain": [ "(5.293199999999998, 5.373199999999998)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# collapse\n", "\n", "# On augmente le nb de rectangles\n", "# jusqu'à obtenir la précision souhaitée\n", "\n", "r = rectangles(0, 2, 100)\n", "print(\"Précision : \", r[1]-r[0])\n", "r" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modification de l'algorithme" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On souhaite à présent modifier le programme afin d'obtenir un encadrement avec une précision fixée au départ. Par exemple : obtenir un encadrement de l'aire sous la courbe avec une précision d'au moins 0,0001. Que faut-il modifier dans notre algorithme pour arriver à ce résultat ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ecrire un programme donnant un encadrement de l'aire avec une précision d'au moins 0,0001. \n", "\n", "Combien avez-vous utilisé de rectangles pour arriver à cette précision ?" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# collapse\n", "\n", "# On introduit une boucle tant que \n", "# pour obtenir la rpécision souhaitée :\n", "# on appelle la fonction rectangles en multipliant par 10\n", "# le nombre de rectangles à chaque nouvel appel\n", "\n", "def aire(xmin, xmax, prec):\n", " p = 1\n", " n=1\n", " while p > prec:\n", " n = 10*n\n", " r = rectangles(xmin, xmax, n)\n", " p = r[1] - r[0]\n", " return (r, n)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((5.33329333320509, 5.333373333205089), 100000)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "aire(0, 2, 0.0001)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Notation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On note l'aire sous la courbe que nous venons de calculer : $\\displaystyle \\int_0^2 4-x^2~ dx \\approx 5,3333$" ] } ], "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.8.2" } }, "nbformat": 4, "nbformat_minor": 1 }