Python Language Les nombres complexes et le module cmath


Exemple

Le module cmath est similaire au module math , mais définit les fonctions de manière appropriée pour le plan complexe.

Tout d'abord, les nombres complexes sont un type numérique qui fait partie du langage Python lui-même plutôt que d'être fourni par une classe de bibliothèque. Il n'est donc pas nécessaire d' import cmath pour les expressions arithmétiques ordinaires.

Notez que nous utilisons j (ou J ) et non i .

z = 1 + 3j

Nous devons utiliser 1j car j serait le nom d'une variable plutôt qu'un littéral numérique.

1j * 1j
Out: (-1+0j)

1j ** 1j
# Out: (0.20787957635076193+0j)     # "i to the i"  ==  math.e ** -(math.pi/2)

Nous avons la partie real et la partie imag (imaginaire), ainsi que le conjugate complexe:

# real part and imaginary part are both float type
z.real, z.imag
# Out: (1.0, 3.0)

z.conjugate()
# Out: (1-3j)    # z.conjugate() == z.real - z.imag * 1j

Les fonctions intégrées abs et complex font également partie du langage lui-même et ne nécessitent aucune importation:

abs(1 + 1j)
# Out: 1.4142135623730951     # square root of 2

complex(1)
# Out: (1+0j)

complex(imag=1)
# Out: (1j)

complex(1, 1)
# Out: (1+1j)

La fonction complex peut prendre une chaîne, mais elle ne peut pas avoir d'espaces:

complex('1+1j')
# Out: (1+1j)

complex('1 + 1j')
# Exception: ValueError: complex() arg is a malformed string

Mais pour la plupart des fonctions, nous avons besoin du module, par exemple sqrt :

import cmath

cmath.sqrt(-1)
# Out: 1j

Naturellement, le comportement de sqrt est différent pour les nombres complexes et les nombres réels. Dans les math non complexes, la racine carrée d'un nombre négatif déclenche une exception:

import math

math.sqrt(-1)
# Exception: ValueError: math domain error

Les fonctions sont fournies pour convertir vers et à partir des coordonnées polaires:

cmath.polar(1 + 1j)
# Out: (1.4142135623730951, 0.7853981633974483)    # == (sqrt(1 + 1), atan2(1, 1))

abs(1 + 1j), cmath.phase(1 + 1j)
# Out: (1.4142135623730951, 0.7853981633974483)    # same as previous calculation

cmath.rect(math.sqrt(2), math.atan(1))
# Out: (1.0000000000000002+1.0000000000000002j)

Le champ mathématique de l'analyse complexe dépasse le cadre de cet exemple, mais de nombreuses fonctions dans le plan complexe ont une "coupure de branche", généralement le long de l'axe réel ou de l'axe imaginaire. La plupart des plates-formes modernes prennent en charge le «zéro signé» tel que spécifié dans la norme IEEE 754, qui assure la continuité de ces fonctions des deux côtés de la découpe. L'exemple suivant provient de la documentation Python:

cmath.phase(complex(-1.0, 0.0))
# Out: 3.141592653589793

cmath.phase(complex(-1.0, -0.0))
# Out: -3.141592653589793

Le module cmath fournit également de nombreuses fonctions avec des contreparties directes du module math .

En plus de sqrt , il existe des versions complexes de exp , log , log10 , les fonctions trigonométriques et leurs inverses ( sin , cos , tan , asin , acos , atan ), et les fonctions hyperboliques et leurs inverses ( sinh , cosh , tanh , asinh , acosh , atanh ). Notez cependant qu'il n'y a pas d'homologue complexe de math.atan2 , la forme à deux arguments de l'arctangent.

cmath.log(1+1j)
# Out: (0.34657359027997264+0.7853981633974483j)

cmath.exp(1j * cmath.pi)
# Out: (-1+1.2246467991473532e-16j)   # e to the i pi == -1, within rounding error

Les constantes pi et e sont fournies. Notez que ceux-ci sont float et non complex .

type(cmath.pi)
# Out: <class 'float'>

Le module cmath fournit également des versions complexes de isinf , et (pour Python 3.2+) isfinite . Voir " Infinity et NaN ". Un nombre complexe est considéré comme infini si sa partie réelle ou sa partie imaginaire est infinie.

cmath.isinf(complex(float('inf'), 0.0))
# Out: True

De même, le module cmath fournit une version complexe de isnan . Voir " Infinity et NaN ". Un nombre complexe est considéré "pas un nombre" si sa partie réelle ou sa partie imaginaire est "pas un nombre".

cmath.isnan(0.0, float('nan'))
# Out: True 

Notez qu'il n'y a pas cmath contrepartie des math.inf et math.nan constantes (de Python 3.5 et versions ultérieures)

Python 3.x 3.5
cmath.isinf(complex(0.0, math.inf))
# Out: True

cmath.isnan(complex(math.nan, 0.0))
# Out: True

cmath.inf
# Exception: AttributeError: module 'cmath' has no attribute 'inf'

Dans Python 3.5 et isclose ultérieures, il existe une méthode isclose dans les modules cmath et math .

Python 3.x 3.5
z = cmath.rect(*cmath.polar(1+1j))

z
# Out: (1.0000000000000002+1.0000000000000002j)

cmath.isclose(z, 1+1j)
# True