{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9f13b60b",
   "metadata": {},
   "source": [
    "# Feuille d'exercices 9 -- avancé\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "```{admonition} Objectifs\n",
    "* Expressions symboliques\n",
    "* Fonctions : dérivation, intégration, limites\n",
    "* Sommes, produits et séries\n",
    "```\n",
    "\n",
    "\n",
    "\n",
    "```{warning} \n",
    "Ces exercices sont prévus pour les étudiant·e·s ayant déjà réussi la feuille d'exercices \"classiques\".\n",
    "```\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "## Exercice 6 : aire d'une ellipse\n",
    "\n",
    "Généralement, une ellipse a pour équation cartésienne :\n",
    "\n",
    "$$\n",
    "    \\left(\\frac{x}{a}\\right)^2 + \\left(\\frac{y}{b}\\right)^2 = 1\n",
    "$$\n",
    "\n",
    "où $a$ et $b$ sont deux paramètres de l'ellipse (grand coté et petit coté).\n",
    "\n",
    "\n",
    "\n",
    "**Question 1.** Définir l'équation de l'ellipse comme une expression symbolique en les variables $x, y, a, b$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c1bd89bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('x y a b')\n",
    "f = x**2/a**2 + y**2/b**2 - 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf004dfb",
   "metadata": {},
   "source": [
    "**Question 2.** En effectuant les substitutions adéquates, vérifier que l'ellipse admet deux symétries axiales, selon l'axe des abscisses et selon l'axe des ordonnées."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e54f0dac",
   "metadata": {},
   "outputs": [],
   "source": [
    "bool(f(x=-x) == f)\n",
    "bool(f(y=-y) == f)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c35f271f",
   "metadata": {},
   "source": [
    "**Question 3.** À partir des questions précédentes, et à l'aide des fonctions d'intégration de sagemath, calculer l'aire de l'ellipse en fonction de $a$ et $b$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "432eca5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "assume(b>0)\n",
    "u = solve(f, x)[1]\n",
    "u = u.right_hand_side()\n",
    "print(u)\n",
    "4 * integrate(integrate(1, x, 0, u), y, 0, b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f718a5d",
   "metadata": {},
   "source": [
    "## Exercice 7 : méthode des trapèzes\n",
    "\n",
    "Un trapèze rectangle a la forme suivante :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00a2ed3e",
   "metadata": {},
   "outputs": [],
   "source": [
    "polygon([[0,0], [1,0], [1,3], [0,4]], axes=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09dc1004",
   "metadata": {},
   "source": [
    "Il est formé de deux côtés parallèles et de deux angles droits.\n",
    "\n",
    "\n",
    "**Question 1.** Écrire une fonction ``aire_trapeze(base, cote1, cote2)`` qui calcule l'aire d'un trapèze dont la base (le côté ayant deux angles droits) a longueur ``base`` et dont les deux côtés parallèles ont longueur ``cote1`` et ``cote2``."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "51d7a522",
   "metadata": {},
   "outputs": [],
   "source": [
    "def aire_trapeze(base, cote1, cote2):\n",
    "    return base * (cote1 + cote2)/2"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9613e98",
   "metadata": {},
   "source": [
    "La méthode des trapèzes permet de calculer une valeur approchée d'une intégrale. Supposons que l'on souhaite calculer\n",
    "\n",
    "$$\n",
    "    I = \\int_a^b f(t) dt\n",
    "$$\n",
    "\n",
    "L'idée est la suivante :\n",
    "- on fixe un paramètre entier $n \\ge 1$, destiné à devenir grand,\n",
    "- on découpe l'intervalle $[a,b]$ en $n$ sous-intervalles réguliers $[t_i, t_{i+1}]$, autrement dit $t_0 = a$ et $t_{i+1} = t_i + (b-a)/n$\n",
    "- on calcule l'aire $A_i$ du trapèze dont les $4$ sommets ont pour coordonnées dans le plan :\n",
    "\n",
    "$$\n",
    "    (t_i, 0), \\quad (t_{i+1}, 0), \\quad (t_{i+1}, f(t_{i+1})), \\quad (t_i, f(t_i))\n",
    "$$\n",
    "\n",
    "- la valeur approchée de l'intégrale est alors la somme des aires des trapèze :\n",
    "\n",
    "$$\n",
    "    S_n = \\sum_{i=0}^{n-1} A_i\n",
    "$$\n",
    "\n",
    "On estime alors que $S_n \\to I$ lorsque $n \\to \\infty$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7369168",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('x')\n",
    "f = (1/10)*x**3 + (1/2)*x + 1\n",
    "p = plot(f, color=\"red\", xmin=-2, xmax=2)\n",
    "for i in range(-2,2):\n",
    "    p += polygon([[i,0], [i+1,0], [i+1,f(x=i+1)], [i,f(x=i)]], color=\"lightskyblue\") \n",
    "p.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f710b6df",
   "metadata": {},
   "source": [
    "**Question 2.** Écrire une fonction ``integrale_approchee(f, a, b, n)`` qui exécute la méthode des trapèzes et retourne la valeur approchée $S_n$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df18cf0a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def integrale_approchee(f, a, b, n):\n",
    "    s = 0\n",
    "    base = pi/n\n",
    "    for i in range(n):\n",
    "        s += aire_trapeze(base, f(x= a + i*(b-a)/n), f(x=a + (i+1)*(b-a)/n))\n",
    "    return s"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c73f0af6",
   "metadata": {},
   "source": [
    "On note $E(n) = |I -  S_n|$ l'erreur d'approximation de la méthode des trapèzes.\n",
    "\n",
    "**Question 3.** Tracer la courbe de $E(n)$ en fonction de $n$, pour la fonction $f = \\sin(x)$ dans l'intervalle $[a, b] = [0, \\pi]$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c65a8a95",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('x')\n",
    "f = sin(x)\n",
    "a, b = 0, pi\n",
    "\n",
    "I = integrate(f, x, a, b)\n",
    "E = [ [n, abs(I - integrale_approchee(f, a, b, n))] for n in range(10, 100)]\n",
    "points(E)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f3b32c8",
   "metadata": {},
   "source": [
    "**Question 4.** Écrire une fonction ``integrale_approchee_symbolique(f, a, b)`` qui retourne une **expression symbolique** représentant $S_n$. On rappelle que pour déclarer une variable $n$ destinée à être entière et strictement positive, il faut ajouter les commandes :\n",
    "```\n",
    "assume(n>0)\n",
    "assume(n, 'integer')\n",
    "```\n",
    "après la déclaration de la variable."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "937f8dfc",
   "metadata": {},
   "outputs": [],
   "source": [
    "var('n x i')\n",
    "assume(n>0)\n",
    "assume(n, 'integer')\n",
    "\n",
    "def integrale_approchee_symbolique(f, a, b):\n",
    "    base = pi/n\n",
    "    h = (b-a)/n\n",
    "    # s = sum( aire_trapeze(base, f(x= a + i*h), f(x=a + (i+1)*h)), i, 0, n-1)\n",
    "    s = sum( pi*(f(x= a + i*h)+ f(x=a + (i+1)*h))/(2*n), i, 0, n-1)\n",
    "    return s"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0da9863d",
   "metadata": {},
   "source": [
    "**Question 5.** À l'aide de la fonction ``taylor``, donner un équivalent asymptotique en fonction de $n$ de la vitesse de convergence de la méthode des trapèzes, pour la fonction $f(x) = \\sin(x)$ dans l'intervalle $[0, \\pi]$. \n",
    "\n",
    "*Indication : en tapant ``taylor?``, on cherchera comment utiliser cette fonction.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d88028a",
   "metadata": {},
   "outputs": [],
   "source": [
    "f = sin(x)\n",
    "a, b = 0, pi\n",
    "\n",
    "g = integrale_approchee_symbolique(f, 0, pi)\n",
    "print(g.simplify_trig())\n",
    "print(abs(taylor(g-2, n, +oo, 2)))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Sagemath",
   "language": "python",
   "name": "sagemath"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
