ignore dat files, add num6
This commit is contained in:
@@ -9,3 +9,4 @@
|
|||||||
*.synctex*
|
*.synctex*
|
||||||
*.fdb_latexmk
|
*.fdb_latexmk
|
||||||
*.toc
|
*.toc
|
||||||
|
*.dat
|
||||||
|
|||||||
Binary file not shown.
@@ -57,15 +57,14 @@
|
|||||||
im folgenden mit $\overline{\cdot }$ bezeichnet. Aus dem Argument ist immer klar, welche
|
im folgenden mit $\overline{\cdot }$ bezeichnet. Aus dem Argument ist immer klar, welche
|
||||||
Äquivalenzrelation gemeint ist.
|
Äquivalenzrelation gemeint ist.
|
||||||
\begin{enumerate}[(a)]
|
\begin{enumerate}[(a)]
|
||||||
\item Beh.: $M / IM$ ist mit der natürlichen Addition und der angegebenen skalaren
|
\item Skalare Multiplikation ($*$):\begin{align*}
|
||||||
Mult. $R / I$-Modul.
|
|
||||||
\begin{proof}
|
|
||||||
Die skalare Multiplikation sei mit $(*)$ bezeichnet.
|
|
||||||
\begin{align*}
|
|
||||||
R / I \times M / IM &\to M / IM\\
|
R / I \times M / IM &\to M / IM\\
|
||||||
(\overline{a}, \overline{m}) &\mapsto \overline{a} \cdot \overline{m} \coloneqq \overline{a \cdot m} \quad (*)
|
(\overline{a}, \overline{m}) &\mapsto \overline{a} \cdot \overline{m} \coloneqq \overline{a \cdot m} \quad (*)
|
||||||
.\end{align*}
|
.\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, b \in R$ und $x, y \in M$ mit
|
||||||
$a + I = b + I$ und $x + IM = y + IM$.
|
$a + I = b + I$ und $x + IM = y + IM$.
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
@@ -128,7 +127,7 @@
|
|||||||
\item Z.z: $\overline{\varphi}$ wohldefiniert. Seien $m_1, m_2 \in M$
|
\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
|
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
|
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
|
Damit folgt
|
||||||
\[
|
\[
|
||||||
\varphi(m_1) - \varphi(m_2) = \varphi(m_1 - m_2)
|
\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
|
$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
|
$\text{deg}(t+1) = 1 > 0 = \text{deg}(1)$ und $\Q[t]$ nullteilerfrei, folgt
|
||||||
$1 \not\in (t+1)$, also $S_1$ kein ES.
|
$1 \not\in (t+1)$, also $S_1$ kein ES.
|
||||||
|
|
||||||
|
Analog für $S_2 \coloneqq \{t^2 + 1\} $.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
\end{proof}
|
\end{proof}
|
||||||
Beh.: $S$ ist keine Basis.
|
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
|
\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
|
,\] 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{proof}
|
||||||
\end{aufgabe}
|
\end{aufgabe}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -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}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Reference in New Issue
Block a user