A Python rendelkezik egy szabványos típussal a komplex számok kezelésére, a COMPLEX típussal. Ha csak egyszerű számításokat szeretnénk végezni, nem kell semmilyen modult importálnunk, de ha a cmath szabványos könyvtárat importáljuk, akkor a komplex számoknak megfelelő matematikai függvényeket (exponenciális, logaritmikus, trigonometrikus stb.) is használhatjuk.
A következő tartalmakat itt példakóddal magyarázzuk el.
- Komplex változók generálása
- Valós és képzeletbeli részek beszerzése:
real
,imag
attribútum - Konjugált komplex számok kinyerése:
conjugate()
módszer - Abszolút érték (nagyságrend) lekérdezése:
abs()
funkció (pl. matematika, programozás, programozás) - Deklináció (fázis) beszerzése:
math
,cmath
modul - Polárkoordináta-transzformáció (poláris alakú ábrázolás):
math
,cmath
modul - Komplex számok számítása (kvadratúra, hatványok, négyzetgyök)
- Komplex változók generálása
- Komplex számok valós és képzetes részeinek kinyerése: real, imagattribútum
- Konjugált komplex számok kinyerése: conjugate()
- Egy komplex szám abszolút értékének (nagyságának) kiszámítása: abs()
- Egy komplex szám deklinációjának (fázisának) kiszámítása: math, cmathmodul
- A komplex számok polárkoordináta-transzformációja (poláris alaki ábrázolás): math, cmathmodul
- Komplex számok számítása (kvadratúra, hatványok, négyzetgyök)
Komplex változók generálása
Jelöljük a képzeletbeli egységet j-vel, és írjuk fel a következőket, vegyük észre, hogy nem i.
c = 3 + 4j
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Ha az imaginárius rész 1, a kihagyása NameError-t eredményez. Ha egy j nevű változót definiáltunk először, akkor azt a változót tekintjük annak.
1j
Ezt kifejezetten így kell megfogalmazni.
# c = 3 + j
# NameError: name 'j' is not defined
c = 3 + 1j
print(c)
# (3+1j)
Ha a valós rész 0, akkor elhagyható.
c = 3j
print(c)
# 3j
Ha olyan értéket akarsz definiálni, amelynek képzetes része 0, mint komplex komplex típus, akkor írd ki explicit módon a 0-t. Az alábbiakban leírtak szerint a komplex típus és az integer típus vagy a lebegőpontos típus között végezhetünk műveleteket.
c = 3 + 0j
print(c)
# (3+0j)
A valós és képzetes részek lebegőpontos lebegő típusúak lehetnek. Az exponenciális jelölés is elfogadható.
c = 1.2e3 + 3j
print(c)
# (1200+3j)
Egy “complex” típusú konstruktorral is létrehozható, mint a “complex(valós rész, képzetes rész)”.
c = complex(3, 4)
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Komplex számok valós és képzetes részeinek kinyerése: real, imagattribútum
A komplex komplex típus valós és imaginárius részei a real és imag attribútumokkal kaphatók meg. Mindkettő lebegőpontos lebegőpontos típus.
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'>
Csak olvasható, és nem módosítható.
# c.real = 5.5
# AttributeError: readonly attribute
Konjugált komplex számok kinyerése: conjugate()
A konjugált komplex számok előállításához használjuk a conjugate() módszert.
c = 3 + 4j
print(c.conjugate())
# (3-4j)
Egy komplex szám abszolút értékének (nagyságának) kiszámítása: abs()
Egy komplex szám abszolút értékének (nagyságának) kiszámításához használja a beépített abs() függvényt.
c = 3 + 4j
print(abs(c))
# 5.0
c = 1 + 1j
print(abs(c))
# 1.4142135623730951
Egy komplex szám deklinációjának (fázisának) kiszámítása: math, cmathmodul
Egy komplex szám deklinációjának (fázisának) meghatározásához használja a math vagy a cmath modult.
A cmath modul egy matematikai függvénymodul a komplex számokhoz.
Kiszámítható a math.atan2() inverz érintő függvénnyel, vagy a cmath.phase() függvénnyel, amely a deklinációt (fázist) adja vissza.
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
Mindkét esetben a kapott szög mértékegysége radián. A fokokra való átváltáshoz használjuk a math.degrees() függvényt.
print(math.degrees(cmath.phase(c)))
# 45.0
A komplex számok polárkoordináta-transzformációja (poláris alaki ábrázolás): math, cmathmodul
Mint fentebb említettük, egy komplex szám abszolút értéke (nagysága) és deklinációja (fázisa) is megkapható, de a cmath.polar() segítségével ezek együttesen (abszolút érték, deklináció) tupliként kaphatók.
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
A polárkoordinátákból kartéziánus koordinátákba való átalakítás a cmath.rect() segítségével történik. cmath.rect(abszolút érték, eltérés) és hasonló argumentumokkal az egyenértékű komplex komplex komplex típusú értékeket kaphatjuk.
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)
A valós és képzetes részek egyenértékűek a cosinus math.cos() és a sine math.sin() abszolút értékekből és deklinációs szögekből számított eredményekkel.
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
Komplex számok számítása (kvadratúra, hatványok, négyzetgyök)
Négy aritmetikai művelet és hatványszámítás végezhető a szokásos aritmetikai operátorokkal.
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)
A négyzetgyök kiszámítható **0.5 segítségével, de ez hibát okoz. cmath.sqrt() segítségével kiszámítható a pontos érték.
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
Aritmetikai műveletek elvégzésére is képes komplex típusokkal, int típusokkal és float típusokkal.
print(c1 + 3)
# (6+4j)
print(c1 * 0.5)
# (1.5+2j)