Python ma standardowy typ do obsługi liczb złożonych – typ COMPLEX. Jeśli chcesz wykonywać tylko proste obliczenia, nie musisz importować żadnych modułów, ale jeśli zaimportujesz standardową bibliotekę cmath, możesz również używać funkcji matematycznych (wykładniczych, logarytmicznych, trygonometrycznych itd.) odpowiadających liczbom złożonym.
Poniższe treści zostały tu wyjaśnione wraz z przykładowym kodem.
- Generowanie zmiennych złożonych
- Uzyskaj części rzeczywiste i urojone:
real
,imag
atrybut - Uzyskaj koniugację liczb zespolonych:
conjugate()
metoda - Uzyskaj wartość bezwzględną (wielkość):
abs()
funkcja (np. matematyczna, programistyczna, programistyczna) - Uzyskaj deklinację (fazę):
math
,cmath
moduł - Biegunowa transformacja współrzędnych (przedstawienie w postaci biegunowej):
math
,cmath
moduł - Obliczanie liczb zespolonych (kwadratura, potęgi, pierwiastki kwadratowe)
- Generowanie zmiennych złożonych
- Poznaj rzeczywiste i urojone części liczb zespolonych: real, imagatrybut
- Uzyskaj koniugację liczb zespolonych: conjugate()
- Uzyskanie wartości bezwzględnej (wielkości) liczby złożonej: abs()
- Uzyskaj deklinację (fazę) liczby złożonej: math, cmathmoduł
- Polarna transformacja współrzędnych liczb zespolonych (formalna reprezentacja biegunowa): math, cmathmoduł
- Obliczanie liczb zespolonych (kwadratura, potęgi, pierwiastki kwadratowe)
Generowanie zmiennych złożonych
Oznacz jednostkę urojoną przez j i zapisz poniższy tekst, zauważ, że nie jest to i.
c = 3 + 4j
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Jeśli część urojona wynosi 1, to jej pominięcie powoduje wystąpienie błędu NameError. Jeśli zmienna o nazwie j zostanie zdefiniowana jako pierwsza, to jest ona uważana za tę zmienną.
1j
Powinno to być wyraźnie zaznaczone w ten sposób.
# c = 3 + j
# NameError: name 'j' is not defined
c = 3 + 1j
print(c)
# (3+1j)
Jeśli część rzeczywista wynosi 0, można ją pominąć.
c = 3j
print(c)
# 3j
Jeśli chcemy zdefiniować wartość o części urojonej równej 0 jako typ złożony, należy wyraźnie wpisać 0. Jak opisano poniżej, można wykonywać operacje między typem złożonym a typem całkowitym lub zmiennoprzecinkowym.
c = 3 + 0j
print(c)
# (3+0j)
Części rzeczywista i urojona mogą być określone jako zmiennoprzecinkowe typu float. Dopuszczalna jest również notacja wykładnicza.
c = 1.2e3 + 3j
print(c)
# (1200+3j)
Można go również wygenerować za pomocą konstruktora typu „complex”, jak w przypadku „complex(część rzeczywista, część urojona)”.
c = complex(3, 4)
print(c)
print(type(c))
# (3+4j)
# <class 'complex'>
Poznaj rzeczywiste i urojone części liczb zespolonych: real, imagatrybut
Części rzeczywistą i urojoną typu złożonego można uzyskać odpowiednio za pomocą atrybutów real i imag. Oba typy są typami zmiennoprzecinkowymi float.
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'>
Jest ona tylko do odczytu i nie można jej zmienić.
# c.real = 5.5
# AttributeError: readonly attribute
Uzyskaj koniugację liczb zespolonych: conjugate()
Aby otrzymać koniugaty liczb zespolonych, należy użyć metody conjugate().
c = 3 + 4j
print(c.conjugate())
# (3-4j)
Uzyskanie wartości bezwzględnej (wielkości) liczby złożonej: abs()
Aby uzyskać wartość bezwzględną (wielkość) liczby złożonej, należy użyć wbudowanej funkcji abs().
c = 3 + 4j
print(abs(c))
# 5.0
c = 1 + 1j
print(abs(c))
# 1.4142135623730951
Uzyskaj deklinację (fazę) liczby złożonej: math, cmathmoduł
Aby uzyskać deklinację (fazę) liczby złożonej, należy użyć modułu math lub cmath.
Moduł cmath jest modułem funkcji matematycznych dla liczb zespolonych.
Można ją obliczyć za pomocą funkcji odwrotności tangensa math.atan2() zgodnie z definicją lub użyć funkcji cmath.phase(), która zwraca deklinację (fazę).
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
W obu przypadkach jednostką kąta, którą można uzyskać, są radiany. Aby przeliczyć kąt na stopnie, należy użyć funkcji math.degrees().
print(math.degrees(cmath.phase(c)))
# 45.0
Polarna transformacja współrzędnych liczb zespolonych (formalna reprezentacja biegunowa): math, cmathmoduł
Jak wspomniano powyżej, można uzyskać wartość bezwzględną (magnitudę) i deklinację (fazę) liczby zespolonej, ale używając funkcji cmath.polar(), można je uzyskać razem jako tuple (wartość bezwzględna, deklinacja).
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
Konwersji ze współrzędnych biegunowych na kartezjańskie dokonuje się za pomocą funkcji cmath.rect(). cmath.rect(wartość bezwzględna, odchylenie) i podobnych argumentów można użyć do uzyskania wartości równoważnych typowi złożonemu complex.
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)
Części rzeczywista i urojona są równoważne wynikom obliczonym za pomocą funkcji cosinus math.cos() i sinus math.sin() na podstawie wartości bezwzględnych i kątów deklinacji.
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
Obliczanie liczb zespolonych (kwadratura, potęgi, pierwiastki kwadratowe)
Można wykonać cztery operacje arytmetyczne i obliczenia potęgowe przy użyciu zwykłych operatorów arytmetycznych.
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)
Pierwiastek kwadratowy można obliczyć za pomocą **0,5, ale wprowadza to błąd. Do obliczenia dokładnej wartości można użyć funkcji cmath.sqrt().
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
Może również wykonywać operacje arytmetyczne na typach złożonych, typach int i float.
print(c1 + 3)
# (6+4j)
print(c1 * 0.5)
# (1.5+2j)