Implementacja liczb zespolonych w Pythonie

Liczby zespolone są powszechnie stosowane w matematyce i inżynierii, a Python oferuje wbudowaną obsługę tych liczb, co czyni ten język doskonałym narzędziem do pracy z liczbami zespolonymi. Python posiada wsparcie dla liczb zespolonych w standardowej bibliotece, umożliwiając łatwe wykonywanie operacji arytmetycznych oraz stosowanie funkcji matematycznych na liczbach zespolonych.

Podstawy liczb zespolonych w Pythonie

W Pythonie liczby zespolone są reprezentowane jako obiekty typu complex, który przechowuje część rzeczywistą i urojoną liczby zespolonej. Liczba zespolona jest zapisywana jako a + bj, gdzie a to część rzeczywista, a b to część urojona.

Oto kilka podstawowych przykładów tworzenia i operowania na liczbach zespolonych w Pythonie:

Tworzenie liczb zespolonych

Aby utworzyć liczbę zespoloną, wystarczy użyć składni a + bj lub funkcji complex():

# Tworzenie liczby zespolonej bezpośrednio
z1 = 3 + 4j
# Tworzenie liczby zespolonej za pomocą funkcji complex()
z2 = complex(2, -3)
print(z1) # Output: (3+4j)
print(z2) # Output: (2-3j)

Dostęp do części rzeczywistej i urojonej

Część rzeczywista i urojona liczby zespolonej mogą być uzyskane za pomocą atrybutów real i imag:

z = 5 + 6j
# Część rzeczywista
print(z.real) # Output: 5.0
# Część urojona
print(z.imag) # Output: 6.0

Podstawowe operacje arytmetyczne

Python obsługuje standardowe operacje arytmetyczne na liczbach zespolonych, takie jak dodawanie, odejmowanie, mnożenie i dzielenie:

z1 = 3 + 4j
z2 = 1 - 2j
# Dodawanie
z_sum = z1 + z2
print(z_sum) # Output: (4+2j)
# Odejmowanie
z_diff = z1 - z2
print(z_diff) # Output: (2+6j)
# Mnożenie
z_prod = z1 * z2
print(z_prod) # Output: (11+2j)
# Dzielenie
z_div = z1 / z2
print(z_div) # Output: (-1.4+1.2j)

Zaawansowane operacje na liczbach zespolonych

Python umożliwia także wykonywanie bardziej zaawansowanych operacji na liczbach zespolonych, takich jak obliczanie modułu, argumentu, sprzężenia zespolonego oraz operacje przy użyciu funkcji trygonometrycznych i wykładniczych.

Moduł i argument liczby zespolonej

Moduł liczby zespolonej to jej odległość od zera na płaszczyźnie zespolonej, a argument to kąt, jaki tworzy liczba zespolona z osią rzeczywistą. Python oferuje funkcje abs() do obliczania modułu oraz cmath.phase() do obliczania argumentu:

import cmath
z = 3 + 4j
# Moduł liczby zespolonej
modulus = abs(z)
print(modulus) # Output: 5.0
# Argument liczby zespolonej
argument = cmath.phase(z)
print(argument) # Output: 0.9272952180016122 (w radianach)

Sprzężenie zespolone

Sprzężenie liczby zespolonej polega na zmianie znaku części urojonej. W Pythonie sprzężenie liczby zespolonej można uzyskać za pomocą metody conjugate():

z = 3 + 4j
# Sprzężenie zespolone
z_conjugate = z.conjugate()
print(z_conjugate) # Output: (3-4j)

Funkcje trygonometryczne i wykładnicze

Biblioteka cmath w Pythonie zawiera funkcje do obliczania wartości trygonometrycznych, wykładniczych i logarytmicznych dla liczb zespolonych:

import cmath
z = 1 + 1j
# Sinus liczby zespolonej
sin_z = cmath.sin(z)
print(sin_z) # Output: (1.2984575814159773+0.6349639147847361j)
# Kosinus liczby zespolonej
cos_z = cmath.cos(z)
print(cos_z) # Output: (0.8337300251311491-0.9888977057628651j)
# Exponential liczby zespolonej
exp_z = cmath.exp(z)
print(exp_z) # Output: (1.4686939399158851+2.2873552871788423j)

Przykładowe zastosowania liczb zespolonych w Pythonie

W tej sekcji przedstawimy kilka przykładowych zastosowań liczb zespolonych w praktyce, aby lepiej zrozumieć, jak te operacje mogą być użyte w różnych dziedzinach.

Przykład 1: Rozwiązywanie równań kwadratowych z liczbami zespolonymi

Równania kwadratowe mogą mieć zespolone pierwiastki, gdy ich wyróżnik (delta) jest ujemny. Poniżej znajduje się implementacja rozwiązania równania kwadratowego w Pythonie, które obsługuje liczby zespolone:

import cmath
def solve_quadratic(a, b, c): # Oblicz deltę delta = cmath.sqrt(b**2 - 4*a*c) # Oblicz dwa rozwiązania x1 = (-b + delta) / (2 * a) x2 = (-b - delta) / (2 * a) return x1, x2
# Przykład z liczbami zespolonymi
a = 1
b = 2
c = 5
x1, x2 = solve_quadratic(a, b, c)
print(f"Pierwiastki równania to: {x1} i {x2}")
# Output: Pierwiastki równania to: (-1+2j) i (-1-2j)

Przykład 2: Analiza sygnału za pomocą FFT

Fast Fourier Transform (FFT) jest algorytmem używanym do analizy sygnałów i przekształcania ich z domeny czasowej na domenę częstotliwościową. Liczby zespolone są kluczowe w FFT, ponieważ pozwalają na reprezentowanie zarówno amplitudy, jak i fazy sygnału.

import numpy as np
import matplotlib.pyplot as plt
# Przykładowy sygnał: suma dwóch sinusów
Fs = 500 # częstotliwość próbkowania
T = 1/Fs # okres próbkowania
t = np.arange(0, 1, T) # wektor czasu
f1 = 50 # częstotliwość pierwszego sygnału
f2 = 120 # częstotliwość drugiego sygnału
y = np.sin(2*np.pi*f1*t) + 0.5*np.sin(2*np.pi*f2*t) # sygnał
# Wykonaj FFT
n = len(y) # długość sygnału
yf = np.fft.fft(y) # transformacja FFT
xf = np.fft.fftfreq(n, T) # częstotliwości odpowiadające wartościom FFT
# Wyświetl sygnał w dziedzinie czasu i częstotliwości
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.plot(t, y)
plt.title('Sygnał w dziedzinie czasu')
plt.xlabel('Czas [s]')
plt.ylabel('Amplituda')
plt.subplot(122)
plt.stem(xf, np.abs(yf), use_line_collection=True)
plt.title('Widmo sygnału')
plt.xlabel('Częstotliwość [Hz]')
plt.ylabel('Amplituda')
plt.show()

W powyższym przykładzie stworzyliśmy sygnał będący sumą dwóch sinusoid o różnych częstotliwościach (50 Hz i 120 Hz). Następnie wykonaliśmy FFT, aby przekształcić sygnał z domeny czasowej do domeny częstotliwościowej. Transformacja FFT zwraca wartości zespolone, które reprezentują amplitudy i fazy różnych składowych częstotliwościowych sygnału.

Wykresy pokazują sygnał w dziedzinie czasu oraz jego widmo w dziedzinie częstotliwości. Widmo ujawnia dwie wyraźne składowe częstotliwościowe, które odpowiadają sygnałom sinusoidalnym o częstotliwościach 50 Hz i 120 Hz. Dzięki FFT możemy łatwo zidentyfikować dominujące częstotliwości w sygnale, co jest niezwykle przydatne w wielu aplikacjach, takich jak analiza sygnałów audio, badanie drgań mechanicznych, oraz w przetwarzaniu danych w dziedzinie telekomunikacji.

Biblioteka numpy.fft oferuje funkcje takie jak fft do szybkiej transformacji Fouriera oraz fftfreq do obliczania częstotliwości odpowiadających wartościom FFT, co czyni analizę sygnałów wygodną i efektywną.