A Complex numbers nem bonyolult.
Csak egy kevésbé ijesztő névre lenne szükségük.
Olyan hasznosak, különösen a mérnöki tudományokban és a természettudományokban, hogy a Python a complex típust is a szabványos numerikus típusok közé sorolja, az egészek (ints) és a lebegőpontos számok (floats) mellé.
A complex érték a Pythonban lényegében két lebegőpontos szám párja.
Ezeket szerencsétlen történelmi okokból „valós” és „képzetes” résznek nevezik.
Megint csak a lényegre érdemes figyelni: a mögöttes egyszerűségre, nem a furcsa nevekre.
Két gyakori módja van a komplex számok létrehozásának.
complex(real, imag) konstruktor két float paramétert vár:>>> z1 = complex(1.5, 2.0)
>>> z1
(1.5+2j)
A konstruktor string bemenetet is fel tud dolgozni. Ennek az a furcsa korlátja, hogy hibát jelez, ha a string szóközt tartalmaz.
>>> 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 literálként, vagy csak <complex part>j formában, ha a valós rész nulla:>>> z2 = 2.0 + 1.5j
>>> z2
(2+1.5j)
A végeredmény ugyanaz, mint a complex() konstruktor használatakor.
Két szabály vonatkozik a komplex szám képzetes részére:
A jelölése j (nem i, ahogy esetleg a matekkönyvekben láthatod).
A j-nek közvetlenül egy szám után kell állnia, hogy a Python ne változónevet lásson benne. Ha szükséges, használd az 1j-t.
>>> j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1j
1j
>>> type(1j)
<class 'complex'>
A legtöbb mérnöknek megfelel a j.
A tudósok és matematikusok többsége a matematikai i jelölést részesíti előnyben a képzetes jelentésre, de ez ütközik azzal, hogy az elektrotechnikában az i az áram jele.
Így a Python megtervezésekor az elektrotechnikusok győztek.
A komplex szám részeit külön-külön így érheted el:
>>> z2.real
2.0
>>> z2.imag
1.5
Bármelyik rész lehet nulla, és a matematikusok ilyenkor „teljesen valós” vagy „teljesen képzetes” számról beszélnek. A Pythonban azonban ez még mindig komplex szám:
>>> complex(0, 1)
1j
>>> type(complex(0, 1))
<class 'complex'>
>>> complex(1, 0)
(1+0j)
Talán hallottad már, hogy „az i (vagy j) a -1 négyzetgyöke”.
Egyelőre mindez csak annyit jelent, hogy a képzetes rész definíció szerint kielégíti az egyenlőséget
1j * 1j == -1 # => True
Ez egyszerű gondolat, de érdekes következményekkel jár.
A float és int értékekkel használt operators többsége komplex számokkal is működik:
>>> 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)
A komplex számok szorzásának és osztásának szabályait ez a fogalom nem tárgyalja (és valószínűleg nem is kell túl gyakran „kézzel” elvégezned ezeket a műveleteket).
Ha szeretnél mélyebben elmerülni a témában, bármelyik komplex számokról szóló matematikai vagy elektrotechnikai bevezető kitér rá.
Alternatívaként az Exercism-ön van egy Complex Numbers gyakorlófeladat, amelyben az alapoktól kezdve megvalósíthatsz egy komplex szám osztályt ezekkel a műveletekkel.
Komplex számokon az egész osztás nem lehetséges, ezért a // és % operátor, valamint a divmod() függvény hibát ad a komplex számtípusnál.
Két függvény, amelyet a numerikus típusokhoz megvalósítottak, nagyon hasznos a komplex számok kezelésekor:
<complex number>.conjugate() egyszerűen megfordítja a komplex szám képzetes részének előjelét (pluszból mínuszba vagy fordítva).
abs(<complex number>) garantáltan valós számot ad vissza, képzetes rész nélkül.>>> 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 modulA Python szabványos könyvtárában van egy math modul, tele hasznos funkcióval a valós számok kezeléséhez.
Ugyanígy van egy ezzel egyenértékű cmath modul is a komplex számok kezeléséhez.
Bátran böngészd át a modult és kísérletezz vele, a fő kategóriák azonban ezek:
Íme egy példa néhány konstans használatára:
>>> 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
Így a természet három legfontosabb konstansával, e-vel, i-vel (vagy j-vel) és pi-vel felírt egyszerű kifejezés eredménye -1.
Van, aki szerint ez a matematika legszebb eredménye.
1740 környékéről származik.
Ez a rész átugorható, ha nem érdekel.
A 16. században furcsa és új volt.
500 évvel később a mérnöki tudományok és a fizikai tudományok többségének a középpontjában áll.
Kiderült, hogy a komplex számok jelentik a legegyszerűbb módját bármi leírásának, ami forog, vagy bárminek, ami hullámszerű tulajdonsággal bír. Ezért széles körben használják őket az elektrotechnikában, a hangfeldolgozásban, a fizikában, a számítógépes játékokban és a navigációban - hogy csak néhány alkalmazást említsek.
Látod, ahogy a dolgok forognak. Lehet, hogy a komplex számok nem forgatják meg a világot, de remekül megmagyarázzák, mi történik akkor, amikor a világ forog: elég ránézned bármelyik műholdfelvételre egy nagy viharról.
Kevésbé nyilvánvaló módon hullámszerű a hang, hullámszerű a fény, hullámszerűek a rádiójelek, és még a hazád gazdasága is legalább részben hullámszerű.
A hullámok feldolgozásának nagy része elvégezhető trigonometrikus függvényekkel (sin() és cos()), de az hamar áttekinthetetlenné válik.
A komplex exponenciálisokkal viszont sokkal könnyebb dolgozni.
Ez csak akkor igaz, ha egy barlangban élsz és magad gyűjtögeted az élelmet.
Ha ezt bármilyen képernyőn olvasod, teljes mértékben azokra a hasznos 20. századi fejlesztésekre támaszkodsz, amelyek a komplex számok használatának köszönhetően születtek.
Félvezető chipek.
A gyors Fourier-transzformáció (FFT) algoritmus.
Az FFT a komplex számok alkalmazása, és benne van mindenben, ami a hangátvitelhez, a hangfeldolgozáshoz, a fényképekhez és a videóhoz kapcsolódik.
Az MP3 és más hangformátumok az FFT-t használják tömörítésre, így több hang fér el kisebb tárhelyen.
A JPEG-tömörítés és az MP4-videó, sok más kép- és videoformátum mellett, szintén FFT-t használ a tömörítéshez.
Az FFT-t a digitális szűrők is bevetik, amelyek segítségével a mobiltornyok szét tudják választani a személyes mobiljeleidet mindenki másétól.
Tehát valószínűleg olyan technológiát használsz, amely másodpercenként több ezer alkalommal támaszkodik komplexszám-számításokra.