diff --git a/.gitignore b/.gitignore index 3fe5ded..a387d0e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ *.synctex* *.fdb_latexmk *.toc +*.dat diff --git a/sose2020/la/uebungen/la6.pdf b/sose2020/la/uebungen/la6.pdf index ac4eb48..472c97a 100644 Binary files a/sose2020/la/uebungen/la6.pdf and b/sose2020/la/uebungen/la6.pdf differ diff --git a/sose2020/la/uebungen/la6.tex b/sose2020/la/uebungen/la6.tex index 617afa3..9e2d267 100644 --- a/sose2020/la/uebungen/la6.tex +++ b/sose2020/la/uebungen/la6.tex @@ -57,15 +57,14 @@ im folgenden mit $\overline{\cdot }$ bezeichnet. Aus dem Argument ist immer klar, welche Äquivalenzrelation gemeint ist. \begin{enumerate}[(a)] - \item Beh.: $M / IM$ ist mit der natürlichen Addition und der angegebenen skalaren - Mult. $R / I$-Modul. - \begin{proof} - Die skalare Multiplikation sei mit $(*)$ bezeichnet. - \begin{align*} + \item Skalare Multiplikation ($*$):\begin{align*} R / I \times M / IM &\to M / IM\\ (\overline{a}, \overline{m}) &\mapsto \overline{a} \cdot \overline{m} \coloneqq \overline{a \cdot m} \quad (*) .\end{align*} - Zunächst zu zeigen, dass $(*)$ wohldefiniert ist. Dazu seien + Beh.: $M / IM$ ist mit der natürlichen Addition und der angegebenen skalaren + Mult. ($*$) $R / I$-Modul. + \begin{proof} + Zunächst ist zu zeigen, dass $(*)$ wohldefiniert ist. Dazu seien $a, b \in R$ und $x, y \in M$ mit $a + I = b + I$ und $x + IM = y + IM$. \begin{itemize} @@ -128,7 +127,7 @@ \item Z.z: $\overline{\varphi}$ wohldefiniert. Seien $m_1, m_2 \in M$ mit $m_1 = m_2$. Dann folgt $m_1 - m_2 \in IM$. Also ex. ein $(a_i)_{i \in J} \in I^{(J)}$ und - $(m_i)_{i \in J} \in M^{(J)}$ mit $m_1 - m 2 = \sum_{i \in J} a_i m_i$. + $(m_i)_{i \in J} \in M^{(J)}$ mit $m_1 - m_2 = \sum_{i \in J} a_i m_i$. Damit folgt \[ \varphi(m_1) - \varphi(m_2) = \varphi(m_1 - m_2) @@ -186,6 +185,8 @@ $t+1$ bis auf Assoziiertheit eind. bestimmter Erzeuger von $(t+1)$. Da $\text{deg}(t+1) = 1 > 0 = \text{deg}(1)$ und $\Q[t]$ nullteilerfrei, folgt $1 \not\in (t+1)$, also $S_1$ kein ES. + + Analog für $S_2 \coloneqq \{t^2 + 1\} $. \end{itemize} \end{proof} Beh.: $S$ ist keine Basis. @@ -194,7 +195,7 @@ \[ \left( \frac{1}{2}(t+1) \right) (t^2+1) + \left( t - \frac{1}{2} (t+1)^2 \right) (t+1) = 0 ,\] aber $\frac{1}{2}(t+1) \neq 0 \neq t - \frac{1}{2}(t+1)^2$, also - $t+1$ und $t^2+1$ l.a. in $Q[t]$ als $Q[t]$-Modul, also $S$ keine Basis. + $t+1$ und $t^2+1$ l.a. in $\Q[t]$ als $\Q[t]$-Modul, also $S$ keine Basis. \end{proof} \end{aufgabe} diff --git a/sose2020/num/uebungen/num6.pdf b/sose2020/num/uebungen/num6.pdf new file mode 100644 index 0000000..e84fd15 Binary files /dev/null and b/sose2020/num/uebungen/num6.pdf differ diff --git a/sose2020/num/uebungen/num6.tex b/sose2020/num/uebungen/num6.tex new file mode 100644 index 0000000..a93195b --- /dev/null +++ b/sose2020/num/uebungen/num6.tex @@ -0,0 +1,270 @@ +\documentclass[uebung]{../../../lecture} + +\author{Leon Burgard, Christian Merten} +\title{Einführung in die Numerik: Übungsblatt 6} + +\usepackage[]{gauss} +\usepackage{blkarray, bigstrut} + +\begin{document} + +\punkte + +\begin{aufgabe} + \begin{itemize} + \item + Berechnung der LU-Zerlegung. Es ist + \begin{align*} + PA = \begin{gmatrix}[p] -2 & 6 & 3 & 10 \\ + 0 & -4 & 10 & \frac{15}{2} \\ + 2 & -6 & 7 & -\frac{11}{2} \\ + -2 & 10 & -12 & 0 + \rowops + \add{0}{2} + \add[-1]{0}{3} + \end{gmatrix} + \sim + \begin{gmatrix}[p] + -2 & 6 & 3 & 10 \\ + 0 & -4 & 10 & \frac{15}{2} \\ + 0 & 0 & 10 & \frac{9}{2} \\ + 0 & 4 & -15 & -10 + \rowops + \add{1}{3} + \end{gmatrix} + \\\sim + \begin{gmatrix}[p] + -2 & 6 & 3 & 10 \\ + 0 & -4 & 10 & \frac{15}{2} \\ + 0 & 0 & 10 & \frac{9}{2} \\ + 0 & 0 & -5 & -\frac{5}{2} + \rowops + \add[\frac{1}{2}]{2}{3} + \end{gmatrix} + \sim + \begin{gmatrix}[p] + -2 & 6 & 3 & 10 \\ + 0 & -4 & 10 & \frac{15}{2} \\ + 0 & 0 & 10 & \frac{9}{2} \\ + 0 & 0 & 0 & -\frac{1}{4} + \end{gmatrix} + =: U + .\end{align*} + $L$ ergibt sich durch die Faktoren der Zeilenoperationen, also + \begin{align*} + L = \begin{pmatrix} 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + -1 & 0 & 1 & 0 \\ + 1 & -1 & -\frac{1}{2} & 1\end{pmatrix} + .\end{align*} + Damit folgt + \begin{align*} + PA = LU = + \begin{pmatrix} 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + -1 & 0 & 1 & 0 \\ + 1 & -1 & -\frac{1}{2} & 1\end{pmatrix} + \begin{gmatrix}[p] + -2 & 6 & 3 & 10 \\ + 0 & -4 & 10 & \frac{15}{2} \\ + 0 & 0 & 10 & \frac{9}{2} \\ + 0 & 0 & 0 & -\frac{1}{4} + \end{gmatrix} + .\end{align*} +\item Es ist + \[ + \text{det}(PA) = \text{det}(LU) = \text{det}(L) \text{det}(U) = -20 + \implies \text{det}(A) = - \frac{20}{\text{det}(P) } = 20 + .\] + Es ist zunächst $\tilde{e}_1 = P e_1 = e_2$, $\tilde{e}_2 = P e_2 = e_1, \tilde{e}_3 = P e_3 = e_3$ und + $\tilde{e}_4 = P e_4 = e_4$. Damit folgt durch Vorwärtseinsetzen in $Ly_i = \tilde{e}_i$: + \begin{align*} + y_1 = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 1 \end{pmatrix}, + y_2 = \begin{pmatrix} 1 \\ 0 \\ 1 \\ -\frac{1}{2} \end{pmatrix}, + y_3 = \begin{pmatrix} 0 \\ 0 \\ 1 \\ \frac{1}{2} \end{pmatrix}, + y_4 = \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix} + .\end{align*} + Und durch Rückwärtseinsetzen in $R x_i = y_i$ folgt + \begin{align*} + x_1 = \begin{pmatrix} - \frac{541}{20} \\ -\frac{13}{4} \\ \frac{9}{5} \\ -4 \end{pmatrix}, + x_2 = \begin{pmatrix} \frac{271}{20} \\ \frac{7}{4} \\ -\frac{4}{5} \\ 2 \end{pmatrix}, + x_3 = \begin{pmatrix} -\frac{49}{4} \\ -\frac{5}{4} \\ 1 \\ -2 \end{pmatrix}, + x_4 = \begin{pmatrix} -\frac{263}{10} \\ -3 \\ \frac{9}{5} \\ -4\end{pmatrix} + .\end{align*} + Die $x_i$ sind die Spalten von $A^{-1}$, also folgt direkt + \begin{align*} + A^{-1} + = + \begin{pmatrix} + -\frac{541}{20} & \frac{271}{20} & -\frac{49}{4} & -\frac{263}{10} \\ + -\frac{13}{4} & \frac{7}{4} & -\frac{5}{4} & -3 \\ + \frac{9}{5} & - \frac{4}{5} & 1 & \frac{9}{5} \\ + -4 & 2 & -2 & -4 + \end{pmatrix} + .\end{align*} + Damit folgt direkt + \begin{align*} + Ax = b \implies x = A^{-1}b = \begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix} + .\end{align*} +\item Für die Kondition gilt nach VL + \begin{align*} + \text{cond}_{\infty}(A) = \Vert A \Vert_{\infty} \Vert A^{-1} \Vert_\infty + = 24 \cdot 79 \frac{3}{20} = 1899 \frac{3}{5} + .\end{align*} + \end{itemize} +\end{aufgabe} + +\begin{aufgabe} + Sei $T$ wie in der Aufgabe gegeben mit $bc > 0$. + \begin{enumerate}[(a)] + \item Es gilt + \[ + (v_{k})_i = \nu^{i} \sin\left( i \frac{k \pi}{n+1} \right) + .\] Es sei außerdem $(v_{k})_{0} = (v_{k})_{n+1} = 0$. Damit folgt + \[ + (Tv_k)_i = c (v_{k})_{i-1} + a (v_k)_{i} + b (v_{k})_{i+1} + .\] + Es gilt außerdem + \begin{align} + b \nu^{i+1} = b \frac{c^{\frac{i}{2} + \frac{1}{2}}}{b^{\frac{i}{2} + \frac{1}{2}}} + = \frac{c^{\frac{i}{2} + \frac{1}{2}}}{b^{\frac{i}{2} - \frac{1}{2}}} + = c \frac{c^{\frac{i}{2} - \frac{1}{2}}}{b^{\frac{i}{2} - \frac{1}{2}}} = c \nu^{i-1} + .\end{align} + Weiter ist + \begin{salign*} + (\lambda_k v_k)_{i} + &= \left[a + 2b \nu \cos \left( \frac{k\pi}{n+1} \right) \right] + \nu^{i} \sin\left( i \frac{k\pi}{n+1} \right) \\ + &= a \nu^{i} \sin\left( i \frac{k\pi}{n+1} \right) + + 2b\nu^{i+1} \cos\left( \frac{k\pi}{n+1} \right) \sin\left( i \frac{k\pi}{n+1} \right) \\ + &\stackrel{\text{nützl. Formel}}{=} + a (v_{k})_i + b \nu^{i+1} \sin\left( (i+1) \frac{k\pi}{n+1} \right) + + b \nu^{i+1} \sin\left( (i-1) \frac{k\pi}{n+1} \right) \\ + &\stackrel{\text{(1)}}{=} a (v_{k})_i + b (v_{k})_{i+1} + c (v_k)_{i-1} + .\end{salign*} + Damit folgt + \[ + (T v_k)_i = (\lambda_k v_k)_i \implies T v_k = \lambda_k v_k + .\] Also $v_k$ Eigenvektoren zu EW $\lambda_k$. Da $T \in \R^{n \times n}$, sind + die $n$ Eigenwerte $\lambda_k$ alle Eigenwerte von $T$. + \item Beh.: $\text{cond}_2(T) = \mathcal{O}(n^2)$. + \begin{proof} + Für $a = 2$ und $b = c = -1$ ist $T$ symmetrisch. Außerdem gilt für die Eigenwerte + von $T$: + \[ + \lambda_k = 2 -2 \cos\left( \frac{k \pi}{n+1} \right) + .\] Es gilt für $k = 1,\ldots, n$: + \[ + 0 < \frac{k \pi}{n+1} < \pi \implies \left| \cos\left( \frac{k\pi}{n+1} \right) \right| + < 1 \implies \lambda_k > 0 + .\] Also ist $T$ positiv definit. Es gilt weiter + \begin{align*} + \min_{1 \le k \le n} \cos\left( \frac{k\pi}{n+1} \right) + &= \cos\left( \frac{n \pi}{n+1}\right) \\ + \max_{1 \le k \le n} \cos\left( \frac{k \pi}{n+1} \right) &= + \cos\left( \frac{\pi}{n+1} \right) + .\end{align*} + Damit folgt + $\lambda_{\text{min}}(T) = \lambda_{1} = 2 - 2 \cos\left( \frac{\pi}{ n+1} \right) $ + und $\lambda_{\text{max}}(T) = \lambda_{n} = 2 - 2 \cos\left( \frac{n \pi}{ n+1} \right) $. + Da $T$ symmetrisch und positiv definit gilt also + \begin{align*} + \text{cond}_2(T) = \frac{\lambda_{\text{max}}(T)}{\lambda_{\text{min}}(T)} + = \frac{ 1 - \cos\left( \frac{n\pi}{n+1} \right) }{1 - \cos\left( \frac{\pi}{n+1} \right) } + \le + \frac{2}{1 - \cos\left( \frac{\pi}{n+1} \right) } + .\end{align*} + Für $\frac{\pi}{n+1} \xrightarrow{n \to \infty} 0$. Also folgt mit Taylorentwicklung 2. + Ordnung + \[ + \frac{2}{1 - \cos\left( \frac{\pi}{n+1} \right) } + = \frac{2}{1 - \left( 1 - \frac{\pi^2}{2 (n+1)^2} + \mathcal{O}\left(\frac{\pi^{3}}{(n+1)^{3}}\right)\right) } + \quad \stackrel{\frac{\pi}{n+1} \ll 1}{\approx} \quad \frac{2}{\frac{\pi^2}{2 (n+1)^2}} + = \frac{4 (n+1)^2}{\pi^2} + .\] Damit folgt + \begin{align*} + \lim_{n \to \infty} \frac{2}{1 - \cos\left( \frac{\pi}{n+1} \right) } \cdot \frac{1}{n^2} + \approx + \lim_{n \to \infty} \frac{4n^2 + 8n + 4}{\pi^2 n^2} + = \frac{4}{\pi^2} < \infty + .\end{align*} + Damit folgt $\text{cond}_2(T) = \mathcal{O}(n^2)$. + \end{proof} + \end{enumerate} +\end{aufgabe} + +\begin{aufgabe} + \begin{enumerate}[a)] + \item Es sei + \begin{align} + A^{(k)} &= \begin{gmatrix}[b] R_{11}^{(k)} & R_{12}^{(k)} \\ + 0 & B^{(k)}\end{gmatrix} + \intertext{mit} + B^{(k)} &= \begin{gmatrix}[b] \alpha ^{(k)} & (w^{(k)})^{T} \\ + \sigma ^{(k)} & C^{(k)} + \end{gmatrix} + .\end{align} + wobei $C^{(k)} \in \R^{(n-k-1)\times (n-k-1)}$ und + $\sigma ^{(k)}, w^{(k)} \in \R^{n-k-1}, \alpha ^{(k)} \neq 0$. + Da $\alpha ^{(k)} \neq 0$, ist die Pivotisierung bereits + durchgeführt oder nicht notwendig. Es gilt damit nach VL + \begin{align} + A^{(k+1)} = A^{(k)} - l^{(k+1)}(u^{(k+1)})^{T} + .\end{align} + mit + \[ + l^{(k+1)}_i = \begin{cases} + 0 & 1 \le i \le k \\ + \frac{a_{i,k}^{(k)}}{a_{k,k}^{(k)}} & k+1 \le i \le n + \end{cases} \text{ und } + u_j^{(k+1)} = \begin{cases} + 0 & 1 \le j \le k \\ + a_{k,j}^{(k)} & k \le j \le n + \end{cases} + .\] + Mit (2) folgt damit + \begin{align*} + l^{(k+1)} = \begin{gmatrix}[b] 0 \\ \frac{1}{a_{k,k}^{(k)}} \sigma ^{(k)} + \end{gmatrix} + \text{ und } + u^{(k+1)} = \begin{gmatrix}[b] 0 & (w^{(k)})^{T} \end{gmatrix} + .\end{align*} + Mit (1) und (3) folgt somit + \begin{align*} + A^{(k+1)} &= A^{(k)} - \begin{gmatrix}[b] 0 & 0 & 0\\ + 0 & 0 & 0 \\ + 0 & 0 & \frac{1}{\alpha ^{(k)}} \sigma ^{(k)} (w^{(k)})^{T} \end{gmatrix} + \intertext{Für $B^{(k+1)}$ gilt damit} + B^{(k+1)} &= C^{(k)} - \frac{1}{\alpha ^{(k)}} \sigma ^{(k)} (w^{(k)})^{T} + .\end{align*} + \item Der Algorithmus führt die Gauß-Elimination zeilenweise durch. Dabei wird für Zeile $i$ + folgendermaßen verfahren: + + \begin{enumerate}[1)] + \item Für jede Spalte, die nicht rechts der Diagonale ist, wird + zunächst das $i$-te Element des $l^{(j)}$-Vektors berechnet. + \[ + l_i^{(j)} = a_{i,j-1} = \frac{a_{i,j-1}}{a_{j-1,j-1}} + .\] Das Element $a_{j-1, j-1}$ ist das Pivotelement des $j$-ten Schritts + der LU Zerlegung aus der VL. + + In der Schleife für $k$, werden dann für $a_{i,j}$ sukzessiv alle Rang-1-Updates + ausgeführt, der bis dahin berechneten $l^{(k)}_i$. + \item Die Elemente in den Spalten rechts der Diagonale sind keine Pivotelemente. Deshalb + werden hier direkt die Rang-1-Updates $l_i^{(1)}$ bis $l_i^{(i-1)}$, die + links der Diagonale stehen, ausgeführt. + \end{enumerate} + Damit ist die Zeile $i$ auf die finale Form gebracht und es wird mit $i+1$ weitergemacht. + \end{enumerate} +\end{aufgabe} + +\begin{aufgabe} + Implementierung siehe \textit{prog\_sparse\_matrix.cc}. Plot in \textit{sparse\_plot.png}. + + Die Komplexität in der \lstinline{DenseMatrix} Variante ist wie zu erwarten $\mathcal{O}(N^2)$ und + die Komplexität der \lstinline{SparseMatrix} Variante $\mathcal{O}(N)$, da + die Anzahl der Nicht-Null Elemente der verwendeten Flussmatrix aus dem Rohrleitungsnetzwerk + linear ansteigt. +\end{aufgabe} + +\end{document} diff --git a/sose2020/num/uebungen/prog_sparse_matrix.cc b/sose2020/num/uebungen/prog_sparse_matrix.cc new file mode 100644 index 0000000..0fbe739 --- /dev/null +++ b/sose2020/num/uebungen/prog_sparse_matrix.cc @@ -0,0 +1,152 @@ +#include // notwendig zur Ausgabe +#include +#include "hdnum.hh" // hdnum header + + +namespace hdnum { + + template + class SparseMatrix { + struct MatrixEntry { + int i; + int j; + REAL value; + }; + + public: + void AddEntry (int i, int j, REAL value) { + if (i < 0 || j < 0) + HDNUM_ERROR("Zeilen und Spalten dürfen nicht negativ sein!"); + // create new matrix entry + MatrixEntry entry; + entry.i = i; + entry.j = j; + entry.value = value; + // add entry to entries vector + entries.insert(entries.begin(), entry); + } + + template + void mv (Vector& y, const Vector& x) { + // iterate through all entries + for(typename std::vector::iterator it = entries.begin(); it != entries.end(); ++it) { + if ((*it).i > y.size() || (*it).j > x.size()) + HDNUM_ERROR("Vektor(en) hat/haben falsche Dimension!"); + // modify corresponding vector entry + y[(*it).i] += x[(*it).j] * (*it).value; + } + } + + private: + // vector storing non-zero elements + std::vector entries; + }; +} + +// zum Test, fluss matrizen aus rohrleitungsnetzwerk +hdnum::SparseMatrix flussMatrixSparse(int N) { + hdnum::SparseMatrix A; + + // berechnung der kantenlaenge + int n = floor(sqrt(N+1)); + + for(int i = 0; i < N; i++) { + int edges = 0; + if ((i+1)%n != 0) { // nicht linker rand + edges++; + if (i-1 >= 0) A.AddEntry(i, i-1, -1); + } + if ((i+2)%n != 0) { // nicht rechter rand + edges++; + A.AddEntry(i, i+1, -1); + } + if (i+n < N) { // nicht unterer rand + edges++; + A.AddEntry(i, i+n, -1); + } + if (i-n >= -1) { // nicht oberer rand + edges++; + if (i-n >= 0) A.AddEntry(i, i-n, -1); + } + A.AddEntry(i, i, edges); + } + return A; +} + +// Funktion zum Aufstellen der Matrix (aus rohrleitungsnetzwerk) +hdnum::DenseMatrix flussMatrix(int N) { + hdnum::DenseMatrix A(N,N); + + // berechnung der kantenlaenge + int n = floor(sqrt(N+1)); + + for(int i = 0; i < N; i++) { + int edges = 0; + if ((i+1)%n != 0) { // nicht linker rand + edges++; + if (i-1 >= 0) A(i, i-1) = -1; // falls nicht der referenzknoten + } + if ((i+2)%n != 0) { // nicht rechter rand + edges++; + A(i, i+1) = -1; + } + if (i+n < N) { // nicht unterer rand + edges++; + A(i, i+n) = -1; + } + if (i-n >= -1) { // nicht oberer rand + edges++; + if (i-n >= 0) A(i, i-n) = -1; // falls nicht der referenzknoten + } + A(i, i) = edges; + } + return A; +} + +// funktion zum testen +void testMatrixVectorProduct(int N) { + hdnum::SparseMatrix A = flussMatrixSparse(N); + hdnum::DenseMatrix B = flussMatrix(N); + + // test vektor + hdnum::Vector x(N); + for(int i=0; i y1(N); + hdnum::Vector y2(N); + + // Pretty-printing fuer Vektoren + x.scientific(false); + x.width(15); + + // test ob Ax = Bx + A.mv(y1, x); + B.mv(y2, x); + std::cout << "Mit Sparse Matrix: " << y1 << std::endl; + std::cout << "Mit Dense Matrix: " << y2; +} + +int main () { + // testMatrixVectorProduct(15); + + // messe zeiten fuer n=4,...,14 und N = 2^n + for(int n=4; n<=14; n++) { + int N = pow(2, n); + + // test vektor + hdnum::Vector x(N); + for(int i=0; i y(N); + + hdnum::SparseMatrix A = flussMatrixSparse(N); + hdnum::DenseMatrix B = flussMatrix(N); + + // timer hier fuer die SparseMatrix implementierung + hdnum::Timer myTimer; + A.mv(y, x); + std::cout << N << " " << myTimer.elapsed() << std::endl; + } +} diff --git a/sose2020/num/uebungen/sparse_plot.plt b/sose2020/num/uebungen/sparse_plot.plt new file mode 100644 index 0000000..e415c79 --- /dev/null +++ b/sose2020/num/uebungen/sparse_plot.plt @@ -0,0 +1,14 @@ +set terminal png size 1000,1000 +set output 'sparse_plot.png' + +set logscale xy + +set ylabel "Laufzeit in Sekunden" +set xlabel "Matrixgröße" + +set format y "%g" + +plot 'sparse.dat' title "SparseMatrix", \ + 'dense.dat' title "DenseMatrix",\ + 0.000000015*x**2 title "c x^2", \ + 0.0000001*x title "b x" diff --git a/sose2020/num/uebungen/sparse_plot.png b/sose2020/num/uebungen/sparse_plot.png new file mode 100644 index 0000000..f72d13e Binary files /dev/null and b/sose2020/num/uebungen/sparse_plot.png differ