Python, tipi complessi per lavorare con i numeri complessi (valori assoluti, declinazione, trasformazioni polari, ecc.)

Attività commerciale

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,imagattributo
  • Ottenere numeri complessi coniugati:conjugate()metodo
  • Ottenere il valore assoluto (magnitudine):abs()funzione (ad esempio, matematica, programmazione, programmare)
  • Ottenere la declinazione (fase):math,cmathmodulo
  • Trasformazione di coordinate polari (rappresentazione in forma 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)