I Complex numbers non sono complicati.
Hanno solo bisogno di un nome meno allarmante.
Sono così utili, soprattutto in ingegneria e nelle scienze, che Python include complex come tipo numerico standard, insieme ai numeri interi (ints) e ai numeri in virgola mobile (floats).
Un valore complex in Python è essenzialmente una coppia di numeri in virgola mobile.
Queste sono chiamate le parti «reale» e «immaginaria», per sfortunate ragioni storiche.
Ancora una volta, è meglio concentrarsi sulla semplicità di fondo e non sui nomi strani.
Ci sono due modi comuni per creare numeri complessi.
complex(real, imag) accetta due parametri float:>>> z1 = complex(1.5, 2.0)
>>> z1
(1.5+2j)
Il costruttore può anche analizzare l'input di tipo stringa. Ha la strana limitazione di fallire se la stringa contiene spazi.
>>> complex('4+2j')
(4+2j)
>>> complex('4 + 2j')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string
<real part> + <complex part>j, oppure solo <complex part>j se la parte reale è zero:>>> z2 = 2.0 + 1.5j
>>> z2
(2+1.5j)
Il risultato finale è identico a usare il costruttore complex().
Ci sono due regole per la parte immaginaria del numero complesso:
È indicata con j (non i, come potresti vedere nei libri di matematica).
La j deve seguire immediatamente un numero, per impedire che Python la veda come nome di variabile. Se necessario, usa 1j.
>>> j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1j
1j
>>> type(1j)
<class 'complex'>
La maggior parte degli ingegneri si trova bene con j.
La maggior parte degli scienziati e dei matematici preferisce la notazione matematica i per immaginario, ma quella notazione entra in conflitto con l'uso di i per indicare corrente nell'ingegneria elettrica.
Quindi, progettando Python, hanno vinto gli ingegneri elettrici.
Per accedere alle parti di un numero complesso singolarmente:
>>> z2.real
2.0
>>> z2.imag
1.5
Entrambe le parti possono essere zero e i matematici possono quindi parlare del numero come «puramente reale» o «puramente immaginario». Tuttavia, in Python è ancora un numero complesso:
>>> complex(0, 1)
1j
>>> type(complex(0, 1))
<class 'complex'>
>>> complex(1, 0)
(1+0j)
Potresti aver sentito che «i (o j) è la radice quadrata di -1».
Per ora, tutto ciò significa che la parte immaginaria per definizione soddisfa l'uguaglianza
1j * 1j == -1 # => True
Questa è un'idea semplice, ma porta a conseguenze interessanti.
La maggior parte degli operators usati con i numeri in virgola mobile e con gli interi funziona anche con i numeri complessi:
>>> z1 = (1.5+2j)
>>> z2 = (2+1.5j)
>>> z1 + z2 # addition
(3.5+3.5j)
>>> z1 - z2 # subtraction
(-0.5+0.5j)
>>> z1 * z2 # multiplication
6.25j
>>> z1 / z2 # division
(0.96+0.28j)
>>> z1 ** 2 # exponentiation
(-1.75+6j)
>>> 2 ** z1 # another exponentiation
(0.5188946835878313+2.7804223253571183j)
>>> 1j ** 2 # j * j == -1
(-1+0j)
Spiegare le regole per la moltiplicazione e la divisione dei numeri complessi esula dagli scopi di questo concetto (e non ti capiterà spesso di dover eseguire quelle operazioni «a mano»).
Qualsiasi introduzione matematica o di ingegneria elettrica ai numeri complessi tratterà questo argomento, se desideri approfondire.
In alternativa, Exercism ha un esercizio di pratica Complex Numbers dove puoi implementare una classe di numeri complessi con queste operazioni partendo dai principi fondamentali.
La divisione intera non è possibile con i numeri complessi, quindi gli operatori // e % e la funzione divmod() falliranno per il tipo numero complesso.
Ci sono due funzioni implementate per i tipi numerici che sono molto utili quando si lavora con i numeri complessi:
<complex number>.conjugate() inverte semplicemente il segno della parte immaginaria di un numero complesso (da + a - o viceversa).
abs(<complex number>) garantisce di restituire un numero reale senza parte immaginaria.>>> z1
(1.5+2j)
>>> z1.conjugate() # flip the z1.imag sign
(1.5-2j)
>>> abs(z1) # sqrt(z1.real ** 2 + z1.imag ** 2)
2.5
cmath
La libreria standard di Python ha un modulo math pieno di funzionalità utili per lavorare con i numeri reali.
Ha anche un modulo equivalente cmath per lavorare con i numeri complessi.
Ti incoraggiamo a leggere il modulo e a sperimentare, ma le categorie principali sono:
Ecco un esempio che usa alcune costanti:
>>> import cmath
>>> euler = cmath.exp(1j * cmath.pi) # Euler's equation
>>> euler.real
-1.0
>>> round(euler.imag, 15) # round to 15 decimal places
0.0
Quindi un'espressione semplice con tre delle costanti più importanti della natura e, i (o j) e pi dà come risultato -1.
Alcuni credono che questo sia il risultato più bello di tutta la matematica.
Risale all'incirca al 1740.
Questa parte può essere saltata, a meno che non ti interessi.
Era strana e nuova nel XVI secolo.
500 anni dopo, è centrale per gran parte dell'ingegneria e delle scienze fisiche.
Si scopre che i numeri complessi sono il modo più semplice per descrivere qualsiasi cosa ruoti o abbia una proprietà ondulatoria. Quindi sono ampiamente usati in ingegneria elettrica, elaborazione audio, fisica, videogiochi e navigazione, tanto per citare solo alcune applicazioni.
Puoi vedere le cose ruotare. I numeri complessi non faranno girare il mondo, ma sono ottimi per spiegare cosa succede come conseguenza del fatto che il mondo gira: guarda qualsiasi immagine satellitare di una grande tempesta.
Meno ovviamente, il suono è ondulatorio, la luce è ondulatoria, i segnali radio sono ondulatori, e persino l'economia del tuo paese d'origine è almeno in parte ondulatoria.
Molta di questa elaborazione di onde può essere fatta con funzioni trigonometriche (sin() e cos()) ma diventa presto disordinata.
Gli esponenziali complessi sono molto più facili da usare.
Vero solo se vivi in una caverna e ti procuri il cibo raccogliendo.
Se stai leggendo questo su qualsiasi tipo di schermo, dipendi totalmente da alcuni utili progressi del XX secolo resi possibili dall'uso dei numeri complessi.
Chip a semiconduttore.
L'algoritmo Fast Fourier Transform (FFT).
La FFT è un'applicazione dei numeri complessi, ed è in tutto ciò che è collegato alla trasmissione del suono, all'elaborazione audio, alle foto e ai video.
MP3 e altri formati audio usano la FFT per la compressione, assicurando che più audio possa entrare in uno spazio di archiviazione più piccolo.
La compressione JPEG e il video MP4, tra molti altri formati di immagini e video, usano anch'essi la FFT per la compressione.
La FFT è anche impiegata nei filtri digitali che permettono alle torri cellulari di separare il tuo segnale cellulare personale da quello di tutti gli altri.
Quindi, probabilmente stai usando tecnologia che si basa su calcoli con numeri complessi migliaia di volte al secondo.