Преглед на файлове

ignore dat files, add num6

master
flavis преди 5 години
родител
ревизия
d9f0815f84
променени са 8 файла, в които са добавени 446 реда и са изтрити 8 реда
  1. +1
    -0
      .gitignore
  2. Двоични данни
      sose2020/la/uebungen/la6.pdf
  3. +9
    -8
      sose2020/la/uebungen/la6.tex
  4. Двоични данни
      sose2020/num/uebungen/num6.pdf
  5. +270
    -0
      sose2020/num/uebungen/num6.tex
  6. +152
    -0
      sose2020/num/uebungen/prog_sparse_matrix.cc
  7. +14
    -0
      sose2020/num/uebungen/sparse_plot.plt
  8. Двоични данни
      sose2020/num/uebungen/sparse_plot.png

+ 1
- 0
.gitignore Целия файл

@@ -9,3 +9,4 @@
*.synctex*
*.fdb_latexmk
*.toc
*.dat

Двоични данни
sose2020/la/uebungen/la6.pdf Целия файл


+ 9
- 8
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}



Двоични данни
sose2020/num/uebungen/num6.pdf Целия файл


+ 270
- 0
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}

+ 152
- 0
sose2020/num/uebungen/prog_sparse_matrix.cc Целия файл

@@ -0,0 +1,152 @@
#include <iostream> // notwendig zur Ausgabe
#include <vector>
#include "hdnum.hh" // hdnum header


namespace hdnum {

template<typename REAL>
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<typename V>
void mv (Vector<V>& y, const Vector<V>& x) {
// iterate through all entries
for(typename std::vector<MatrixEntry>::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<MatrixEntry> entries;
};
}

// zum Test, fluss matrizen aus rohrleitungsnetzwerk
hdnum::SparseMatrix<double> flussMatrixSparse(int N) {
hdnum::SparseMatrix<double> 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<double> flussMatrix(int N) {
hdnum::DenseMatrix<double> 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<double> A = flussMatrixSparse(N);
hdnum::DenseMatrix<double> B = flussMatrix(N);

// test vektor
hdnum::Vector<double> x(N);
for(int i=0; i<N; i++) {
x[i] = i+1;
}
hdnum::Vector<double> y1(N);
hdnum::Vector<double> 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<double> x(N);
for(int i=0; i<N; i++) {
x[i] = i+1;
}
hdnum::Vector<double> y(N);

hdnum::SparseMatrix<double> A = flussMatrixSparse(N);
hdnum::DenseMatrix<double> B = flussMatrix(N);

// timer hier fuer die SparseMatrix implementierung
hdnum::Timer myTimer;
A.mv(y, x);
std::cout << N << " " << myTimer.elapsed() << std::endl;
}
}

+ 14
- 0
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"

Двоични данни
sose2020/num/uebungen/sparse_plot.png Целия файл

Before After
Width: 1000  |  Height: 1000  |  Size: 12KB

Loading…
Отказ
Запис