From e82157488c925df62910ca5401965a54ebe9020b Mon Sep 17 00:00:00 2001 From: flavis Date: Thu, 21 May 2020 18:53:54 +0200 Subject: [PATCH] add salign to lecture.cls, fix typo in num3 --- lecture.cls | 71 +++++++++ sose2020/num/uebungen/num3.pdf | Bin 112837 -> 112861 bytes sose2020/num/uebungen/num3.tex | 4 +- sose2020/num/uebungen/rohrleitungsnetzwerk.cc | 142 ++++++++++++++++++ 4 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 sose2020/num/uebungen/rohrleitungsnetzwerk.cc diff --git a/lecture.cls b/lecture.cls index 4988e84..f74ffdc 100644 --- a/lecture.cls +++ b/lecture.cls @@ -24,6 +24,7 @@ \RequirePackage{totcount} \RequirePackage{calc} \RequirePackage{wasysym} +\RequirePackage{environ} \usetikzlibrary{quotes, angles} @@ -149,3 +150,73 @@ % contradiction \newcommand{\contr}{\text{\Large\lightning}} + +\ExplSyntaxOn + +% S-tackrelcompatible ALIGN environment +% some might also call it the S-uper ALIGN environment +% uses regular expressions to calculate the widest stackrel +% to put additional padding on both sides of relation symbols +\NewEnviron{salign} +{ + \begin{align} + \lec_insert_padding:V \BODY + \end{align} +} +% starred version that does no equation numbering +\NewEnviron{salign*} +{ + \begin{align*} + \lec_insert_padding:V \BODY + \end{align*} +} + +% some helper variables +\tl_new:N \l__lec_text_tl +\seq_new:N \l_lec_stackrels_seq +\int_new:N \l_stackrel_count_int +\int_new:N \l_idx_int +\box_new:N \l_tmp_box +\dim_new:N \l_tmp_dim_a +\dim_new:N \l_tmp_dim_b +\dim_new:N \l_tmp_dim_needed + +% function to insert padding according to widest stackrel +\cs_new_protected:Nn \lec_insert_padding:n + { + \tl_set:Nn \l__lec_text_tl { #1 } + % get all stackrels in this align environment + \regex_extract_all:nnN { \c{stackrel}{(.*?)}{(.*?)} } { #1 } \l_lec_stackrels_seq + % get number of stackrels + \int_set:Nn \l_stackrel_count_int { \seq_count:N \l_lec_stackrels_seq } + \int_set:Nn \l_idx_int { 1 } + \dim_set:Nn \l_tmp_dim_needed { 0pt } + % iterate over stackrels + \int_while_do:nn { \l_idx_int <= \l_stackrel_count_int } + { + % calculate width of text + \hbox_set:Nn \l_tmp_box {$\seq_item:Nn \l_lec_stackrels_seq { \l_idx_int + 1 }$} + \dim_set:Nn \l_tmp_dim_a {\box_wd:N \l_tmp_box} + % calculate width of relation symbol + \hbox_set:Nn \l_tmp_box {$\seq_item:Nn \l_lec_stackrels_seq { \l_idx_int + 2 }$} + \dim_set:Nn \l_tmp_dim_b {\box_wd:N \l_tmp_box} + % check if 0.5*(a-b) > minimum padding, if yes updated minimum padding + \dim_compare:nNnTF + { 1pt * \dim_ratio:nn { \l_tmp_dim_a - \l_tmp_dim_b } { 2pt } } > { \l_tmp_dim_needed } + { \dim_set:Nn \l_tmp_dim_needed { 1pt * \dim_ratio:nn { \l_tmp_dim_a - \l_tmp_dim_b } { 2pt } } } + { } + \quad + % increment list index by three, as every stackrel produces three list entries + \int_incr:N \l_idx_int + \int_incr:N \l_idx_int + \int_incr:N \l_idx_int + } + % replace all relations with align characters (&) and add the needed padding + \regex_replace_all:nnN + { (\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 + } +\cs_generate_variant:Nn \lec_insert_padding:n { V } +\ExplSyntaxOff diff --git a/sose2020/num/uebungen/num3.pdf b/sose2020/num/uebungen/num3.pdf index ed4fa627c67cd0b57beb3776c99bdcf00fc6fc9a..ec169e3742f075d25a77e38456fc7dd8cee9421a 100644 GIT binary patch delta 4060 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 +#include +#include "hdnum.hh" + + +// Funktion zum Aufstellen der Matrix +template +void flussMatrix( hdnum::DenseMatrix &A ) { + int M( A.rowsize() ); + int N( A.colsize() ); + if(M!=N) + HDNUM_ERROR("Matrix muss quadratisch sein!"); + + // Numerierung wie auf Zettel 3 nur mit 0 beginnend + // also v_0, ... ,v_(N^2-1) + // der Referenzknoten v_r hat Druck 0 + + // 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; + } +} + + +// Funktion zur Berechnung der Frobenius-Norm einer Matrix +template +NumberType frobeniusNorm(const hdnum::DenseMatrix &A) { + // Error checking + int M(A.rowsize()); + int N(A.colsize()); + if(M!=N) + HDNUM_ERROR("Matrix muss quadratisch sein!"); + + NumberType result=0.0; + + // iteriere ueber alle zeilen und spalten, quadriere die elemente und summiere + for (int i=0; i < N; i++) { + for (int j=0; j < N; j++) { + result += pow(A(i,j), 2); + } + } + + // ziehe wurzel aus summe + return sqrt(result); +} + + +// Funktion zur Berechnung des betragsgrößten Eigenwertes mit Potenzmethode +template +NumberType maxEigenwert(const hdnum::DenseMatrix &A) { + // Error checking + int M(A.rowsize()); + int N(A.colsize()); + if(M!=N) + HDNUM_ERROR("Matrix muss quadratisch sein!"); + + // start vektor + hdnum::Vector r(N); + r[0] = 1; + // work copy + hdnum::Vector r_tmp(N); + hdnum::Vector diff(N); + // fuehre iterationsschritt 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 + r = r_tmp; + } + A.mv(r_tmp, r); + // berechne eigenwert mit rayleigh quotient + 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