diff --git a/lecture.cls b/lecture.cls index 12979f2..33a7c49 100644 --- a/lecture.cls +++ b/lecture.cls @@ -213,7 +213,7 @@ } % replace all relations with align characters (&) and add the needed padding \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} } \l__lec_text_tl \l__lec_text_tl diff --git a/sose2020/ana/lectures b/sose2020/ana/lectures index 0368910..ba8188d 160000 --- a/sose2020/ana/lectures +++ b/sose2020/ana/lectures @@ -1 +1 @@ -Subproject commit 0368910241ebb1c6cc82f15ad0ddfabe8a4fbaca +Subproject commit ba8188da5cecb3d9ccabf7de434463d71bf68fdb diff --git a/sose2020/num/uebungen/num4.pdf b/sose2020/num/uebungen/num4.pdf index 9cc4363..d788167 100644 Binary files a/sose2020/num/uebungen/num4.pdf and b/sose2020/num/uebungen/num4.pdf differ diff --git a/sose2020/num/uebungen/num4.tex b/sose2020/num/uebungen/num4.tex index 55ca4e6..fc4c982 100644 --- a/sose2020/num/uebungen/num4.tex +++ b/sose2020/num/uebungen/num4.tex @@ -248,7 +248,7 @@ NumberType frobeniusNorm(const hdnum::DenseMatrix &A) { \item Auszug aus \textit{rohrleitungsnetzwerk.cc} \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 NumberType maxEigenwert(const hdnum::DenseMatrix &A) { // Error checking @@ -259,18 +259,33 @@ NumberType maxEigenwert(const hdnum::DenseMatrix &A) { // start vektor hdnum::Vector r(N); - r[0] = 1; + r[0] = 0; // work copy hdnum::Vector r_tmp(N); - hdnum::Vector diff(N); - // fuehre iterationsschritt 10000 mal aus + // finde vektor mit Ar != 0 + 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++) { A.mv(r_tmp, r); // r_tmp = Ar 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; } - A.mv(r_tmp, r); // berechne eigenwert mit rayleigh quotient + A.mv(r_tmp, r); // r_tmp = Ar return (r * r_tmp)/r.two_norm_2(); }\end{lstlisting} \end{enumerate} diff --git a/sose2020/num/uebungen/rohrleitungsnetzwerk.cc b/sose2020/num/uebungen/rohrleitungsnetzwerk.cc index ecfcd97..094e0c6 100644 --- a/sose2020/num/uebungen/rohrleitungsnetzwerk.cc +++ b/sose2020/num/uebungen/rohrleitungsnetzwerk.cc @@ -71,7 +71,7 @@ NumberType frobeniusNorm(const hdnum::DenseMatrix &A) { } -// Funktion zur Berechnung des betragsgrößten Eigenwertes mit Potenzmethode +// Funktion zur Berechnung des betragsgroessten Eigenwertes mit Potenzmethode template NumberType maxEigenwert(const hdnum::DenseMatrix &A) { // Error checking @@ -82,61 +82,72 @@ NumberType maxEigenwert(const hdnum::DenseMatrix &A) { // start vektor hdnum::Vector r(N); - r[0] = 1; + r[0] = 0; // work copy hdnum::Vector r_tmp(N); - hdnum::Vector diff(N); - // fuehre iterationsschritt 10000 mal aus + // finde vektor mit Ar != 0 + 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++) { A.mv(r_tmp, r); // r_tmp = Ar 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; } - A.mv(r_tmp, r); // berechne eigenwert mit rayleigh quotient + A.mv(r_tmp, r); // r_tmp = Ar return (r * r_tmp)/r.two_norm_2(); } // Hauptprogramm -int main(int argc, char ** argv) -{ - - // Anzahl der Knoten - const int N(10); - std::cout << "Knotenanzahl N: " << N << std::endl; - - // Größe der Matrix - const int n(N*N-1); - - // Datentyp für die Matrix - typedef double REAL; - - // Matrix initialisieren - hdnum::DenseMatrix A(n,n); - - // Pretty-printing einmal setzen für alle Matrizen - A.scientific(false); - A.width(15); - - flussMatrix(A); - if (N<=4) - std::cout << A << std::endl; - - // Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b) - // und c) mit folgender Matrix testen - int size_b = 3; - hdnum::DenseMatrix B(size_b,size_b); - for (std::size_t i=0; i A(n,n); + + // Pretty-printing einmal setzen für alle Matrizen + A.scientific(false); + A.width(15); + + flussMatrix(A); + if (N<=4) + std::cout << A << std::endl; + + // Bei Schwierigkeiten mit Teilaufgabe a) können Sie Teilaufgaben b) + // und c) mit folgender Matrix testen + int size_b = 3; + hdnum::DenseMatrix B(size_b,size_b); + for (std::size_t i=0; i