RepozytoriumzprojektemPython/stopy/Ćwiczenia_5.ipynb
2024-11-06 08:25:50 +01:00

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.