90 KiB
Ćwiczenia 5
_TEMAT: transformata Fouriera
Od szeregów Fouriera do transformaty Fouriera: idea
_Przypomnienie:
Szereg Fouriera dla funkcji $2\pi$ okresowej $f$ to szereg
$$ \sum_{n=-\infty}^\infty c_ne^{inx}, $$
gdzie dla każdego $n\in\mathbb{Z}$ mamy:
$$ c_n=\frac{1}{2\pi}\int_{-\pi}^\pi f(x)e^{-inx}dx. $$
_Idea: przedstawiamy funkcję $f$ jako sumę funkcji o okresach $2\pi/n$ (odwrotnością okresu w fizyce jest częstotliwość, zatem te funkcje mają częstotliwość $\frac{n}{2\pi}$). Wielkość $|c_n|$ mierzy zatem "jaki udział" w rozkładzie $f$ na prostsze kawałki ma ten o częstotliwości $\frac{n}{2\pi}$.
_Zmiana okresu:
Szereg Fouriera dla funkcji $T$ okresowej $f$ to szereg
$$ \sum_{n=-\infty}^\infty c_ne^{2\pi inx/T}, $$
gdzie dla każdego $n\in\mathbb{Z}$ mamy:
$$ c_n=\frac{1}{T}\int_{-T/2}^{T/2} f(x)e^{-2\pi inx/T}dx. $$ _Idea: przedstawiamy funkcję $f$ jako sumę funkcji o okresach $T/n$. Wielkość $|c_n|$ mierzy zatem "jaki udział" w rozkładzie $f$ na prostsze kawałki ma ten o częstotliwości $n/T$.
Przykład
Niech $f$ będzie funkcją taką, że $f(x)=1$ dla $|x|\leq 1/2$ i $0$ dla $|x|>1/2$.
Dla dużych $T$ niech $g$ będzie taką funkcją określoną wzorem
$$ g(x)=\begin{cases} 1, & x\in [nT-1/2,nT+1/2],\quad n\in \mathbb{Z}\\ 0, & \text{ w przeciwnym przypadku}. \end{cases} $$ Jest jasne, że $g$ jest $T$ okresowa i pokrywa się z $f$ na przedziale $(-1/2,1/2)$.
Policzymy współczynniki Fouriera dla funkcji $g$. Mamy
$$ c_0=\frac{1}{T}\int_{-T/2}^{T/2}g(x)dx=\frac{1}{T}\int_{-1/2}^{1/2}1dx=\frac{1}{T} $$
oraz dla $n\not=0$
$$ c_n=\frac{1}{T}\int_{-T/2}^{T/2} g(x)e^{-2\pi inx/T}dx=\frac{1}{T}\int_{-1/2}^{1/2}e^{-2\pi inx/T}dx= -\frac{1}{2\pi in}e^{-2\pi inx/T}\bigg|_{-1/2}^{1/2}=\frac{1}{2\pi in}(e^{\pi i n/T}-e^{-\pi i n/T})=\frac{1}{\pi n}\sin\left(\frac{\pi n}{T}\right). $$
Przypomnijmy, że idea jest następująca: wielkość $|c_n|$ mierzy zatem "jaki udział" w rozkładzie $f$ na prostsze kawałki ma ten o częstotliwości $n/T$. Poniżej zobaczymy zbiór punktów o współrzędnych
$$ \left(\frac{n}{T}, T c_n\right). $$
import numpy as np
import matplotlib.pyplot as plt
# Set the value of T
T = 10 # You can change this to any other positive value you want
# Create a range for n from -10*T to T
n_values = np.arange(-10*T, 10*T + 1, 1) # Use np.arange to include T
# Calculate x and y coordinates
x_values = n_values / T
y_values = np.where(n_values != 0, (T / (np.pi * n_values)) * np.sin(np.pi * n_values / T), 0)
# Create the plot
plt.figure(figsize=(10, 6))
plt.plot(x_values, y_values, 'bo', markersize=2) # 'bo' for blue circles only
plt.title('Plot of the Points')
plt.xlabel('n/T')
plt.ylabel('1/(πn) * sin(πn/T)')
plt.axhline(0, color='black', linewidth=0.5, ls='--')
plt.axvline(0, color='black', linewidth=0.5, ls='--')
plt.grid()
plt.ylim([-0.5, 1.5]) # Set limits for better visualization
plt.xlim([-10, 10]) # Adjust according to your needs
plt.show()
/var/folders/sd/yf84dc5d32vcg5xdf0mng9xw0000gn/T/ipykernel_1001/2269295719.py:12: RuntimeWarning: divide by zero encountered in divide y_values = np.where(n_values != 0, (T / (np.pi * n_values)) * np.sin(np.pi * n_values / T), 0) /var/folders/sd/yf84dc5d32vcg5xdf0mng9xw0000gn/T/ipykernel_1001/2269295719.py:12: RuntimeWarning: invalid value encountered in multiply y_values = np.where(n_values != 0, (T / (np.pi * n_values)) * np.sin(np.pi * n_values / T), 0)
Transformata Fouriera
_Transformatą Fouriera funkcji $f$ nazywamy funkcję $F$ określoną wzorem:
$$ F(x) = \int_{-\infty}^{\infty} f(t) e^{-i x t} , dt . $$
_Uwaga: Jeżeli $$\int\limits_{-\infty}^{\infty}|f(x)|dx<\infty,$$ to funkcja $F(x)$ jest poprawnie określona i jest jednostajnie ciągła.
Zadanie 1
Niech $f$ będzie funkcją taką, że $f(x)=1$ dla $|x|\leq 1/2$ i $0$ dla $|x|>1/2$. Policzymy jej transformatę Fouriera.
_Rozwiązanie:
Mamy:
$$ F(0)=\int_{-\infty}^{\infty} f(t), dt=\int_{-1/2}^{1/2}1dt=1 $$ a dla $x\not =0$ mamy
$$ F(x)=\int_{-\infty}^{\infty} f(t)e^{-ixt}, dt=\int_{-1/2}^{1/2}e^{-ixt}dt=\frac{1}{-ix}e^{-ixt}\bigg|_{-1/2}^{1/2} =\frac{1}{-ix}\left(e^{-ix/2}-e^{ix/2} \right)=\frac{2\sin(x/2)}{x}. $$
_Uwaga: porównaj poniższy wykres z tym co było poprzednio. Zmiana skali na osi "x" wzięła się z przyjętej przez nas definicji transformaty Fouriera.
import numpy as np
import matplotlib.pyplot as plt
# Define the range for x from -10 to 10
x_values = np.linspace(-100, 100, 400)
# Calculate y values while handling the singularity at x = 0
y_values = np.where(x_values != 0, (2 * np.sin(x_values / 2)) / x_values, 1) # Limit as x->0 is 1
# Create the plot
plt.figure(figsize=(10, 6))
plt.plot(x_values, y_values, 'b-', lw=2) # 'b-' for blue line
plt.title(r'Plot of $\frac{2\sin(\pi x)}{x}$ from -10 to 10')
plt.xlabel('x')
plt.ylabel(r'$\frac{2\sin(x/2)}{x}$')
plt.axhline(0, color='black', linewidth=0.5, ls='--')
plt.axvline(0, color='black', linewidth=0.5, ls='--')
plt.grid()
plt.ylim([-1.5, 1.5]) # Set limits for better visualization
plt.xlim([-100, 100]) # Set x-axis range
plt.show()
Zadanie 2
Niech $f\colon\mathbb{R}\to\mathbb{R}$ będzie funkcją różniczkowalną taką, że $f$ ma wartość $0$ poza przedziałem $[a,b]$. Niech $F$ będzie transformatą Fouriera dla funkcji $f$. Wyznaczymy transformatę Fouriera funkcji $f'$.
Rozwiązanie:
Z definicji transformata Fouriera funkcji $f'$ w punkcie $x$ jest równa
$$ \int_{-\infty}^\infty f'(t)e^{-ixt}dt=\int_a^bf'(t)e^{-ixt}dt. $$
Ze wzoru na całkowanie przez części otrzymujemy, że
$$ \int f'(t)e^{-ixt}dt=f(t)e^{-ixt}+ix \int f(t)e^{-ixt}dt $$
Zatem (ponieważ $f(a)=0$ i $f(b)=0$)
$$ \int_{-\infty}^\infty f'(t)e^{-ixt}dt=\int_b^b f'(t)e^{-ixt}dt=f(t)e^{-ixt}|_a^b+ix \int_a^b f(t)e^{-ixt}dt =ix\int
_Uwaga: powyższa obserwacja ma fundamentalne znaczenie dla równań różniczkowych: transformata Fouriera zamienia różniczkowanie na operację mnożenia przez wielomian.