diff --git a/semester3/numcs/numcs-summary.pdf b/semester3/numcs/numcs-summary.pdf index 36c3571..7a55833 100644 Binary files a/semester3/numcs/numcs-summary.pdf and b/semester3/numcs/numcs-summary.pdf differ diff --git a/semester3/numcs/parts/01_interpolation/01_trigonometric/00_fourier.tex b/semester3/numcs/parts/01_interpolation/01_trigonometric/00_fourier.tex index 773c184..762b0ec 100644 --- a/semester3/numcs/parts/01_interpolation/01_trigonometric/00_fourier.tex +++ b/semester3/numcs/parts/01_interpolation/01_trigonometric/00_fourier.tex @@ -67,6 +67,7 @@ Dann verwandeln sich die Integrale in die Form $\frac{1}{T} \int_{\frac{T}{2}}^{ \inlinedef Eine Funktion $f$ ist der $L^2$-Grenzwert von Funktionenfolgen $f_n \in L^2(0, 1)$, wenn für $n \rightarrow \infty$ gilt, dass $||f - f_n||_{L^2(0, 1)} \rightarrow 0$ +\newpage \begin{theorem}[]{Fourier-Reihe} Jede Funktion $f \in L^2(0, 1)$ ist der Grenzwert ihrer Fourier-Reihe: \rmvspace diff --git a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/00_intro.tex b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/00_intro.tex index ebbd331..746a273 100644 --- a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/00_intro.tex +++ b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/00_intro.tex @@ -22,6 +22,7 @@ Der Beweis hierfür ist im Skript auf p. $71$. Die $N$-te Einheitswurzel wird hi \fancydef{$N$-te Einheitswurzel} $\omega_N := \exp(\frac{-2\pi i}{N})$ \fancyremark{Eigenschaften von $\omega_N$} +\vspace{-1.5pc} \begin{multicols}{3} \begin{align*} \forall j,k \in \mathbb{Z}:\quad & \omega_N^{k+jN}=\omega_N^k \\ @@ -42,4 +43,5 @@ Der Beweis hierfür ist im Skript auf p. $71$. Die $N$-te Einheitswurzel wird hi \end{cases} \end{align*} \newcolumn -\end{multicols} \ No newline at end of file +\end{multicols} +\vspace{-1.5pc} diff --git a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/01_construction.tex b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/01_construction.tex index e3da10a..7d0ec22 100644 --- a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/01_construction.tex +++ b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/01_construction.tex @@ -2,54 +2,57 @@ Wir definieren die Trigonometrische Basis. Den Basiswechsel zu dieser Basis nennen wir diskrete Fourier Transformation. -\fancydef{Trigonometrische Basis}\\ +\fancydef{Trigonometrische Basis}\\ \begin{align*} - \{v_0, v_{N-1}\} \text{ ist eine Basis von } \mathbb{C}^N, \text{ wobei } v_k = + \{v_0, \ldots, v_{N-1}\} \text{ ist eine Basis von } \mathbb{C}^N, \text{ wobei } v_k = \begin{bmatrix} - \omega_N^{0\cdot k} \\ \omega_N^{1\cdot k}1 \\ \vdots \\ \omega_N^{(N-1)\cdot k} - \end{bmatrix} + \omega_N^{0\cdot k} \\ \omega_N^{1\cdot k} \\ \vdots \\ \omega_N^{(N-1)\cdot k} + \end{bmatrix} \in \mathbb{C}^N \end{align*} Die symmetrische, nicht hermitesche Matrix $V = [v_0,\ \ldots\ , v_{N-1}]$ ist eine orthogonale Basis für $\mathbb{C}^N$: $V^HV = N\cdot I_N$.\\ -Ebenfalls ist $V$ die Basiswechsel Matrix Trigonometrische Basis ($z$) $\mapsto$ Standardbasis ($y$).\\ +Ebenfalls ist $V$ die Basiswechsel Matrix Trigonometrische Basis ($z$) $\mapsto$ Standardbasis ($y$).\\ An Hand von $V$ definieren wir gleich die Fourier-Matrix $F_N$. \begin{align*} y = Vz \implies z = V^{-1}y = \frac{1}{N}V^Hy = \frac{1}{N}\underbrace{F_N}_{:= V^H} y \end{align*} Der Eintrag $y_l$ enstspricht einem Glied der Fourier-Reihe ausgewertet in $\frac{l}{N} \in [0,1)$. \\ -Die diskreten Fourier-Koeffizienten $\gamma_k$ sind eine Umsortierung der trigonometrischen Basis Koeffizienten. +Die diskreten Fourier-Koeffizienten $\gamma_k$ sind eine Umsortierung der Koeffizienten der trigonometrischen Basis. \begin{multicols}{2} -\begin{align*} - y = \underbrace{\sum_{k=0}^{N-1} y_k e_{k+1}}_{y \text{ in Komponenten}} = \underbrace{\sum_{k=0}^{N-1} z_k v_k}_{\text{in Trig. Basis}} = \sum_{k=0}^{N-1} z_k \begin{bmatrix} - \omega_N^{0 \cdot k} \\ \omega_N^{1 \cdot k} \\ \omega_N^{2 \cdot k} \\ \vdots \\ \omega_N^{(N-1) \cdot k} - \end{bmatrix} -\end{align*} -\newcolumn + \begin{align*} + y = \underbrace{\sum_{k=0}^{N-1} y_k e_{k+1}}_{y \text{ in Komponenten}} = \underbrace{\sum_{k=0}^{N-1} z_k v_k}_{\text{in Trig. Basis}} = \sum_{k=0}^{N-1} z_k + \begin{bmatrix} + \omega_N^{0 \cdot k} \\ \omega_N^{1 \cdot k} \\ \omega_N^{2 \cdot k} \\ \vdots \\ \omega_N^{(N-1) \cdot k} + \end{bmatrix} + \end{align*} + \newcolumn -\begin{align*} - y_l &= \sum_{k=0}^{N-1} z_k \omega_N^{l \cdot k} \overset{\text{S. 75}}{=} \sum_{k=-N/2}^{N/2-1} \gamma_k \cdot \exp(\frac{2\pi i}{N}lk) \\ - \text{wobei }\gamma_k &= \begin{cases} - z_k, & 0 < k \leq \frac{N}{2}-1 \\ - z_k+N, & -\frac{N}{2} \leq k < 0 - \end{cases} -\end{align*} + \begin{align*} + y_l & = \sum_{k=0}^{N-1} z_k \omega_N^{l \cdot k} \overset{\text{S. 75}}{=} \sum_{k=-N/2}^{N/2-1} \gamma_k \cdot \exp(\frac{2\pi i}{N}lk) \\ + \text{wobei }\gamma_k & = + \begin{cases} + z_k, & 0 < k \leq \frac{N}{2}-1 \\ + z_k+N, & -\frac{N}{2} \leq k < 0 + \end{cases} + \end{align*} \end{multicols} -\fancydef{Fourier-Matrix}\\ +\fancydef{Fourier-Matrix} \begin{align*} - F_N := V^H = [v_0, \ldots, v_{N-1}]^H = \begin{bmatrix} - \omega_N^0 & \omega_N^0 & \cdots & \omega_N^0 \\ - \omega_N^0 & \omega_N^1 & \cdots & \omega_N^{N-1} \\ - \omega_N^0 & \omega_N^2 & \cdots & \omega_N^{2(N-1)} \\ - \vdots & \vdots & & \vdots \\ - \omega_N^0 & \omega_N^{N-1} &\cdots & \omega_N^{(N-1)^2} + F_N := V^H = [v_0, \ldots, v_{N-1}]^H = + \begin{bmatrix} + \omega_N^0 & \omega_N^0 & \cdots & \omega_N^0 \\ + \omega_N^0 & \omega_N^1 & \cdots & \omega_N^{N-1} \\ + \omega_N^0 & \omega_N^2 & \cdots & \omega_N^{2(N-1)} \\ + \vdots & \vdots & & \vdots \\ + \omega_N^0 & \omega_N^{N-1} & \cdots & \omega_N^{(N-1)^2} \end{bmatrix} - = + = \begin{bmatrix} \omega_N^{jk} - \end{bmatrix}^{N-1}_{j,k = 0} + \end{bmatrix}^{N-1}_{j,k = 0} \in \mathbb{C}^{N\times N} \end{align*} diff --git a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/02_fftshift.tex b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/02_fftshift.tex index 4989c0b..1a927ef 100644 --- a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/02_fftshift.tex +++ b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/02_fftshift.tex @@ -1,25 +1,26 @@ \subsubsection{DFT in Numpy} Sei $y$ in der Standardbasis, und $c = \mathcal{F}_N(y)$, also $y$ in der trig. Basis. -$$ - c = F_N \times y = \verb|fft|(y)\quad \textit{(DFT in numpy)} \quad \quad \quad y = \frac{1}{N}F_N^Hc = \verb|ifft|(c)\quad \textit{(Inverse DFT in numpy)} -$$ +\begin{align*} + c = F_N \times y = \texttt{fft}(y)\quad \text{\textit{(DFT in numpy)}} & y = \frac{1}{N}F_N^Hc = \texttt{ifft}(c)\quad \textit{(Inverse DFT in numpy)} +\end{align*} Um zur ursprünglichen Darstellung des trig. Polynoms zurück zu kommen, müssen wir die Koeffizienten umsortieren: \\ -Seien $z = \frac{1}{N} F_N y$ und $\zeta = \verb|fft.fftshift|(z)$. +Seien $z = \frac{1}{N} F_N y$ und $\zeta = \verb|fft.fftshift|(z)$. \begin{align*} f(x) \approx \underbrace{\sum_{k=-N/2}^{N/2-1} \zeta_k \cdot e^{2 \pi ikx} }_{\text{Form des trig. Polynoms}} \end{align*} \setcounter{all}{13} \inlineremark Man kann mit dieser Approximation einfach die $L^2$-Norm und Ableitungen berechnen: +\vspace{-1.5pc} \begin{multicols}{2} -\begin{align*} - ||f||^2_{L^2} \approx \left\Vert \sum_{k=-N/2}^{N/2-1} \zeta_k \cdot e^{2 \pi ikx} \right\Vert^2_{L^2} = \sum_{k=-N/2}^{N/2-1} |\zeta_k|^2 = \Vert z \Vert^2_{L^2} -\end{align*} + \begin{align*} + ||f||^2_{L^2} \approx \left\Vert \sum_{k=-N/2}^{N/2-1} \zeta_k \cdot e^{2 \pi ikx} \right\Vert^2_{L^2} = \sum_{k=-N/2}^{N/2-1} |\zeta_k|^2 = \Vert z \Vert^2_{L^2} + \end{align*} -\newcolumn + \newcolumn -\begin{align*} - f'(t) \approx \sum_{k=-N/2}^{N/2-1} (2\pi ik) \zeta_k \cdot e^{2 \pi ikx} -\end{align*} -\end{multicols} \ No newline at end of file + \begin{align*} + f'(t) \approx \sum_{k=-N/2}^{N/2-1} (2\pi ik) \zeta_k \cdot e^{2 \pi ikx} + \end{align*} +\end{multicols} diff --git a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/03_linalg.tex b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/03_linalg.tex index 73b9fad..7f4ce93 100644 --- a/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/03_linalg.tex +++ b/semester3/numcs/parts/01_interpolation/01_trigonometric/01_dft/03_linalg.tex @@ -56,7 +56,7 @@ Die Shift Matrix $S_N$ ist der Zirkulant für $c=e_2$. $S_N$ ist eine Permutatio Die Shift-Matrix hat einen speziellen Bezug zu den Spaltenvektoren $v_k$ von $F_N$, und auch allen anderen Zirkulanten $C$. -\inlineremark Der $k$-te Fourier-vektor $v_k$ ist ein Eigenvektor von $S_N$ zu $\lambda_k = e^{2\pi i \frac{k}{N}}$. +\inlineremark Der $k$-te Fourier-Vektor $v_k$ ist ein Eigenvektor von $S_N$ zu $\lambda_k = e^{2\pi i \frac{k}{N}}$. \fancytheorem{Diagonalisierung von Zirkulanten} Die Eigenvektoren von $S_N$ diagonalisieren jeden Zirkulanten $C$, und sind d.h. auch die Eigenvektoren von $C$. Die Eigenwerte erhält man aus $p(z) = c_0z^0 + \ldots + c_{N-1}z^{N-1}$. @@ -101,4 +101,4 @@ Im Fall von $T$-periodischen Funktionen gilt: $(g * h)(x) = \frac{1}{T}\displays Man erhält so letzendlich das Faltungs-Theorem: Die $F_N$-Transformierte einer Faltung ist genau das gleiche wie die Multiplikation zweier $F_N$-Transormierten. Da die DFT in $\mathcal{O}(n\log(n))$ (Kap. 3.3) geht, gilt dies nun auch für die Faltung. \begin{align*} F_Nc = \text{diag}(F_N a) F_N b -\end{align*} \ No newline at end of file +\end{align*} diff --git a/semester3/numcs/parts/01_interpolation/01_trigonometric/03_interpolation/00_intro.tex b/semester3/numcs/parts/01_interpolation/01_trigonometric/03_interpolation/00_intro.tex index 78f24e3..90e1991 100644 --- a/semester3/numcs/parts/01_interpolation/01_trigonometric/03_interpolation/00_intro.tex +++ b/semester3/numcs/parts/01_interpolation/01_trigonometric/03_interpolation/00_intro.tex @@ -45,15 +45,15 @@ Unten findet sich Python code der mit den unterschiedlichen Methoden die Koeffiz \rmvspace \begin{code}{python} def get_coeff_trig_poly(t: np.ndarray, y: np.ndarray): - N = y.shape[0] - if N % 2 == 1: - n = (N - 1.0) / 2.0 - M = np.exp(2 * np.pi * 1j * np.outer(t, np.arange(-n, n + 1))) - else: - n = N / 2.0 - M = np.exp(2 * np.pi * 1j * np.outer(t, np.arange(-n, n))) - c = np.linalg.solve(M, y) - return c + N = y.shape[0] + if N % 2 == 1: + n = (N - 1.0) / 2.0 + M = np.exp(2 * np.pi * 1j * np.outer(t, np.arange(-n, n + 1))) + else: + n = N / 2.0 + M = np.exp(2 * np.pi * 1j * np.outer(t, np.arange(-n, n))) + c = np.linalg.solve(M, y) + return c N = 2**12 t = np.linspace(0, 1, N, endpoint=False)