Kurzusok
/
Python
Python
/
Tanterv
/
Komplex számok
Ko

Komplex számok ebben a kurzusban: Python

{one: "1 feladat", other: "%{count} feladat"}

A(z) Komplex számok fogalomról

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é.

Alapok

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.

  1. A 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
  1. A komplex szám megadható <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.

Aritmetika

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:

  • A <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).
    • A komplex szorzás működése miatt ez hasznosabb, mint gondolnád.
  • Az 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

A cmath modul

A 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:

  • Átváltás derékszögű és polárkoordináták között,
  • Exponenciális és logaritmusfüggvények,
  • Trigonometrikus függvények,
  • Hiperbolikus függvények,
  • Osztályozó függvények, és
  • Hasznos konstansok.

Í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.


Választható rész: gyakori kérdések a komplex számokról

Ez a rész átugorható, ha nem érdekel.

Nem valami furcsa, új darabja ez a tiszta matematikának?

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.

Miért használná ezt bárki is?

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.

De nekem nincs szükségem komplex számokra!

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.

  1. Félvezető chipek.

    • Ezeknek semmi értelme a klasszikus fizikában, és csak a kvantummechanika tudja megmagyarázni (és megtervezni) őket.
    • A kvantummechanikában definíció szerint minden komplex értékű. (csupa hullámforma, a végtelenségig)
  2. 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.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg