{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  L3 E - S5 2018-19 --- TD ordinateurs --- séance 4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Autour des nombres complexes\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "os.chdir('/Users/ef_mac2/Desktop/cloud/enseigne/maths-sur-ordi/lgge_PYTHON/TDO_18-19/TDO-4')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from pylab import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Le nombre imaginaire pur $i$ s'écrit ${\\rm \\texttt{j}}$ avec ${\\rm \\texttt{python}}$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "z = 3 - 4.j\n",
    "print ('z=',z,'est de', type (z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Attention à la syntaxe : ${\\rm \\texttt{python}}$ comprend ${\\rm \\texttt{3-4.j}}$ comme un nombre complexe mais pas ${\\rm \\texttt{3-4*j}}$ (où ${\\rm \\texttt{j}}$ est une variable quelconque)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "z = 3 - 4.j\n",
    "print ('z=',z,'est de', type (z))\n",
    "z = 3 - 4*j\n",
    "print ('z=',z,'est de', type (z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "De la même façon :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "w=-1j\n",
    "print ('w=',w,'est de', type (w))\n",
    "w = -j\n",
    "print ('w=',w,'est de', type (w))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Voici une autre manière de définir des nombres complexes :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "u=-2.5\n",
    "v=3\n",
    "z=complex(u,v)\n",
    "print ('u=',u,'est de', type (u))\n",
    "print ('v=',v,'est de', type (v))\n",
    "print ('z=',z,'est de', type (z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On peut utiliser les fonctions ${\\rm \\texttt{real}}$, ${\\rm \\texttt{imag}}$ et ${\\rm \\texttt{conjugate}}$ qui font bien ce que leur nom dit :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print ('la partie réelle de z est',z.real)\n",
    "print ('la partie imaginaire de z est',z.imag)\n",
    "print('le conjugué de z est',z.conjugate())\n",
    "print( 'le module de 1+i est', abs(1+1.j))\n",
    "print ('l\\'argument de 1+i est',angle(1+1.j))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "et effectuer les opérations algébriques usuelles :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "z1=-2+5.j\n",
    "print (z+z1, z*z1, z/z1, z *z1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Ceci dit, certaines fonctions classiques ne fonctionneront pa si elles font appel à des calculs dans le corps des nombres complexes :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sqrt(-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "La bibliothèque ${\\rm \\texttt{cmath}}$ permet de traiter des fonctions de la variable complexe ; par exemple, on peut importer la fonction ${\\rm \\texttt{sqrt}}$ de ${\\rm \\texttt{cmath}}$ :\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from cmath import sqrt\n",
    "print (sqrt(-1))\n",
    "print (sqrt(9))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On trouve ainsi facilement les racines de $x^2+x+1=0$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a,b,c=1,1,1\n",
    "x1=(-b-sqrt(b**2-4*a*c))/(2*a)\n",
    "x2=(-b+sqrt(b**2-4*a*c))/(2*a)\n",
    "print (x1)\n",
    "print (x2)\n",
    "print (x1+x2)\n",
    "print (x1*x2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Voici une application graphique avec le dessin d'un pentagone avec la rotation d'angle $2\\pi/5$ :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "z=1 +0.j\n",
    "x=[1]\n",
    "y=[0]\n",
    "for n in range (1,6):\n",
    "    z=z*complex(cos(2*pi/5),sin(2*pi/5))\n",
    "    x.append(z.real)\n",
    "    y.append(z.imag)\n",
    "\n",
    "plot(x, y, \"yo-\")      \n",
    "xlabel(\"abscisse x\")\n",
    "ylabel(\"ordonnee y\")\n",
    "axis([-1.2, 1.2, -1.2, 1.2])\n",
    "#legend([\"un pentagone\"])\n",
    "title(\"un pentagone\")\n",
    "savefig(\"un pentagone.pdf\")\n",
    "show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Peut-être que vous préfèrerez ce dessin : (qu'est-ce qui a changé ?)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "z=1 +0.j\n",
    "x=[1]\n",
    "y=[0]\n",
    "for n in range (1,6):\n",
    "    z=z*complex(cos(2*pi/5),sin(2*pi/5))\n",
    "    x.append(z.real)\n",
    "    y.append(z.imag)\n",
    "plot(x, y, \"yo-\")      \n",
    "xlabel(\"abscisse x\")\n",
    "ylabel(\"ordonnee y\")\n",
    "axis([-1.2, 1.2, -1.2, 1.2])\n",
    "axis(\"equal\")\n",
    "#legend([\"un pentagone\"])\n",
    "title(\"un pentagone\")\n",
    "savefig(\"un pentagone.pdf\")\n",
    "show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Et on peut aussi vouloir un titre plus précis : "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "z=1 +0.j\n",
    "x=[1]\n",
    "y=[0]\n",
    "k=5\n",
    "for n in range (1,k+1):\n",
    "    z=z*complex(cos(2*pi/5),sin(2*pi/5))\n",
    "    x.append(z.real)\n",
    "    y.append(z.imag)\n",
    "plot(x, y, \"yo-\")      \n",
    "xlabel(\"abscisse x\")\n",
    "ylabel(\"ordonnee y\")\n",
    "axis([-1.2, 1.2, -1.2, 1.2])\n",
    "axis(\"equal\")\n",
    "#legend([\"un pentagone\"])\n",
    "title(\"un polygone régulier à %g côtés \"%(k))\n",
    "savefig(\"un pentagone.pdf\")\n",
    "show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "#  Exercice 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "La commande interactive ${\\rm \\texttt{input()}}$ permet de demander de rentrer une valeur au clavier.  Si  l'on écrit ${\\rm \\texttt{n=input()}}$, cette valeur sera affectée à la variable ${\\rm \\texttt{n}}$ et on peut être plus précis en indiquant ce qu'on attend \n",
    "${\\rm \\texttt{n=input('donnez-moi un nombre entier')}}$ ; par exemple :\n",
    "\n",
    "\n",
    "   \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "n=input('entrez un entier :')\n",
    "print(\"n =\",n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Ecrire un programme qui trace un polygone régulier à $n$ côtés ($n$ étant la valeur demandée par  l'utilisateur du programme) dans un repère orthonormé.\n",
    "\n",
    "Puis afficher le polygone et l'enregistrer dans un fichier pdf dont le titre indique le nombre de côtés du polygone."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Exercice 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "La fonction ${\\rm \\texttt{random}}$ permet de générer des valeurs aléatoires. Par exemple, ${\\rm \\texttt{x=random()}}$ génèrera un nombre au hasard compris entre 0 et 1 que l'on affectera à la variable ${\\rm \\texttt{x}}$.\n",
    "\n",
    "\n",
    "\n",
    "Dans cet exercice, on  va chercher à caractériser l'ensemble ${\\rm \\texttt{E}}$ des points\n",
    "${\\rm \\texttt{M}}$ du plan d'affixe ${\\rm \\texttt{z}}$ tels que \n",
    "$$\\vert z+1\\vert +\\vert z-1\\vert \\leq 4$$\n",
    "On peut bien entendu étudier cette inégalité en coordonnées cartésiennes. Mais ici,  on va simplement prendre 2000 points au hasard (dans un rectangle  censé contenir l'ensemble ${\\rm \\texttt{E}}$) en marquant d'une croix chaque point ${\\rm \\texttt{M}}$ qui appartient  ${\\rm \\texttt{E}}$.\n",
    "\n",
    "1.a. Voici un script incomplet (à vous de compléter les points de suspension !) :\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x=[]\n",
    "y=[]\n",
    "for k in range(2000):\n",
    "    u=4*random()-2\n",
    "    v=4*random()-2\n",
    "    z=...              #### compléter !!\n",
    "    if ...             #### compléter !!\n",
    "        x.append(u)\n",
    "        y.append(v)\n",
    "\n",
    "plot(x, y, \"+\")      \n",
    "xlabel(\"abscisse x\")\n",
    "ylabel(\"ordonnee y\")\n",
    "axis([...,...,...,...])   #### compléter !!\n",
    "title(\"TDO5 - exercice 2\")\n",
    "savefig(\"exercice2.pdf\")\n",
    "grid()               ### permet d'afficher un quadrillage du plan\n",
    "show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.b. Quel est le rectangle qu'on a choisi (comme rectangle contenant ${\\rm \\texttt{E}}$ ) ? \n",
    "\n",
    "Pourquoi ?\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "  \n",
    " $~$ 2. On considère la transformation du plan\n",
    "$$f : (x,y)\\mapsto \\left(\\frac{x}{2},\\frac{y}{\\sqrt{3}}\\right)$$\n",
    "Tracer sur la même figure les points correspondants à $E$ (comme dans la question 1.)\n",
    "et ceux correspondants à $f(E)$.\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Exercice 3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Pour tout nombre complexe ${\\rm \\texttt{c}}$, on définit $l'ensemble$ $de$ $Julia$ $J_c$ à partir de l'étude des suites récurrentes:\n",
    "$$\\left\\{\\begin{array}{l}\n",
    "z_0 \\in \\mathbf C\\\\\n",
    "z_{n+1}=z_n^2+c\n",
    "\\end{array}\n",
    "\\right.\n",
    "$$\n",
    "Suivant la valeur $z_0$ de départ, la suite sera bornée ou ne sera pas bornée. Les valeurs $z_0$ pour lesquelles la suite est bornée sont les éléments de $J_c$.\n",
    "\n",
    "\n",
    "Voici un programme pour tracer l'ensemble de Julia :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "c=-0.8+0.2j\n",
    "\n",
    "a,N,Nb_iterations=1.5,1000,20\n",
    "x=linspace(-a,a,N)\n",
    "y=linspace(-a,a,N)\n",
    "U=[]\n",
    "V=[]\n",
    "for Re in x:\n",
    "    for Im in y:\n",
    "        z0=complex(Re,Im)\n",
    "        z=z0\n",
    "        p=0\n",
    "        while abs(z)<2 and p<Nb_iterations:\n",
    "            p=p+1\n",
    "            z=z**2+c\n",
    "            if p==Nb_iterations:\n",
    "                U.append(z0.real)\n",
    "                V.append(z0.imag)\n",
    "        \n",
    "plot(U,V, \".\")      \n",
    "\n",
    "axis([-2, 2, -2, 2])\n",
    "title(\"ensemble de Julia pour Nb_iterations=%g et depart %g + %g i\"% (Nb_iterations,c.real,c.imag))\n",
    "savefig(\"ex3_ensemble-de-%g.pdf\"% (Nb_iterations))\n",
    "grid() \n",
    "show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " 1. Executer ce programme en faisant varier la variables $\\texttt{Nb}$_$\\texttt{iterations}$ parmi les valeurs 10, 20, 30, 40, 50... \n",
    "\n",
    " 2. Comprendre ligne à ligne ce programme.\n",
    "\n",
    " 3. Quels sont les nombres complexes que l'on retient comme étant dans dans l'ensemble de Julia ?\n",
    " \n",
    " 4. Sur le même principe, on prend $z_0=0$ et l'ensemble de Mandelbrot est obtenu en ne retenant que les valeurs de la constante $c$ pour lesquelles la suite obtenue est bornée. Dessiner l'ensemble de Mandelbrot."
   ]
  }
 ],
 "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.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
