Python ha un tipo standard per gestire i numeri complessi, il tipo COMPLEX. Se volete solo fare calcoli semplici, non avete bisogno di importare alcun modulo, ma se importate la libreria standard cmath, potete anche usare funzioni matematiche (esponenziali, logaritmiche, trigonometriche, ecc.) corrispondenti ai numeri complessi.
I seguenti contenuti sono spiegati qui con codice di esempio.
- Generare variabili complesse
- Ottenere parti reali e immaginarie:
real
,imag
attributo - Ottenere numeri complessi coniugati:
conjugate()
metodo - Ottenere il valore assoluto (magnitudine):
abs()
funzione (ad esempio, matematica, programmazione, programmare) - Ottenere la declinazione (fase):
math
,cmath
modulo - Trasformazione di coordinate polari (rappresentazione in forma polare):
math
,cmath
modulo - Calcolo dei numeri complessi (quadratura, potenze, radici quadrate)
- Generare variabili complesse
- Ottenere le parti reali e immaginarie dei numeri complessi: real, imagattributo
- Ottenere numeri complessi coniugati: conjugate()
- Ottenere il valore assoluto (magnitudine) di un numero complesso: abs()
- Ottenere la declinazione (fase) di un numero complesso: math, cmathmodulo
- Trasformazione di coordinate polari di numeri complessi (rappresentazione formale polare): math, cmathmodulo
- Calcolo dei numeri complessi (quadratura, potenze, radici quadrate)
Generare variabili complesse
Denotate l'unità immaginaria con j e scrivete quanto segue, notate che non è i.
c = 3 + 4j
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Se la parte immaginaria è 1, ometterla risulta in un NameError. Se una variabile di nome j è definita per prima, viene considerata come quella variabile.
1j
Dovrebbe essere esplicitamente dichiarato in questo modo.
# c = 3 + j
# NameError: name 'j' is not defined
c = 3 + 1j
print(c)
# (3+1j)
Se la parte reale è 0, può essere omessa.
c = 3j
print(c)
# 3j
Se volete definire un valore con una parte immaginaria di 0 come un tipo complesso complesso, scrivete 0 esplicitamente. Come descritto di seguito, si possono eseguire operazioni tra il tipo complesso e il tipo intero o a virgola mobile.
c = 3 + 0j
print(c)
# (3+0j)
Le parti reali e immaginarie possono essere specificate come tipo floating-point float. È accettabile anche la notazione esponenziale.
c = 1.2e3 + 3j
print(c)
# (1200+3j)
Può anche essere generato da un costruttore di tipo “complex”, come in “complex(real part, imaginary part)”.
c = complex(3, 4)
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Ottenere le parti reali e immaginarie dei numeri complessi: real, imagattributo
Le parti reale e immaginaria di un tipo complesso complesso possono essere ottenute con gli attributi real e imag, rispettivamente. Entrambi sono tipi float in virgola mobile.
c = 3 + 4j
print(c.real)
print(type(c.real))
# 3.0
# <class 'float'>
print(c.imag)
print(type(c.imag))
# 4.0
# <class 'float'>
È di sola lettura e non può essere modificato.
# c.real = 5.5
# AttributeError: readonly attribute
Ottenere numeri complessi coniugati: conjugate()
Per ottenere numeri complessi coniugati, usate il metodo conjugate().
c = 3 + 4j
print(c.conjugate())
# (3-4j)
Ottenere il valore assoluto (magnitudine) di un numero complesso: abs()
Per ottenere il valore assoluto (grandezza) di un numero complesso, usate la funzione built-in abs().
c = 3 + 4j
print(abs(c))
# 5.0
c = 1 + 1j
print(abs(c))
# 1.4142135623730951
Ottenere la declinazione (fase) di un numero complesso: math, cmathmodulo
Per ottenere la declinazione (fase) di un numero complesso, usate il modulo math o cmath.
Il modulo cmath è un modulo di funzione matematica per i numeri complessi.
Può essere calcolato con la funzione tangente inversa math.atan2() come definito, o usare cmath.phase(), che restituisce la declinazione (fase).
import cmath
import math
c = 1 + 1j
print(math.atan2(c.imag, c.real))
# 0.7853981633974483
print(cmath.phase(c))
# 0.7853981633974483
print(cmath.phase(c) == math.atan2(c.imag, c.real))
# True
In entrambi i casi, l'unità d'angolo che si può ottenere è il radiante. Per convertire in gradi, usate math.degrees().
print(math.degrees(cmath.phase(c)))
# 45.0
Trasformazione di coordinate polari di numeri complessi (rappresentazione formale polare): math, cmathmodulo
Come detto sopra, il valore assoluto (magnitudine) e la declinazione (fase) di un numero complesso possono essere ottenuti, ma usando cmath.polar(), possono essere ottenuti insieme come una tupla (valore assoluto, declinazione).
c = 1 + 1j
print(cmath.polar(c))
print(type(cmath.polar(c)))
# (1.4142135623730951, 0.7853981633974483)
# <class 'tuple'>
print(cmath.polar(c)[0] == abs(c))
# True
print(cmath.polar(c)[1] == cmath.phase(c))
# True
La conversione da coordinate polari a coordinate cartesiane viene fatta usando cmath.rect(). cmath.rect(valore assoluto, deviazione) e argomenti simili possono essere usati per ottenere valori del tipo complesso complesso equivalente.
print(cmath.rect(1, 1))
# (0.5403023058681398+0.8414709848078965j)
print(cmath.rect(1, 0))
# (1+0j)
print(cmath.rect(cmath.polar(c)[0], cmath.polar(c)[1]))
# (1.0000000000000002+1j)
Le parti reale e immaginaria sono equivalenti ai risultati calcolati da coseno math.cos() e seno math.sin() dai valori assoluti e dagli angoli di declinazione.
r = 2
ph = math.pi
print(cmath.rect(r, ph).real == r * math.cos(ph))
# True
print(cmath.rect(r, ph).imag == r * math.sin(ph))
# True
Calcolo dei numeri complessi (quadratura, potenze, radici quadrate)
Quattro operazioni aritmetiche e calcoli di potenza possono essere eseguiti utilizzando i soliti operatori aritmetici.
c1 = 3 + 4j
c2 = 2 - 1j
print(c1 + c2)
# (5+3j)
print(c1 - c2)
# (1+5j)
print(c1 * c2)
# (10+5j)
print(c1 / c2)
# (0.4+2.2j)
print(c1 ** 3)
# (-117+44j)
La radice quadrata può essere calcolata con **0,5, ma introduce un errore. cmath.sqrt() può essere usato per calcolare il valore esatto.
print((-3 + 4j) ** 0.5)
# (1.0000000000000002+2j)
print((-1) ** 0.5)
# (6.123233995736766e-17+1j)
print(cmath.sqrt(-3 + 4j))
# (1+2j)
print(cmath.sqrt(-1))
# 1j
Può anche eseguire operazioni aritmetiche con tipi complessi, int e float.
print(c1 + 3)
# (6+4j)
print(c1 * 0.5)
# (1.5+2j)