update num and lectures

This commit is contained in:
2020-05-29 00:27:46 +02:00
parent 9507d93385
commit 83469609ed
5 changed files with 71 additions and 45 deletions
+1 -1
View File
@@ -213,7 +213,7 @@
} }
% replace all relations with align characters (&) and add the needed padding % replace all relations with align characters (&) and add the needed padding
\regex_replace_all:nnN \regex_replace_all:nnN
{ (\c{impliedby}&|&\c{impliedby}|\c{implies}&|&\c{implies}|\c{approx}&|&\c{approx}|\c{equiv}&|&\c{equiv}|=&|&=|\c{le}&|&\c{le}|\c{ge}&|&\c{ge}|&\c{stackrel}{.*?}{.*?}|\c{stackrel}{.*?}{.*?}&|&\c{neq}|\c{neq}&) } { (\c{iff}&|&\c{iff}|\c{impliedby}&|&\c{impliedby}|\c{implies}&|&\c{implies}|\c{approx}&|&\c{approx}|\c{equiv}&|&\c{equiv}|=&|&=|\c{le}&|&\c{le}|\c{ge}&|&\c{ge}|&\c{stackrel}{.*?}{.*?}|\c{stackrel}{.*?}{.*?}&|&\c{neq}|\c{neq}&) }
{ \c{kern} \u{l_tmp_dim_needed} \1 \c{kern} \u{l_tmp_dim_needed} } { \c{kern} \u{l_tmp_dim_needed} \1 \c{kern} \u{l_tmp_dim_needed} }
\l__lec_text_tl \l__lec_text_tl
\l__lec_text_tl \l__lec_text_tl
Binary file not shown.
+20 -5
View File
@@ -248,7 +248,7 @@ NumberType frobeniusNorm(const hdnum::DenseMatrix<NumberType> &A) {
\item Auszug aus \textit{rohrleitungsnetzwerk.cc} \item Auszug aus \textit{rohrleitungsnetzwerk.cc}
\begin{lstlisting}[language=C++, title=Eigenwertberechnung, captionpos=b] \begin{lstlisting}[language=C++, title=Eigenwertberechnung, captionpos=b]
// Funktion zur Berechnung des betragsgrößten Eigenwertes mit Potenzmethode // Funktion zur Berechnung des betragsgroessten Eigenwertes mit Potenzmethode
template<class NumberType> template<class NumberType>
NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) { NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
// Error checking // Error checking
@@ -259,18 +259,33 @@ NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
// start vektor // start vektor
hdnum::Vector<NumberType> r(N); hdnum::Vector<NumberType> r(N);
r[0] = 1; r[0] = 0;
// work copy // work copy
hdnum::Vector<NumberType> r_tmp(N); hdnum::Vector<NumberType> r_tmp(N);
hdnum::Vector<NumberType> diff(N); // finde vektor mit Ar != 0
// fuehre iterationsschritt 10000 mal aus for (int i = 0;;i++) {
A.mv(r_tmp, r); // r_tmp = Ar
if (r_tmp.two_norm() > 0) {
// Ar != 0
break;
} else if (i >= 100) {
// breche ab, wenn kein passender startvektor gefunden werden kann
HDNUM_ERROR("Kann keinen Vektor mit Ax != 0 finden. Ist A = 0?");
}
// Ar = 0, modifiziere start vektor
r[i % N] += 1;
}
// fuehre iterationsschritt maximal 10000 mal aus
for (int k=0; k<10000; k++) { for (int k=0; k<10000; k++) {
A.mv(r_tmp, r); // r_tmp = Ar A.mv(r_tmp, r); // r_tmp = Ar
r_tmp /= r_tmp.two_norm(); // normiere r_tmp r_tmp /= r_tmp.two_norm(); // normiere r_tmp
if ((r-r_tmp).two_norm() == 0)
// breche ab ab, wenn maximale genauigkeit erreicht wurde
break;
r = r_tmp; r = r_tmp;
} }
A.mv(r_tmp, r);
// berechne eigenwert mit rayleigh quotient // berechne eigenwert mit rayleigh quotient
A.mv(r_tmp, r); // r_tmp = Ar
return (r * r_tmp)/r.two_norm_2(); return (r * r_tmp)/r.two_norm_2();
}\end{lstlisting} }\end{lstlisting}
\end{enumerate} \end{enumerate}
+49 -38
View File
@@ -71,7 +71,7 @@ NumberType frobeniusNorm(const hdnum::DenseMatrix<NumberType> &A) {
} }
// Funktion zur Berechnung des betragsgrößten Eigenwertes mit Potenzmethode // Funktion zur Berechnung des betragsgroessten Eigenwertes mit Potenzmethode
template<class NumberType> template<class NumberType>
NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) { NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
// Error checking // Error checking
@@ -82,61 +82,72 @@ NumberType maxEigenwert(const hdnum::DenseMatrix<NumberType> &A) {
// start vektor // start vektor
hdnum::Vector<NumberType> r(N); hdnum::Vector<NumberType> r(N);
r[0] = 1; r[0] = 0;
// work copy // work copy
hdnum::Vector<NumberType> r_tmp(N); hdnum::Vector<NumberType> r_tmp(N);
hdnum::Vector<NumberType> diff(N); // finde vektor mit Ar != 0
// fuehre iterationsschritt 10000 mal aus for (int i = 0;;i++) {
A.mv(r_tmp, r); // r_tmp = Ar
if (r_tmp.two_norm() > 0) {
// Ar != 0
break;
} else if (i >= 100) {
// breche ab, wenn kein passender startvektor gefunden werden kann
HDNUM_ERROR("Kann keinen Vektor mit Ax != 0 finden. Ist A = 0?");
}
// Ar = 0, modifiziere start vektor
r[i % N] += 1;
}
// fuehre iterationsschritt maximal 10000 mal aus
for (int k=0; k<10000; k++) { for (int k=0; k<10000; k++) {
A.mv(r_tmp, r); // r_tmp = Ar A.mv(r_tmp, r); // r_tmp = Ar
r_tmp /= r_tmp.two_norm(); // normiere r_tmp r_tmp /= r_tmp.two_norm(); // normiere r_tmp
if ((r-r_tmp).two_norm() == 0)
// breche ab ab, wenn maximale genauigkeit erreicht wurde
break;
r = r_tmp; r = r_tmp;
} }
A.mv(r_tmp, r);
// berechne eigenwert mit rayleigh quotient // berechne eigenwert mit rayleigh quotient
A.mv(r_tmp, r); // r_tmp = Ar
return (r * r_tmp)/r.two_norm_2(); return (r * r_tmp)/r.two_norm_2();
} }
// Hauptprogramm // Hauptprogramm
int main(int argc, char ** argv) int main(int argc, char ** argv) {
{ // Anzahl der Knoten
const int N(10);
std::cout << "Knotenanzahl N: " << N << std::endl;
// Anzahl der Knoten // Größe der Matrix
const int N(10); const int n(N*N-1);
std::cout << "Knotenanzahl N: " << N << std::endl;
// Größe der Matrix // Datentyp für die Matrix
const int n(N*N-1); typedef double REAL;
// Datentyp für die Matrix // Matrix initialisieren
typedef double REAL; hdnum::DenseMatrix<REAL> A(n,n);
// Matrix initialisieren // Pretty-printing einmal setzen für alle Matrizen
hdnum::DenseMatrix<REAL> A(n,n); A.scientific(false);
A.width(15);
// Pretty-printing einmal setzen für alle Matrizen flussMatrix(A);
A.scientific(false); if (N<=4)
A.width(15); std::cout << A << std::endl;
flussMatrix(A); // Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b)
if (N<=4) // und c) mit folgender Matrix testen
std::cout << A << std::endl; int size_b = 3;
hdnum::DenseMatrix<REAL> B(size_b,size_b);
// Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b) for (std::size_t i=0; i<size_b; ++i) {
// und c) mit folgender Matrix testen for (std::size_t j=0; j<size_b; ++j) {
int size_b = 3; B[i][j] = i+j;
hdnum::DenseMatrix<REAL> B(size_b,size_b); }
for (std::size_t i=0; i<size_b; ++i)
{
for (std::size_t j=0; j<size_b; ++j)
{
B[i][j] = i+j;
} }
} std::cout << "Zeilen-Summen-Norm: " << A.norm_infty() << std::endl;
std::cout << "Zeilen-Summen-Norm: " << A.norm_infty() << std::endl; std::cout << "Spalten-Summen-Norm: " << A.norm_1() << std::endl;
std::cout << "Spalten-Summen-Norm: " << A.norm_1() << std::endl; std::cout << "Frobenius-Norm: " << frobeniusNorm(A) << std::endl;
std::cout << "Frobenius-Norm: " << frobeniusNorm(A) << std::endl; std::cout << "Maximaler Eigenwert: " << maxEigenwert(A) << std::endl;
std::cout << "Maximaler Eigenwert: " << maxEigenwert(A) << std::endl;
return 0; return 0;
} }