ignore dat files, add num6
This commit is contained in:
Binary file not shown.
@@ -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}
|
||||
|
||||
|
||||
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