TP1 nombres complexes¶
Comment définir des nombres complexes avec python?
z = -1.3 + 2.1j
z
(-1.3+2.1j)
a, b = -1.3, 2.1
a + bj # cette écriture n'est pas bonne
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[2], line 2 1 a, b = -1.3, 2.1 ----> 2 a + bj # cette écriture n'est pas bonne NameError: name 'bj' is not defined
a+b*1j
(-1.3+2.1j)
complex(a,b)
(-1.3+2.1j)
Pour obtenir les parties réelles et imaginaires d'un nombre complexe on utilise les méthodes z.real
et z.imag
z.real
-1.3
z.imag
2.1
Q-1) Calculer sur feuille les parties réelles et imaginaires des nombres complexes¶
$$ z_1 = \frac{1-2i}{3+i},\qquad z_2 = \frac{2+i}{2-i},\qquad\text{et}\qquad z_3 = \frac{(1-4i)(1-i)}{(1+i)^2}.$$
Faire les calculs avec Python et vérifier que vous obtenez bien le même résultat (ou trouvez l'erreur)¶
Pour les calcul à la main, on a $$ z_1 = \frac{1-7i}{10} ,\qquad z_2 = \frac{3+4i}{5},\qquad z_3 = \frac{-5 + 3i}{2} $$
Puis avec python:
z1 = (1-2j)/(3+1j)
z1.real, z1.imag
(0.1, -0.7000000000000001)
1/10, 7/10
(0.1, 0.7)
z2 = (2+1j)/(2-1j)
z2.real, z2.imag
(0.6, 0.8)
3/5, 4/5
(0.6, 0.8)
z3 = (1-4j)*(1-1j)/(1+1j)**2
z3.real, z3.imag
(-2.5, 1.5)
-5/2, 3/2
(-2.5, 1.5)
Q-2) Rappeler ce qu’est le module d’un nombre complexe. Créer une fonction module(z)
qui calcule ce module.¶
Pour un nombre complexe $z=x+iy$, son module est donné par
$$ |z| = \sqrt{x^2 + y^2} $$
import numpy as np # on utilise numpy pour calculer la racine carrée
def module(z):
r = np.sqrt(z.real**2 + z.imag**2)
return r
module(z)
np.float64(2.4698178070456938)
Bien évidemment, une opération aussi courante est déjà préprogrammée et on pourra calculer le module
à l’aide de la fonction np.abs
. On peut obtenir également un argument en radiant grâce à la fonction
np.angle
.
np.abs(z) # fct numpy pour calculer le module d'un nombre complexe
np.float64(2.469817807045694)
Q-3) Déterminer le module et l’argument en degrés du nombre complexe du nombre complexe $1/2 - i\sqrt{3}/2$. On pourra utiliser np.pi
pour avoir une valeur de $\pi$ et np.sqrt
pour la racine carrée¶
Ici on a $z = e^{-i\pi/3}$. Son module est donc de 1 et son argument est $-\pi/3$, soit $-60$ degrés
from numpy import pi # avec cette syntaxe on n'a pas besoin du prefixe np. (np.pi) pour appeller pi
pi
3.141592653589793
z = 1/2 - np.sqrt(3)/2*1j
np.abs(z) # pour le module de z
np.float64(1.0)
np.angle(z) # pour l'angle, mais en radian
np.float64(-1.0471975511965976)
-pi/3
-1.0471975511965976
np.angle(z, deg=True) # l'angle en degrés
np.float64(-59.99999999999999)
Q-4) Rappeler ce qu’est le conjugué d’un nombre complexe. Créer une fonction conjug(z)
qui calcule le conjugué.¶
Pour un nombre complexe $z=x+iy$, le conjugué de $z$ est donné par
$$ \bar z = x-iy $$
def conjug(z):
return z.real - z.imag*1j
conjug(z)
np.complex128(0.5+0.8660254037844386j)
De nouveau, une opération si courante est préprogrammée et on peut obtenir le conjugué du nombre z par z.conjugate()
(noter la nécessité des parenthèses). On peut mettre des nombres complexes dans des tableaux Numpy ce qui est très avantageux car alors on peut utiliser la même syntaxe que si on manipulait des nombres complexes normaux et le résultat est que le calcule s’effectue composante par composante
z.conjugate() # fct numpy pour calculer le conjugué d'un nombre complexe
np.complex128(0.5+0.8660254037844386j)
Q-5) Créer un tableau Numpy de nombres complexes très simple grâce à la cellule suivante¶
t = np.array([1j, 1+1j, complex(-1/2, np.sqrt(3)/2)])
Tester les commandes t.real
, t.imag
, t.conjugate()
, np.abs(t)
, np.angle(t)
.¶
t.real # donne les parties réelles
array([ 0. , 1. , -0.5])
t.imag # donne les parties imaginaires
array([1. , 1. , 0.8660254])
t.conjugate() # donne les conjugués des nombres complexes
array([ 0. -1.j , 1. -1.j , -0.5-0.8660254j])
np.abs(t) # donne les modules
array([1. , 1.41421356, 1. ])
np.angle(t) # donne les angles (ici en radian)
array([1.57079633, 0.78539816, 2.0943951 ])
visualisation de quelques opérations sur les nombres complexes¶
On termine par essayer de visualiser quelques opérations sur les nombres complexes. On commence par créer une une fonction de visualisation par le code suivant.
import matplotlib.pyplot as plt
def visualiser(t, couleur='b'):
plt.plot(t.real, t.imag, 'x'+couleur)
visualiser(t)
Cette fonction permet d’afficher dans le plan complexe les nombres (complexes) contenus dans t
sous la
forme de petites croix de couleurs. La couleur par défaut est bleue mais on peut la changer en passant
comme argument ’r’
(attention aux quotes), ’g’
, ’y’
, ’k’
pour avoir différentes couleurs.
On pourra également utiliser la visualisation suivante :
def visualiser_fleches(depart, fin):
plt.quiver(depart.real, depart.imag, (fin-depart).real, (fin-depart).imag,
angles='xy', scale_units='xy', scale=1)
def faire_grille(N):
h = 4/(N-1)
ind = np.indices((N, N))
t = -2+h*ind[0]+(-2+h*ind[1])*1j
return t.flatten()
grille = faire_grille(5) # crée une grille 5x5 de point de C centréee en (0,0)
visualiser(grille)
visualiser_fleches(0., t[0]) # crée une fléche de (0,0) au point t[0]
Q-6) Illustrer graphiquement l’effet géométrique de la fonction¶
$$ z\longmapsto \Big(\frac{1}{2}-\frac{\sqrt{3}}{2}i\Big)z$$
# fct produisant la transformation
def fct1(z):
return complex(1/2, -np.sqrt(3)/2)*z
# transformation de la grille
z1 = fct1(grille)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z1, 'r')
for u,v in zip(grille, z1):
visualiser_fleches(u, v)
Q-7) Illustrer graphiquement l’effet géométrique de la fonction¶
$$ z\longmapsto 2z.$$
# fct produisant la transformation
def fct2(z):
return 2*z
# transformation de la grille
z2 = fct2(grille)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z2, 'r')
for u,v in zip(grille, z2):
visualiser_fleches(u, v)
Q-8) Illustrer graphiquement l’effet géométrique de la fonction¶
$$ z\longmapsto (1+i)z.$$
# fct produisant la transformation
def fct3(z):
return (1+1j)*z
# transformation de la grille
z3 = fct3(grille)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z3, 'r')
for u,v in zip(grille, z3):
visualiser_fleches(u, v)
Q-9) Illustrer graphiquement l’effet géométrique de la fonction¶
$$ z\longmapsto -1.2+3i + z.$$
# fct produisant la transformation
def fct4(z):
return -1.2 + 3j + z
# transformation de la grille
z4 = fct4(grille)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z4, 'r')
for u,v in zip(grille, z4):
visualiser_fleches(u, v)
Q-10) La fonction np.exp
est tout à fait capable de prendre en argument des nombres complexes. Pour plusieurs valeurs de $\theta\in [0,2\pi[$ illustrer graphiquement l'effet géométrique de la fonction¶
$$ z\longmapsto e^{i\theta}z.$$
# fct produisant la transformation
def fct5(z, theta):
return np.exp(theta*1j) * z
# definition de \theta
theta = pi/4
# transformation de la grille
z5 = fct5(grille, theta)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z5, 'r')
for u,v in zip(grille, z5):
visualiser_fleches(u, v)
Q-11) Pour finir, même question avec les deux fonctions suivantes:¶
$$ z\longmapsto z^2 \qquad\text{and}\qquad z\longmapsto e^z.$$
# fct produisant la transformation
def fct6(z):
return z**2
# transformation de la grille
z6 = fct6(grille)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z6, 'r')
for u,v in zip(grille, z6):
visualiser_fleches(u, v)
# fct produisant la transformation
def fct7(z):
return np.exp(z)
# transformation de la grille
z7 = fct7(grille)
# visualisation de la grille transformée
visualiser(grille)
visualiser(z7, 'r')
for u,v in zip(grille, z7):
visualiser_fleches(u, v)