diff --git a/zusammenfassung/README.md b/zusammenfassung/README.md index de14686..948a428 100644 --- a/zusammenfassung/README.md +++ b/zusammenfassung/README.md @@ -2,11 +2,17 @@ Ich habe für die folgenden Fächer eine Zusammenfassung geschrieben **ODER** eine von der AMIV Plattform modifiziert. +- [Analysis I und II](https://eth.jirayuruh.ch/fs25/analysis/) - [Digitaltechnik](https://eth.jirayuruh.ch/hs24/digitech/) +- [Informatik I](https://eth.jirayuruh.ch/fs25/informatik/) +- [Informatik I](https://eth.jirayuruh.ch/fs25/informatik/) +- [Mathematiche Methoden](https://eth.jirayuruh.ch/fs25/math_methoden/) - [Technische Mechanik](https://eth.jirayuruh.ch/hs24/techmech/) Für die Fächer welche nicht aufgelistet wurden, habe ich entweder die Zusammenfassung 1:1 von AMIV genommen oder mir wurde eine Zusammenfassung zur Verfügung gestellt oder es war nicht erlaubt eine Zusammenfassung zu verwenden. +**Anmerkung**: Die Analysis I und II Zusammenfassung wird noch per Hand geschrieben und die Zusammenfassung zu Mathematiche Methoden wird gekürzt. + ## DISCLAIMER!!! Ich übernehme keine Haftung über mögliche Fehler in den Zusammenfassungen (Es hat sicherlich ein paar drinnen, da ich teils Sätze umformuliert habe und meine Persönliche Notizen beigefügt habe!). diff --git a/zusammenfassung/informatik/Bilder/ASCII-Table-wide.png b/zusammenfassung/informatik/Bilder/ASCII-Table-wide.png new file mode 100644 index 0000000..e3bddb7 Binary files /dev/null and b/zusammenfassung/informatik/Bilder/ASCII-Table-wide.png differ diff --git a/zusammenfassung/informatik/Bilder/Aufrufstapel.png b/zusammenfassung/informatik/Bilder/Aufrufstapel.png new file mode 100644 index 0000000..fb7ba6b Binary files /dev/null and b/zusammenfassung/informatik/Bilder/Aufrufstapel.png differ diff --git a/zusammenfassung/informatik/Bilder/EBNF.png b/zusammenfassung/informatik/Bilder/EBNF.png new file mode 100644 index 0000000..5d6ea7a Binary files /dev/null and b/zusammenfassung/informatik/Bilder/EBNF.png differ diff --git a/zusammenfassung/informatik/Bilder/EBNF_2.png b/zusammenfassung/informatik/Bilder/EBNF_2.png new file mode 100644 index 0000000..3309fe3 Binary files /dev/null and b/zusammenfassung/informatik/Bilder/EBNF_2.png differ diff --git a/zusammenfassung/informatik/Bilder/Floatingpoint.JPG b/zusammenfassung/informatik/Bilder/Floatingpoint.JPG new file mode 100644 index 0000000..25868e6 Binary files /dev/null and b/zusammenfassung/informatik/Bilder/Floatingpoint.JPG differ diff --git a/zusammenfassung/informatik/Bilder/Matrix.png b/zusammenfassung/informatik/Bilder/Matrix.png new file mode 100644 index 0000000..7bf4622 Binary files /dev/null and b/zusammenfassung/informatik/Bilder/Matrix.png differ diff --git a/zusammenfassung/informatik/Bilder/Rekursion_bsp.png b/zusammenfassung/informatik/Bilder/Rekursion_bsp.png new file mode 100644 index 0000000..09dd1b8 Binary files /dev/null and b/zusammenfassung/informatik/Bilder/Rekursion_bsp.png differ diff --git a/zusammenfassung/informatik/Bilder/Rekursion_bsp2.png b/zusammenfassung/informatik/Bilder/Rekursion_bsp2.png new file mode 100644 index 0000000..78b7214 Binary files /dev/null and b/zusammenfassung/informatik/Bilder/Rekursion_bsp2.png differ diff --git a/zusammenfassung/informatik/InformatikZF.pdf b/zusammenfassung/informatik/InformatikZF.pdf new file mode 100644 index 0000000..9e4ee5e Binary files /dev/null and b/zusammenfassung/informatik/InformatikZF.pdf differ diff --git a/zusammenfassung/informatik/InformatikZF.tex b/zusammenfassung/informatik/InformatikZF.tex new file mode 100644 index 0000000..4c625d2 --- /dev/null +++ b/zusammenfassung/informatik/InformatikZF.tex @@ -0,0 +1,1701 @@ +\documentclass[a4paper, fontsize = 8pt, landscape]{scrartcl} +\usepackage[german]{babel} +\usepackage[landscape, margin=0.5cm]{geometry} +\usepackage[dvipsnames]{xcolor} +% Hyperref links, pdf metadata +\usepackage{hyperref} +\usepackage{amscd, amsmath, amssymb, blindtext, empheq, enumitem, multicol} +\usepackage{mathtools} +\usepackage{graphicx} +\usepackage{tikz} +\usepackage{array} %for bigger tabular spacings +\usepackage{multirow} % for multirow cells in tabular +%% Formal tables +\usepackage{booktabs} +%% Colorbox +\usepackage[most]{tcolorbox} + +% make document compact +\parindent 0pt +\pagestyle{empty} +\setlength{\unitlength}{1cm} +\setlist{leftmargin = *} +% define some colors +\definecolor{title}{RGB}{229,140,140} +\definecolor{subtitle}{RGB}{234,165,165} +\definecolor{subsubtitle}{RGB}{249,210,210} +\definecolor{text}{RGB}{0,0,0} +\definecolor{formulabox}{RGB}{182,225,189} + +% section color box +\setkomafont{section}{\mysection} +\newcommand{\mysection}[1]{\vspace*{-3pt}% Space before Box + \Large\normalfont \sffamily \bfseries% + \setlength{\fboxsep}{0cm}%already boxed + \colorbox{title}{% + \begin{minipage}{\linewidth}% + \vspace*{2pt}%Space before + \leftskip2pt %Space left + \rightskip\leftskip %Space right + {\color{text} #1} + \vspace*{1pt}%Space after + \end{minipage}% + }} +%subsection color box +\setkomafont{subsection}{\mysubsection} +\newcommand{\mysubsection}[1]{\vspace*{-3pt}% Space before Box + \normalsize \normalfont \sffamily \bfseries% + \setlength{\fboxsep}{0cm}%already boxed + \colorbox{subtitle}{% + \begin{minipage}{\linewidth}% + \vspace*{2pt}%Space before + \leftskip2pt %Space left + \rightskip\leftskip %Space right + {\color{text} #1} + \vspace*{1pt}%Space after + \end{minipage}% + }} +%subsubsection color box +\setkomafont{subsubsection}{\mysubsubsection} +\newcommand{\mysubsubsection}[1]{\vspace*{-5pt}% Space before Box + \normalsize \normalfont \sffamily % + \setlength{\fboxsep}{0cm}%already boxed + \colorbox{subsubtitle}{% + \begin{minipage}{\linewidth}% + \vspace*{2pt}%Space before + \leftskip2pt %Space left + \rightskip\leftskip %Space right + {\color{text} #1} + \vspace*{1pt}%Space after + \end{minipage}% + }} + + +% equation box +\newcommand{\eqbox}[1]{\fcolorbox{black}{white}{#1}} + +%For tables orientation WIHT linebreaks +\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} + +%code snippet +\newcommand{\code}[1]{\texttt{#1}} + + +\begin{document} + +\setcounter{secnumdepth}{0} %no enumeration of sections +\begin{multicols*}{3} + \begin{center} + \Large{Informatik I} \\ + \tiny{von P.Bölsterli, Fehler bitte an \href{mailto:pbolsterli@student.ethz.ch}{pbolsterli@student.ethz.ch}} + \end{center} + + \section{Basics} + + + \begin{center} + \begin{minipage}{0.34 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{l} + \code{int main()} \{ \\ + \code{\quad Programm} \\ + \} \\ + \end{tabular}} + \end{center} + \end{minipage} + \begin{minipage}{0.65 \linewidth} + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{r l} \toprule + \multicolumn{2}{l}{\textbf{Ein- und Ausgabe}: } \\ + \midrule + Bibliothek: & \hspace*{-10pt} \code{\#include } \\ + Eingabe: & \hspace*{-10pt} \code{std::cin >> var;} \\ + Ausgabe: & \hspace*{-10pt} \code{std::cout << "Yeet} $\backslash$\code{n";} \\ + \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \end{center} + + + \subsection{Variablen} + + \begin{center} + \begin{minipage}{0.49 \linewidth} + \begin{center} + \begin{tabular}{r l} \toprule + Name: & \hspace*{-10pt} ree \\ + Typ: & \hspace*{-10pt} int \\ + Wert: & \hspace*{-10pt} i) undefiniert \\ + & \hspace*{-10pt} ii) 10 \\ + Adresse: & \hspace*{-10pt} bestimmt Compiler \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.5 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + Deklaration: & \code{int ree;} \\ + Definition: & \code{int ree = 10;} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + \subsubsection{Konstanten} + + Konstanten sind Variablen mit unveränderbarem Wert. + + \begin{center} + \begin{minipage}{0.49 \linewidth} + \begin{center} + \textbf{Präfix}: \code{const} + \end{center} + \end{minipage} + \begin{minipage}{0.5 \linewidth} + \begin{center} + \eqbox{\code{const int c = 3e+8;}} + \end{center} + \end{minipage} + \end{center} + + \emph{const-Richtlinie}: Wenn eine Variable im Verlauf des Programmes seinen Wert nie ändert, dann sollte sie als Konstante definiert sein. + + + \subsection{Fundamentale Datentypen} + + \begin{center} + \begin{tabular} {l l c l} \toprule + \textbf{Typ} & \textbf{Was} & \textbf{Werte} & \textbf{Bits} \\ + \midrule + \code{double} & Approximiert $\mathbb{R}$ & $F^*(2,53, -1022,1023)$ & 64 \\ + \code{float} & Approximiert $\mathbb{R}$ & $F^*(2,24,-126,127)$ & 32 \\ + \code{unsigned int} & Natürliche Zahlen & 0 bis $ 2^{32}-1$ & 32 \\ + \code{int} & Ganze Zahlen & $-2^{31}$ bis $2^{31}-1$ & 32 \\ + + \code{bool} & Wahrheitswerte & true (1) oder false (0) & 8 \\ + \hline + + \code {char} & Zeichen (ASCII) & 0 bis 255 & 8 \\ + \bottomrule + \end{tabular} + \end{center} + + Arithmetische Operationen: Gemischte Ausdrücke sind vom ''allgemeineren'' Typ (in der Tabelle der höhere Typ). \medskip + + Konverter von Zahlen in ASCII (typ char) zum Typ int: x - '0' + + \subsubsection{Über- und Unterlauf} + + i) Über-/Unterlauf mit Typ \emph{int} sind undefiniertes Verhalten, d.h. keine Fehlermeldungen, keine Garantien für das Ergebnis. \medskip + + ii) Mit Typ \emph{unsigned int} sind Über-/Unterlauf klar definiert, durch Rechnung modulo $2^B$ - 1. Beispiel: $0-1 =2^{32}-1$, bzw. $(2^{32} - 1) + 1 = 0$ + + \subsection{std::string} + + Der Typ für Zeichenketten ist std::string. Ein paar Basics: + + \begin{center} + \begin{tabular}{r l} \toprule + Bibliothek: & \code{\#include } \\ + Initialisierung: & \code{std::string text = ''To'';} \\ + Zugriff auf i-tes Zeichen: & \code{text.at(i);} \\ + Konkatenieren: & \code{text += ''gether'';} \\ + Länge abfragen: & \code{text.length();} \\ + \bottomrule + \end{tabular} + \end{center} + \vfill\null + \columnbreak + + + \subsection{Fliesskommazahlen} + + Fliesskommazahlen besitzen 'Löcher' in ihrem Wertebereich, d.h. es wird immer auf die nächste darstellbare Zahl gerundet. + + \subsubsection{Normalisierte Darstellung} + + \begin{center} + \begin{minipage}{0.55\linewidth} + \begin{center} + \begin{tabular}{r l} \toprule + \textbf{$\beta$} & \hspace*{-10pt} Basis ($\beta \geq 2$) \\ + \textbf{$p$} & \hspace*{-10pt} Präzision (Stellenanzahl) \\ + \textbf{e$_{min}$} & \hspace*{-10pt} Kleinster mögliche Exponent \\ + \textbf{e$_{max}$} & \hspace*{-10pt} Grösster mögliche Exponent \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.44 \linewidth} + \begin{center} + \renewcommand{\arraystretch}{1.5} + \eqbox{\begin{tabular}{l} + $F^*(\beta, p, e_{min}, e_{max}$) \\ + $\pm d_0. d_1 \dots d_{p-1} \cdot \beta^e$ \\ + \end{tabular}} + + $e \in \{e_{min}, \dots e_{max}\}, \, d_0 \neq 0$ + \end{center} + \end{minipage} + \end{center} + + \begin{center} + \includegraphics[width=0.9\linewidth]{Bilder/Floatingpoint.JPG} + \end{center} + + \subsubsection{Fliesskomma-Richtlinien} + + i) Teste keine Fliesskommazahlen auf Gleichheit. + + ii) Addiere keine Fliesskommazahlen sehr unterschiedlicher Grösse. + + iii) Subtrahiere keine Fliesskommazahlen ähnlicher Grösse. + + + \subsection{Literale} + + Literale besitzen einen festen Wert und Typ. Verschiedene Literale: + + \begin{center} + \begin{tabular}{r l c r l} \toprule + int: & \hspace*{-10pt} 10 & \hspace*{+10pt} & double: & \hspace*{-10pt} 20.0 \\ + unsigned int: & \hspace*{-10pt} 10u & \hspace*{+10pt} & float: & \hspace*{-10pt} 20.0f \\ + char: & \hspace*{-10pt} 'a' & \hspace*{+10pt} & string: & \hspace*{-10pt} ''Help me'' \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Verschiedene Zahlendarstellungen} + + \begin{center} + \begin{minipage}{0.49 \linewidth} + \begin{center} + \begin{tabular}{r l} \toprule + \multicolumn{2}{l}{\textbf{Präfixe}:} \\ + \midrule + Hexadezimal: & \hspace*{-10pt} \code{0x} \\ + Oktal: & \hspace*{-10pt} \code{0} \\ + Binär: & \hspace*{-10pt} \code{0b} \\ + \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.5 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + Dezimal: & \code{255} \\ + Hexadezimal: & \code{0xff} \\ + Oktal: & \code{0377} \\ + Binär: & \code{0b11111111} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + \subsection{L-Wert und R-Wert} + + \begin{center} + \begin{minipage}{0.49 \linewidth} + \begin{center} + \begin{tabular}{r l} \toprule + \multicolumn{2}{l}{\textbf{L-Wert}:} \\ + \midrule + i) & \hspace*{-10pt} besitzt Adresse \\ + ii) & \hspace*{-10pt} Wert veränderbar \\ + iii) & \hspace*{-10pt} Bsp: Variablen \\ \bottomrule + \end{tabular} + \end{center} + + \textbf{L}inks vom Zuweisungsoperator. + \end{minipage} + \begin{minipage}{0.5 \linewidth} + \begin{center} + \begin{tabular}{r l} \toprule + \multicolumn{2}{l}{\textbf{R-Wert:}} \\ + \midrule + i) & \hspace*{-10pt} besitzt \emph{keine Adresse} \\ + ii) & \hspace*{-10pt} Wert konstant \\ + iii) & \hspace*{-10pt} Bsp: Literale \\ \bottomrule + \end{tabular} + \end{center} + + \textbf{R}echts vom Zuweisungsoperator. + \end{minipage} + \end{center} + + \begin{center} + \eqbox{L-Werte können als R-Werte benutzt werden, aber nicht umgekehrt!} + \end{center} + + + \subsection{Assertions} + + Assertions sind ein simples Tool um Laufzeitfehler aufzufangen. + + \begin{center} + \begin{minipage}{0.49 \linewidth} + \begin{center} + \begin{tabular}{r p{0.75\linewidth}} \toprule + 1: & \hspace*{-10pt} Assertions abschalten \\ + 2: & \hspace*{-10pt} Bibliothek \\ + 3: & \hspace*{-10pt} Programm wird angehalten, wenn \code{expr} nicht wahr ist. \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.5 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{\#define NDEBUG} \\ + 2 & \code{\#include } \\ + 3 & \code{assert(expr)}; \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + \vfill\null + \columnbreak + + \subsection{Operatoren} + + Die Auswertung erfolgt nach Präzedenz, beginnend mit Präzedenz 17! + + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{l c c l l} \toprule + \textbf{Operator} & \hspace*{-10pt} \textbf{Symbol} & \hspace*{-10pt} \textbf{Präz.} & \hspace*{-10pt} \textbf{Assoz.} & \hspace*{-10pt} \textbf{L/R-Werte} \\ + \midrule + \multicolumn{3}{l}{\textbf{Arithmetische Operatoren}} \\ + \midrule + Negation & \hspace*{-10pt} \code{-} & \hspace*{-10pt} 16 & \hspace*{-10pt} rechts & \hspace*{-10pt} R $\to$ R \\ + Multiplikation & \hspace*{-10pt} \code{*} & \hspace*{-10pt} 14 & \hspace*{-10pt} rechts & \hspace*{-10pt} RxR $\to$ R \\ + Division & \hspace*{-10pt} \code{/} & \hspace*{-10pt} 14 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Modulo & \hspace*{-10pt} \code{\%} & \hspace*{-10pt} 14 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Addition & \hspace*{-10pt} \code{+} & \hspace*{-10pt} 13 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Substraktion & \hspace*{-10pt} \code{-} & \hspace*{-10pt} 13 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Zuweisung & \hspace*{-10pt} \code{=} & \hspace*{-10pt} 4 & \hspace*{-10pt} rechts & \hspace*{-10pt} R $\to$ L \\ + \midrule + \multicolumn{3}{l}{\textbf{In-/Dekrement Operatoren}} \\ + \midrule + Post-Inkrement & \hspace*{-10pt} \code{expr++} & \hspace*{-10pt} 17 & \hspace*{-10pt} links & \hspace*{-10pt} L $\to$ R \\ + Post-Dekrement & \hspace*{-10pt} \code{expr--} & \hspace*{-10pt} 17 & \hspace*{-10pt} links & \hspace*{-10pt} L $\to$ R \\ + Prä-Inkrement & \hspace*{-10pt} \code{++expr} & \hspace*{-10pt} 16 & \hspace*{-10pt} rechts & \hspace*{-10pt} L $\to$ L \\ + Prä-Dekrement & \hspace*{-10pt} \code{--expr} & \hspace*{-10pt} 16 & \hspace*{-10pt} rechts & \hspace*{-10pt} L $\to$ L \\ + \midrule + \multicolumn{3}{l}{\textbf{Relationale Operatoren}} \\ + \midrule + Kleiner als & \hspace*{-10pt} \code{<} & \hspace*{-10pt} 11 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Grösser als & \hspace*{-10pt} \code{>} & \hspace*{-10pt} 11 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Kleiner gleich & \hspace*{-10pt} \code{<=} & \hspace*{-10pt} 11 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Grösser gleich & \hspace*{-10pt} \code{>=} & \hspace*{-10pt} 11 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Gleich & \hspace*{-10pt} \code{==} & \hspace*{-10pt} 10 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Ungleich & \hspace*{-10pt} \code{!=} & \hspace*{-10pt} 10 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + \midrule + \multicolumn{3}{l}{\textbf{Logische Operatoren}} \\ + \midrule + Logisches AND & \hspace*{-10pt} \code{\&\&} & \hspace*{-10pt} 6 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Logisches OR & \hspace*{-10pt} \code{||} & \hspace*{-10pt} 5 & \hspace*{-10pt} links & \hspace*{-10pt} RxR $\to$ R \\ + Logisches NOT & \hspace*{-10pt} \code{!} & \hspace*{-10pt} 16 & \hspace*{-10pt} rechts & \hspace*{-10pt} R $\to$ R \\ + \midrule + \multicolumn{3}{l}{\textbf{Ein- und Ausgabe}} \\ + \midrule + Eingabeoperator & \hspace*{-10pt} \code{>>} & \hspace*{-10pt} 12 & \hspace*{-10pt} links & \hspace*{-10pt} L $\to$ L \\ + Ausgabeoperator & \hspace*{-10pt} \code{<<} & \hspace*{-10pt} 12 & \hspace*{-10pt} links & \hspace*{-10pt} R $\to$ L \\ + \midrule + \multicolumn{3}{l}{\textbf{Zeiger}} \\ + \midrule + Adressoperator & \hspace*{-10pt} \code{\&} & \hspace*{-10pt} 16 & \hspace*{-10pt} rechts & \hspace*{-10pt} L $\to$ R \\ + Dereferenz-Operator & \hspace*{-10pt} \code{*} & \hspace*{-10pt} 16 & \hspace*{-10pt} rechts & \hspace*{-10pt} L $\to$ R \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Ergänzungen: Division (\code{/}) und Modulo (\code{\%})} + + i) Falls zwei Ganze Zahlen (\code{int} oder \code{unsigned int}) dividiert werden, so rundet der Operator ganzzählig! \medskip + + ii) Modulo gibt es nur für \code{int} und \code{unsigned int}. Bei negativen Zahlen übernimmt \code{\%} das Vorzeichen des linken Operanden. + + \subsubsection{Kurzschlussauswertung} + + Logische Operatoren werten den linken Operanden zuerst aus. Steht das Ergebnis schon fest, wird der rechte Operand \emph{nicht} mehr ausgewertet. + + \subsubsection{Richtlinie} + + Vermeide das Verändern von Variablen, welche im selben Ausdruck noch einmal verwendet werden! + \vfill\null + \columnbreak + + + \subsection{Sonstiges} + + \subsubsection{Standardbibliothek: \code{\#include}} + + \begin{tabular}{r l p{0.375\linewidth}} \toprule + Was & \hspace*{-10pt} Code & \hspace*{-10pt} Beschreibung \\ + \midrule + Potenzieren & \hspace*{-10pt} \code{std::pow(2.5,2);} & \hspace*{-10pt} $2.5^2 = 6.25$ \\ + Quadratwurzel & \hspace*{-10pt} \code{std::sqrt(14.0625);} & \hspace*{-10pt} $\sqrt{14.0625} = 3.75$ \\ + Absolutbetrag & \hspace*{-10pt} \code{std::abs(-3);} & \hspace*{-10pt} $|-3| = 3$ \\ + Minimum & \hspace*{-10pt} \code{std::min(z, 1.0);} & \hspace*{-10pt} Minimum zweier Argumente \emph{gleichen Typs} \\ + Maximum & \hspace*{-10pt} \code{std::max(z, 1.0);} & \hspace*{-10pt} Maximum zweier Argumente \emph{gleichen Typs} \\ + \bottomrule + \end{tabular} + + + \subsubsection{Funktionalität(en) auslagern} + + i) Funktionen und Typen in eigene Datei schreiben (test.cpp). + + ii) Dateien ins Arbeitsverzeichnis der Hauptdatei speichern. + + iii) In der Hauptdatei Header inkludieren: \code{\#include ''test.cpp''}. \medskip + + Nachteil: Compiler muss Funktionsdefinition immer neu übersetzen (Zeitaufwand). + + + \subsubsection{Getrennte Übersetzung} + + i) Funktionen und Typen in eigene Datei schreiben (test.cpp). + + ii) test.cpp seperat kompilieren $\Rightarrow$ test.o. + + iii) Deklaration aller benötigten Symbole in Headerdatei (test.h). + + iv) Headerdatei im Arbeitsverzeichnis speichern. + + v) In der Hauptdatei inkludieren: \code{\#include ''test.h''}. \medskip + + Vorteil: Quellcode muss nur einmal übersetzt werden und ist vor Einblick geschützt. + + + + \section{Kontrolflussanweisungen} + + + \subsection{Blöcke} + + \begin{center} + \begin{minipage}{0.6 \linewidth} + Ein Block gruppiert mehrere Anweisungen zu formell einer Anweisung. Normalerweise wird überall ein Block verwendet, anstelle von einer einzigen Anweisung. + \end{minipage} + \begin{minipage}{0.39 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{l} + \{ \\ + \quad \code{statements} \\ + \quad \vdots \\ + \} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + + \subsubsection{Gültigkeitsbereich von lokalen Variablen} + + i) Variablen, die in einem Block deklariert sind (''lokale Variablen''), sind ausserhalb des Blocks nicht gültig. Kontrollanweisungen verhalten sich in diesem Zusammenhang wie Blöcke. \medskip + + ii) Haben mehrerer Variablen den gleichen Namen, dann wird immer die Variable mit der am stärksten verschachtelten Deklaration gewählt. + + + \subsection{if-else Anweisung} + + + + \begin{center} + \begin{minipage}{0.5 \linewidth} + 1) Ist \code{condition} wahr, dann wird \code{statement1} ausgeführt. \medskip + + 2) Ist \code{condition} falsch, dann wird \code{statement2} ausgeführt. + \end{minipage} + \begin{minipage}{0.39 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{if (condition)} \\ + 2 & \code{\quad statement1} \\ + 3 & \code{else } \\ + 4 & \code{\quad statement2} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + \vfill\null + \columnbreak + + + \subsection{for Schleife} + + Eine for-Schleife iteriert eine Anweisung mit einer Laufvariable, solange \code{condition} erfüllt ist. + + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{for (init statement; condition; expression)} \\ + 2 & \code{\quad body statement} \\ + \end{tabular}} + \end{center} + + \begin{tabular}{r l l} \toprule + \code{init statement}: & \hspace*{-10pt} Deklaration Laufvariable & (Bsp: \code{int i = 0}) \\ + \code{condition}: & \hspace*{-10pt} Iterationsbedingung & (Bsp: \code{i < 10}) \\ + \code{expression}: & \hspace*{-10pt} Manipulation Laufvariable & (Bsp: \code{++i}) \\ \bottomrule + \end{tabular} \medskip + + Die Manipulation der Laufvariable wird \emph{immer am Ende} der jeweiligen Iteration durchgeführt. + + + \subsection{while Schleife} + + Eine while-Schleife iteriert eine Anweisung, solange \code{condition} erfüllt ist. + + \begin{center} + \begin{minipage}{0.54 \linewidth} + \begin{center} + \begin{tabular}{r p{0.5\linewidth}} \toprule + \code{condition}: & \hspace*{-10pt} Iterationsbedingung \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.45 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{while (condition)} \\ + 2 & \code{\quad statement} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + + \subsection{do-while Schleife} + + Einziger Unterschied zur while Schleife ist, dass die Anweisungen mindestens einmal ausgeführt werden. Dies ist so, da \code{condition} erst am Ende der Iteration geprüft wird. + + \begin{center} + \begin{minipage}{0.54 \linewidth} + \begin{center} + \begin{tabular}{r p{0.5\linewidth}} \toprule + \code{condition}: & \hspace*{-10pt} Iterationsbedingung \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.45 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{do} \\ + 2 & \code{\quad statement} \\ + 3 & \code{while (condition)} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + + \subsection{Sprunganweisungen} + + \begin{center} + \begin{minipage}{0.7 \linewidth} + \begin{center} + \begin{tabular}{r p{0.75\linewidth}} \toprule + 1: & \hspace*{-10pt} Die umschliessende Iterationsschleife wird sofort beendet. \\ + 2: & \hspace*{-10pt} Überspringt den Rest der Anweisungen der jetzigen Iteration. Die Iteration wird aber \textbf{nicht} abgebrochen! \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.29 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{break;} \\ + 2 & \code{continue;} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + + \subsection{switch Anweisung} + + Die switch Anweisung eignet sich um eine Fallunterscheidung zu treffen. Der Ausdruck \code{expr} wird ausgewertet und springt, falls ein entsprechender Fall vorhanden ist, zu diesem, ansonsten zum \code{default}-Fall. + + \begin{center} + \begin{minipage}{0.65 \linewidth} + \begin{center} + \begin{tabular}{r p{0.62\linewidth}} \toprule + \code{expr} & \hspace*{-10pt} Muss zu \code{int} konvertierbar sein! \\ + \code{case} & \hspace*{-10pt} Definiert einen Fall mit einem \emph{konstanten} int Wert (hier 1). \\ + \code{break;} & \hspace*{-10pt} Springt aus dem switch-case \\ + \code{default:} & \hspace*{-10pt} Standardfall \\ \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.34 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{l} + \code{switch (expr)} \{ \\ + \code{\quad case 1:} \\ + \code{\quad\quad statement} \\ + \code{\quad\quad break;} \\ + \code{\quad default:} \\ + \code{\quad\quad statement2} \\ + \} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + Wird ein Fall nicht mit \code{break;} beendet, werden darunterliegende Fälle auch ausgeführt (genannt ''durchfallen''), bis ein \code{break;} erreicht wird. + \vfill\null + \columnbreak + + + \section{Funktionen} + + \subsection{Definition} + + Eine Funktionsdefinition gehört oberhalb von \code{main()} hin. Die Argumente einer Funktion verhalten sich wie lokale Variablen im Funktionsblock. + + \begin{center} + \begin{minipage}{0.375\linewidth} + \begin{center} + \begin{tabular}{r l} \toprule + \code{T} & \hspace*{-10pt} Rückgabetyp \\ + \code{fname} & \hspace*{-10pt} Funktionsname \\ + \code{T$_i$} & \hspace*{-10pt} Argumenttypen \\ + \code{pname$_i$} & \hspace*{-10pt} Argumente \\ + \bottomrule + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.615 \linewidth} + \begin{center} + \eqbox{\begin{tabular}{l} + \code{T fname(T$_1$ pname$_1$,$\dots$,T$_n$ pname$_n$)}\{ \\ + \code{\quad statements} \\ + \code{\quad return expr;} \\ + \} \\ + \\ + \code{int main()} \{ \\ + \code{\quad /* Funktionsaufruf */} \\ + \code{\quad fname(expr$_1$, $\dots$, expr$_n$);} \\ + \} \\ + \end{tabular}} + \end{center} + \end{minipage} + \end{center} + + Der Rückgabetyp kann auch vom Typ \code{void} sein, welcher der Typ mit leerem Wertebereich ist, d.h. keine Rückgabe. + + \subsubsection{Rückgabewert} + + Jede Funktion, die nicht den Rückgabetyp \code{void}, hat, \textbf{muss} ein \code{return} besitzen. Der Rückgabewert wird immer zum Rückgabetyp konvertiert und ergibt den Wert des Funktionsaufruf. + + + \subsection{Vor- und Nachbedingungen} + + Es ist sinnvoll Funktionen gut zu dokumentieren mit PRE-/POST-Conditions (Vor- und Nachbedingungen). + + \begin{center} + \begin{tabular}{r l} \toprule + Vorbedingungen: & \hspace*{-10pt} Spezifiziert den Definitionsbereich der Funktion. \\ + & \hspace*{-10pt} - Sollten immer mit asserts geprüft werden. \\ + Nachbedingungen: & \hspace*{-10pt} Spezifiziert Wert und Effekt der Funktion. \\ + & \hspace*{-10pt} - Kann oft einfach mit asserts überprüft werden. \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Forward Declarations} + + Eine Funktion kann im Programm nur in Zeilen verwendet werden, welche nach der Deklaration der Funktion kommen. Eine Forward Declaration ist einfach der Funktionskopf ohne den Funktionskörper: + + \begin{center} + \eqbox{\code{T fname(T$_1$ pname$_1$,$\dots$,T$_n$ pname$_n$);}} + \end{center} + + + \subsection{Namensräume (namespace)} + + Mit namespaces kann man Funktionen, Typen, etc. katalogisieren. Ausserdem kann man bei grösseren Projekten mit namespaces verschiedenste Namenskonflikte verhindern. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{namespace boring}\{ \code{// neuer Namensraum} \\ + \code{\quad void func() // gehört zum Namensraum 'boring'} \\ + \} \\ + \code{main()} \{ \\ + \code{\quad boring::func(); // Zugriff auf Element im Namensraum} \\ + \} \\ + \end{tabular}} + \end{center} + \vfill\null + \columnbreak + + + \section{Vektoren} + + Vektoren dienen zum Speichern gleichartiger Daten (gleicher Typ). Ein Vektor kann aus beliebigen Typen bestehen. + + + \subsection{Initialisierung} + + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{l} \toprule + \code{auto vec = std::vector(5);} \\ + \qquad - Vektor mit 5 Elementen auf Wert 0 initialisiert. \\ + \code{auto vec = std::vector(5,2);} \\ + \qquad - Vektor mit 5 Elementen auf Wert 2 initialisiert. \\ + \code{std::vector vec = }\{\code{3,2,1}\}\code{;} \\ + \qquad - Vektor wird mit einer Liste von Werten initialisiert. \\ + \code{std::vector empty;} \\ + \qquad - Deklariert und initialisert einen leeren Vektor. \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Funktionalität} + + Nicht vergessen, dass der Index bei Vektoren mit 0 beginnt! + + \begin{center} + \begin{tabular}{r l} \toprule + Bibliothek: & \hspace*{-10pt} \code{\#include} \\ + Zugriff auf Element \code{i} ohne Index-Check: & \hspace*{-10pt} \code{vec[i]} \\ + Zugriff auf Element \code{i} mit Index-Check: & \hspace*{-10pt} \code{vec.at(i);} \\ + Fügt \code{x} hinten an: & \hspace*{-10pt} \code{vec.push\_back(x);} \\ + Die Länge vom Vektor: & \hspace*{-10pt} \code{vec.size();} \\ + Ändert die Länge zu \code{v}: & \hspace*{-10pt} \code{vec.resize(v);} \\ + \midrule + Prüft, ob Vektor leer ist: & \hspace*{-10pt} \code{vec.empty();} \\ + Löscht den Inhalt: & \hspace*{-10pt} \code{vec.clear();} \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Mehrdimensionale Vektoren} + + Funktioniert im Prinzip gleich wie ein 1D-Vektor. + + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{r l} \toprule + Leere Matrix: & \hspace*{-10pt} \code{std::vector> matrix;} \\ + Initialisierung: & \hspace*{-10pt} \code{auto matrix = std::vector>(} \\ + & \hspace*{-10pt} \code{rows, std::vector(cols, value));} \\ + Definition: & \hspace*{-10pt} \code{std::vector> matrix(} \\ + & \hspace*{-10pt} \code{rows, std::vector(cols, value));} \\ + Zugriff: & \hspace*{-10pt} \code{matrix.at(i).at(j);} \\ + \bottomrule + \end{tabular} + \end{center} + + \begin{center} + \includegraphics[width=0.75\linewidth]{Bilder/Matrix.png} + \end{center} + + + \subsubsection{Einschub: Typ-Alias} + + Für lange Typen kann es sich lohnen eine Typ-Alias zu definieren: + + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{r l} \toprule + Allgemein: & \hspace*{-10pt} \code{using newName = Typ;} \\ + Beispiel: & \hspace*{-10pt} \code{using matrix = std::vector>;} \\ + & \hspace*{-10pt} \code{matrix m = ...;} \\ + \bottomrule + \end{tabular} + \end{center} + \vfill\null + \columnbreak + + + + \section{Referenzen} + + Eine Referenz funktioniert wie ein Alias für ein anderes Objekt. Intern ist eine Referenz die Adresse vom referenzierten Objekt, d.h. eine Zuweisung auf eine Referenz ändert das ursprüngliche Objekt. + + \begin{center} + \begin{tabular}{r l} \toprule + Referenz vom Typ T: & \hspace*{-10pt} \code{T\& rname = lvalue;} \\ + const-Referenz vom Typ T: & \hspace*{-10pt} \code{const T\& rname = rvalue;} \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Const-Referenzen} + + Eine const-Referenz setzt \textbf{nicht} vorraus, dass das ursprüngliche Objekt auch const ist. Es sagt einfach aus, dass man über die Referenz nur \emph{read-only} Zugriff auf die ursprüngliche Variable hat. \medskip + + Bemerkung: Eine const-Referenz kann ausserdem mit einem R-Wert initialisiert werden, in diesem Fall erzeugt der Compiler ein tempörares Objekt mit ausreichender Lebensdauer. + + + \subsection{Anwendung: Pass by Reference} + + Referenzen sind sehr nützlich um Funktionen nicht fundamental Datentypen wie Vektoren zu übergeben, da sie es erlauben die Werte des Aufrufargument zu ändern. + + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{void func(std::vector\& i)} \{ \\ + 2 & \code{\quad statements} \\ + 3 & \} \\ + \end{tabular}} + \end{center} + + \subsubsection{Pass by const Reference (\code{const T\&})} + + Überall wo es möglich ist, sollte man nicht fundamentale Typen als \code{const T\&} übergeben. Dies spart Ressourcen und stellt klar, dass man das Argument nicht mit der Funktion verändert. + + \subsubsection{Pass by Value} + + Bei Pass by Value, d.h. das Argument hat kein Referenztyp, wird eine \emph{Kopie des Objekts} übergeben. + + + \subsection{Anwendung: Return by Reference} + + Return by Reference ermöglicht es, dass der Rückgabewert ein L-Wert ist anstelle von einem R-Wert. + + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{int\& increment(int\& i)} \{ \\ + 2 & \code{\quad return ++i;} \\ + 3 & \} \\ + \\ + 4 & increment(increment(x)); \\ + \end{tabular}} + \end{center} + + Eine Funktion, welche eine Referenz als Argument nimmt, kann man nur mit sich selbst als Argument anwenden (Zeile 4), falls der Rückgabetyp auch eine Referenz ist. Sonst gibt die Funktion im Argument einen R-Wert zurück, obwohl ein L-Wert benötigt wird. + + \subsection{Referenz-Richtlinie} + + Wenn man eine Referenz erzeugt, muss das Objekt, auf das sie verweist, mindestens so lange ''leben'' wie die Referenz selbst. + \vfill\null + \columnbreak + + + \section{Ein- und Ausgabeströme} + + \subsection{Generische Ströme (Abstrakter Typ)} + + Man muss für eine Funktion nicht unbedingt genau spezifizieren, was für eine Eingabeart (Konsole, File, etc.) notwendig ist. Man interagiert mit den generischen Strömen auch über den Eingabe- und Ausgabeoperator. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{\#include } \\ + \code{void func(std::istream\& in, std::ostream\& out)} \\ + \end{tabular}} + \end{center} + + Man muss die Argumente als normale Referenz deklarieren, da sie den Eingabestrom bzw. Ausgabestrom verändern durch lesen bzw. schreiben. + + \subsubsection{Filestream} + + Ein Beispiel mit Dateien zur Ein- und Ausgabe: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{\#include } \\ + \code{std::ifstream from = std::ifstream(''source.txt'');} \\ + \code{std::ofstream to = std::ofstream(''destination.txt'');} \\ + \\ + \code{int main ()} \\ + \code{\qquad func(from, to);} \\ + \end{tabular}} + \end{center} + + \subsubsection{Stringstream} + + Ein weiteres Beispiel für einen Eingabestrom ist der Stringstream: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{\#include } \\ + \code{std::string text = ''Text!'';} \\ + \code{std::istringstream from = std::istringstream(text);} \\ + \\ + \code{int main ()} \\ + \code{\qquad func(from, std::cout);} \\ + \end{tabular}} + \end{center} + + + \subsection{Whitespaces} + + Per default ignorieren die Eingabeströme Whitespaces (Leerschläge, Zeilenumbrüche, Tabs, etc.). Dies kann man durch \code{std::noskipws} ändern (Zeile 1), nichtdestotrotz kann man Whitespaces entfernen durch \code{std::ws} (Zeile 2). + + \begin{center} + \eqbox{\begin{tabular}{r l} + 1 & \code{std::cin >> std::noskipws;} \\ + 2 & \code{std::cin >> std::ws;} \\ + \end{tabular}} + \end{center} + + + \subsection{Eingabestrom als Bedingung für Kontrollanweisungen} + + Ist eine Eingabe im Eingabestrom vorhanden, dann kann man den nächsten Wert des Eingabestroms in eine Variable auslesen und die Bedingung evaluiert als 'true'. + + Sind keine Eingaben mehr vorhanden im Eingabestrom, dann evaluiert die Bedingung als 'false'. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{char input;} \\ + \code{while(std::cin >> input)} \\ + \quad ... \\ + \end{tabular}} + \end{center} + + Dasselbe geht natürlich auch für z.B. eine if-else-Bedingung! + \vfill\null + \columnbreak + + + \section{Rekursion} + + Rekursion passiert, wenn eine Funktion sich selbst aufruft. Der Grundaufbau einer (funktionierenden) Rekursion ist, wie folgt: + + \begin{itemize} + \item \textbf{Basecase}: Abbruchsbedingung, welche die Rekursion stoppen soll. Grundsätzlich muss sich die Rekursion diesem Fall stetig annähern, ansonst gibt es eine unendliche Rekursion und einen \emph{stack overflow}. + \item \textbf{Rekursiver Teil}: Hier wird die Aufgabe der Funktion gelöst durch einen Aufruf der Funktion selbst, d.h. die Funktion führt etwas aus und ruft sich dann selbst auf (oder umgekehrt). + \end{itemize} + + + \subsection{Der Aufrufstapel} + + Jeder rekursive Funktionsaufruf hat seine eigenen, unabhängigen Variablen und Argumente. Darstellung als Aufrufsstapel: + + \begin{center} + \includegraphics[width=0.8\linewidth]{Bilder/Aufrufstapel.png} + \end{center} + + + \subsection{Anwendungsbeispiele} + + Ein einfacheres Beispiel: + + \includegraphics[width=0.9\linewidth]{Bilder/Rekursion_bsp.png} \medskip + + Ein etwas komplexeres Beispiel: + + \includegraphics[width=1\linewidth]{Bilder/Rekursion_bsp2.png} + + + \section{Extended Backus Naur Form (EBNF)} + + EBNF ist eine formale Grammatik. Man kann sie benutzen um Sätze zu produzieren oder um Sätze zu Parsen (überprüfen). + + \subsection{Sätze} + + Sätze bestehen aus folgenden Bestandteilen. Der Unterschied zwischen nicht-terminalen Symbolen und terminalen Symbolen ist, dass terminale Symbole keine weitere Funktionsaufrufe enthalten. + + \begin{center} + \begin{tabular}{r l} \toprule + Nichtterminale Symbole: & \hspace*{-10pt} Kann weiter zerlegt werden \\ + Terminale Symbole: & \hspace*{-10pt} Kann nicht weiter zerlegt werden \\ + Alternative: & \hspace*{-10pt} \code{|} \\ + optionale Repetition: & \hspace*{-10pt} \{ \dots \} \\ + optional Einmal: & \hspace*{-10pt} [ \dots ] \\ + Satz beendet: & \hspace*{-10pt} . \\ + \bottomrule + \end{tabular} + \end{center} + + Beispielssatz: \, factor = number $|$ ''('' expression '')'' $|$ ''-'' factor. \medskip + + In Worten: \emph{factor} besteht aus \emph{number} ODER dem Zeichen ''('' gefolgt von \emph{expression} und '')'' ODER dem Zeichen ''-'' und \emph{factor} selbst. + + + \subsection{Parsing} + + Parsing ist das überprüfen, ob und wie ein Satz aus einer formellen Grammatik erzeugt werden kann. Grundsätzlich gilt: + + \begin{center} + \begin{tabular}{r l} \toprule + \textbf{EBNF} & \hspace*{-10pt} \textbf{Parser} \\ + \midrule + Satz: & \hspace*{-10pt} Funktion \\ + Alternative: & \hspace*{-10pt} if-Anweisung \\ + Nichtterminales Symbol: & \hspace*{-10pt} Funktionsaufrufe \\ + optionale Repetition: & \hspace*{-10pt} while-Anweisung \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Einschub: peek() (\code{\#include })} + + Die Funktion peek() erlaubt es das nächste Zeichen im Inputstream anzuschauen, \emph{ohne es zu entfernen}. Dies ist notwendig für Parsing. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{std::istringstream s1(''Hello, world.'');} \\ + \code{char c1 = s1.peek();} // c1 = 'H' \\ + \end{tabular}} + \end{center} + + Die Funktion ignoriert Whitespaces \emph{nie} (unabhängig von std::noskipws). + + \subsubsection{Einschub: \code{lookahead(std::istream\& is)}} + + Diese Funktion gibt den nächsten \emph{non-whitespace} Charakter vom Eingabestrom, d.h. es funktioniert wie peek, aber es ignoriert Whitespaces. + + \subsubsection{Einschub: consume(std::istream\& is, char expected)} + + Diese Funktion findet man in \code{ebnf\_helpers.h}. Es ist wichtig zu überprüfen, welche Variante der Funktion drinnen ist, da es bisher zwei verschiedene gab. Die neuere Variante hat folgende Charakterisierung: + + \begin{itemize} + \item Liest den nächsten Charakter vom Inputstream und gibt \emph{True} zurück, falls es der gleiche Charakter ist, wie der Charakter im Argument der Funktion. Ausserdem wird der Charakter vom Inputstream \textbf{entfernt}. + \item Ist es nicht der gleiche Charakter, dann gibt die Funktion \emph{False} zurück und der Charakter wird in den Inputstream \textbf{zurückgelegt}! + \end{itemize} + + Bem: Bei der älteren Variante ist der grosse Unterschied, dass der Charakter beim Fall \emph{False} nicht zurückgelegt wird in den Inputstream. + + + \subsection{Anwendung: Codebeispiele von Parsing} + + Für die \emph{neuere} Version von \code{consume()} gibt es folgendes Beispiel: + + \includegraphics[width=0.85\linewidth]{Bilder/EBNF.png} \medskip + + Für die \emph{ältere} Version von \code{consume()} gibt es folgendes Beispiel: + + \includegraphics[width=0.92\linewidth]{Bilder/EBNF_2.png} + \vfill\null + \columnbreak + + + \section{Structs \& Klassen} + + \subsection{Structs} + + Structs sind Container für Datentypen. Die zugrundeliegende Typen können fundamentale aber auch benutzerdefinierte Typen sein. + + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{r l} \toprule + Definition: & \hspace*{-10pt} \code{struct strName} \{ \\ + & \hspace*{-10pt} \code{\quad int mem1;} \\ + & \hspace*{-10pt} \code{\quad bool mem2;} \\ + & \hspace*{-10pt} \}\code{;} \\ + Default-Initialisierung: & \hspace*{-10pt} \code{strName obj1;} \\ + Initialisierung mit Startwerten: & \hspace*{-10pt} \code{strName obj2 = }\{\code{3,true}\}\code{;} \\ + Initialisierung mit anderem Objekt: & \hspace*{-10pt} \code{strName obj3 = obj2;} \\ + Zugriff auf Member: & \hspace*{-10pt} \code{obj1.mem1 = 10;} \\ + \bottomrule + \end{tabular} + \end{center} + + Achtung: Bei Default-Init werden alle Member einzeln default-initialisiert, dies bedeutete für fundamentale Typen, dass sie uninitialisiert sind. Zugriff bevor einer Zuweisung ist undefined behavior! + + + \subsection{Überladen von Funktionen} + + Es ist möglich mehrere Funktionen gleichen Namens zu definieren und deklarieren. Die 'richtige' Version wird aufgrund der Signatur der Funktion (Typ, Anzahl und Reihenfolge der Argumente) ausgewählt. + + \begin{center} + \begin{tabular}{r l} \toprule + Funktion: & \hspace*{-10pt} \code{int pow(int b, int e)} \{ \dots \} \\ + Bsp. einer Überladung: & \hspace*{-10pt} \code{int pow(int e)} \{ return pow(2,e); \} \\ + \bottomrule + \end{tabular} + \end{center} + + Achtung: Die Argumentnamen haben \emph{keinen} Einfluss auf die Signatur! + + \subsubsection{Operator overloading} + + Operatoren (\code{+, -, *, /, +=, <<}, etc.) können auch überladen werden und so für eigene Structs und Classes definiert werden. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{cname operator+(cname a, cname b)} \\ + \code{cname operator-(cname a)} \\ + \code{cname\& operator+=(cname\& a, cname b)} \\ + \code{std::ostream\& operator<<(std::ostream\& o, const cname\& r)} \\ + \code{std::istream\& operator>>(std::istream\& in, cname\& r)} \\ + \end{tabular}} + \end{center} + + + \subsection{Klassen} + + Eine Klasse erlaubt Kapselung via Zugriffkontrolle (private, public). Nur auf public Member kann von aussen zugegriffen werden. Der Gültigkeitsbereich von Membern in einer Klasse ist die ganze Klasse, unabhängig von der Deklarationsreihenfolge. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{class className} \{ \\ + \code{public:} \\ + \code{\quad int getHidden();} \\ + \code{private:} \\ + \code{\quad int hidden;} \\ + \}\code{;} \\ + \end{tabular}} + \end{center} + + Einziger Unterschied gegenüber structs ist, dass Members in structs per default public sind, während sie in classes per default private sind. + \vfill\null + \columnbreak + + + \subsection{Memberfunktionen} + + Memberfunktionen stellen die Funktionalität einer Klasse bereit. Die Deklaration erfolgt immer in der Klassendefinition, die Definition der Memberfunktion ist auch extern möglich über den ::Operator. + + \begin{center} + \eqbox{\code{int className::getHidden()} \{\code{return hidden;} \}} + \end{center} + + Aufruf einer Memberfunktion: + + \begin{center} + \eqbox{\code{className.gethidden();}} + \end{center} + + \subsubsection{const Memberfunktionen} + + Man kann durch \code{const} in der Funktionsdefinition versprechen, dass eine Memberfunktion nichts an der Objektinstanz verändert: + + \begin{center} + \eqbox{\code{int className::getHidden const()} \{\code{return hidden;} \}} + \end{center} + + + \subsection{Konstruktoren} + + Konstruktoren sind spezielle Memberfunktionen einer Klasse, die den Namen der Klasse tragen. Sie werden bei der Variablendeklaration aufgerufen (müssen public sein). + + \begin{center} + \begin{tabular}{r l} \toprule + Konstruktor: & \hspace*{-10pt} \code{className(int a): hidden(a)} \{ \dots \} \\ + Default-Konstruktor: & \hspace*{-10pt} \code{className(): hidden(0)} \{ \dots \} \\ + \midrule + Objektinitialisierung: & \hspace*{-10pt} \code{auto myclass = className();} \\ + \midrule + Default-Konstruktor löschen: & \hspace*{-10pt} \code{className() = delete;} \\ + \bottomrule + \end{tabular} + \end{center} + + Ein Default-Konstruktor (kein Argument) wird automatisch erzeugt, falls eine Klasse keinen Konstuktor definiert hat. + + + \subsection{\code{this} Zeiger} + + Member einer Klasse haben ein implizites Argument, nämlich das aufrufende Objekt. Mittels dem \code{this} Zeiger kann man explizit auf das Aufruferobjekt zugreifen. + + \begin{center} + \begin{tabular}{r l} \toprule + Implizit: & \code{return hidden;} \\ + Explizit umständlich: & \code{return (*this).hidden;} \\ + Explizit: & \code{return this->hidden;} \\ + \bottomrule + \end{tabular} + \end{center} + + Dies macht nur Sinn, falls der zu zugreifende Name lokal nicht eindeutig ist oder wenn man z.B. eine Referenz auf das implizite Aufruferobjekt zurückgeben will: + + \begin{center} + \eqbox{\begin{tabular}{ l} + \code{Complex\& operator+= (const Complex\& b)} \{ \\ + \code{\quad real += b.real; // Manipulierung implizites Aufrufobjekt} \\ + \code{\quad imag += b.imag; // Manipulierung implizites Aufrufobjekt} \\ + \code{return *this;} \} \\ + \end{tabular}} + \end{center} + \vfill\null + \columnbreak + + + \section{Allgemeine Ergänzungen} + + \subsection{Pointy Vektor} + + Ist ein Funktionsargument: \code{std::vector* v}, so funktioniert: \medskip + + i) \code{v->size()}; + + ii) \code{v->at(i)}; + + + \subsection{Substrings von Strings} + + Mit der Funktion \code{substr(pos, count)} der Klasse \code{std::string} kann man einen beliebigen Substring vom String nehmen. Beispiel: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{std::string test = "Hello";} \\ + \code{std::cout << test.substr(2,3); // Ausgabe: llo} \\ + \end{tabular}} + \end{center} + + Gibt man der Funktion nur \code{pos} (Startposition) ohne \code{count} (Anzahl Charakter), dann gibt sie den ganzen Rest vom string aus. + \vfill\null + \pagebreak + + + + \section{Zeiger (Pointers)} + + Ein Zeiger enthält die Adresse eines Speicherplatzes. + + \begin{center} + \begin{tabular}{r l} \toprule + Variable vom Typ \code{T}: & \hspace*{-10pt} \code{T var;} \\ + Zeiger vom Typ \code{T*}: & \hspace*{-10pt} \code{T* ptr = \& var;} \\ + Uninitialiserter Zeiger: & \hspace*{-10pt} \code{T* ptr = nullptr;} \\ + Zugriff auf Speicherinhalt: & \hspace*{-10pt} \code{std::cout << *ptr;} \\ + Memberzugriff über Pointer: & \hspace*{-10pt} \code{pointer->member;} \\ + \bottomrule + \end{tabular} + \end{center} + + Das Dereferenzieren eines \code{nullptr} führt zu undefined behavoir! + + + \subsection{Const und Zeiger} + + Am besten liest man die Deklaration von rechts nach links: + + \begin{center} + \begin{tabular}{r p{0.58\linewidth}} \toprule + \code{int const* p2;} & Zeiger auf eine konstante Ganzzahl \\ + \code{int* const p3;} & const-Zeiger auf eine Ganzzahl \\ + \code{int const* const p4;} & const-Zeiger auf eine konstante Ganzzahl \\ + \bottomrule + \end{tabular} + \end{center} + + Bem: Ein Zeiger auf \code{const T} kann auch auf \code{T} zeigen. Der Zeiger behandelt \code{T} dann einfach wie eine Konstante (Wie bei Referenzen). + + + \subsection{Array} + + Dynamisch allozierte Liste, welche von der Grösse \code{size} ist und einen Zeiger zum ersten Element zurückgibt. Der Speicher dafür alloziert man selbst \emph{und muss ihn auch selbst wieder deallozieren}. + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Speicher allozieren: & \hspace*{-10pt} \code{T* ptr = new T[size];} \\ + Speicher deallozieren: & \hspace*{-10pt} \code{delete[] ptr;} \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Zeigerarithmetik} + + Im Prinzip gleich wie bei Variablen, d.h. \code{++ptr} führt zu einer Inkrementation vom Pointer und z.B. \code{ptr + 3} ändert den Pointer an sich nicht. + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Array: & \hspace*{-10pt} \code{int* ptr = new int[3]}\{\code{1,2,3}\}\code{;} \\ + Beispiel 3. Element: & \hspace*{-10pt} \code{int* ptr2 = ptr + 2; // Zeigt auf '3'} \\ + Wahlfreier Zugriff: & \hspace*{-10pt} \code{*(ptr + 2) == ptr[2];} \\ + \bottomrule + \end{tabular} + \end{center} + + Bem: Achten, dass kein 'Out of bounds' Zugriff stattfindet! Wahlfreier Zugriff ist 'teurer' (mehr Operationen), als einen Zeiger zu iterieren. + + \subsubsection{Anwendung: Sequentielle Iteration} + + Normaler Anwendungsfall für Zeigerarithmetik ist Iteration eines Array: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{int* ptr = new int[3]}\{\code{1,2,3}\}\code{;} \\ + \code{for (int* itr = ptr; itr != ptr + 3; ++itr)} \\ + \code{\quad std::cout << *itr << ' ';} \\ + \end{tabular}} + \end{center} + + \subsubsection{Konvention: Übergabe eines Arrays an Funktionen} + + Es ist Konvention immer zwei Zeiger zu übergeben, einer zum ersten Elemente und einer zum Element \textbf{nach} dem letzten. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{int* function(int* begin, int* end)} \{ \} \\ + \code{int* ptr = new int[3]}\{\code{1,2,3}\}\code{;} \\ + \code{function(ptr, ptr + 3);} // ptr+3 ist Element nach dem letzten \\ + \end{tabular}} + \end{center} + \vfill\null + \columnbreak + + \subsection{Dynamische Allokation} + + Objekte welche mit dem \code{new} Operator erstellt werden, leben solange, bis sie mit \code{delete} gelöscht werden (dynamischer Lebensdauer). + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Speicher allozieren: & \hspace*{-10pt} \code{myclass* ptr = new myclass();} \\ + Speicher deallozieren: & \hspace*{-10pt} \code{delete ptr;} \\ + \bottomrule + \end{tabular} + \end{center} + + \textbf{Richtlinie}: Wird ein Objekt gelöscht, dann sollte man alle Pointer, welche auf dieses Objekt zeigen, auf \code{nullptr} setzen. + + \subsubsection{Memory leaks} + + Wird ein Element nicht korrekt durch \code{delete} gelöscht, führt dies zu Speicherlecks, im schlimmsten Fall zu einem Heap Overflow. + + \subsubsection{Hängende Zeiger (dangling pointers)} + + Dereferenzieren oder deallozieren von einem Zeiger, welcher auf ein freigegebenes Objekt zeigt führt zu einem Programmabstürz, da man auf nicht allokierten Speicher zugreift. + + \subsection{Die Dreierregel} + + Klassen, welche dynamisch allokierte Membervariablen besitzen, sollten alle der folgenden drei Funktionen definiert haben. + + \subsubsection{Destruktor} + + Wird implizit aufgerufen, wenn die Speicherdauer eines Objekts endet. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{\texttildelow className();} \\ + \end{tabular}} + \end{center} + + Wenn kein Destruktor definiert ist, wird er automatisch erzeugt und ruft die Destruktoren für die Membervariablen auf. + + \subsubsection{copy-Konstruktor} + + Wird bei jeder Initialisierung, auch bei \emph{pass-by-value}, aufgerufen. + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{l} \toprule + \hspace*{-10pt} \code{className(const className\& other) : var(\dots), \dots} \{ \\ + \hspace*{-10pt} \quad \dots // Dynamische Membervariable(n) allokieren \\ + \hspace*{-10pt} \quad \dots // Alle Variablen kopieren \\ + \hspace*{-10pt} \} \\ + \bottomrule + \end{tabular} + \end{center} + + Falls kein Copy-Konstruktor deklariert ist, wird er automatisch erzeugt mit memberweiser initialisierung. + + \subsubsection{Zuweisungsoperator} + + Wird bei allfälligen Zuweisungen \emph{nach} der Initialisierung aufgerufen. + + \begin{center} + \begin{tabular}{l} \toprule + \code{stack\& stack::operator=(const stack\& s)} \{ \\ + \code{\quad if (topn != s.topn)} \{ // Keine Selbstzuweisung \\ + \code{\quad\quad stack copy = s;} // Aufruf copy-Konstruktor \\ + \code{\quad\quad std::swap(topn, copy.topn);} // copy hat nun den Müll \\ + \code{\quad\quad \dots ;} \qquad // Bei mehr Variablen, mehr swaps \\ + \quad \} // copy wird aufgeräumt \\ + \code{\quad return *this;} // Rückgabe als L-Wert (Konvention) \\ + \} \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Einschub: std::swap (Bibliothek \code{\#include})} + + Inhalte von zwei Variablen einfach tauschen: \code{std::swap(a,b);}. + \vfill\null + \columnbreak + + + \subsection{Anwendung: Verkettete Listen (linked list)} + + Eine verkettete Liste ist ein Speicherlayout, bei welchem kein zusammenhängender Speicherbereich vorhanden ist. + + \subsubsection{Grundelement} + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{struct llnode} \{ \\ + \code{\quad int value;} \\ + \code{\quad llnode* next;} \\ + \code{\quad llnode(int v, llnode* n): value(v), next(n)} \{ \} \\ + \}\code{;} \\ + \end{tabular}} + \end{center} + + \subsubsection{Implementation} + + Eine sehr simple Implementation einer verketteten Liste ist: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{class llvec} \{ \\ + \code{\quad llnode* head; // Zeigt auf das erste Element} \\ + \code{public:} \\ + \code{\quad int\& operator[](unsigned int i);} \\ + \code{\quad void push\_front(int e);} \\ + \code{\quad llvec(unsigned int size); // Konstruktor} \\ + \}\code{;} \\ + \end{tabular}} + \end{center} + + Der Zugriff ist bei einer verketteten Liste ineffizienter: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{int\& operator[](unsigned int i)} \{ \\ + \code{\quad llnode* n = head;} \\ + \code{\quad for(int j = 0; j < i; ++j)} \\ + \code{\quad\quad n = n->next;} \\ + \code{\quad return n->value;} \\ + \} \\ + \end{tabular}} + \end{center} + + Ein grosser Vorteil ist das einfache Anfügen von Elementen: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{void llvec::push\_front(int e)} \{ \\ + \code{\quad head = new llnode(e,head);} \\ + \} \\ + \end{tabular}} + \end{center} + + Der Konstruktor kann man so definieren: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{llvec::llevc(unsigned int size)} \{ \\ + \code{\quad head = nullptr;} \\ + \code{\quad for(unsigned int i = 0; i < size; ++i)} \\ + \code{\quad\quad push}$\_$\code{front(0);} \\ + \} \\ + \end{tabular}} + \end{center} + + + \subsection{Bäume} + + Bäume sind verallgemeinerte Listen, d.h. Knoten könen mehrere Nachfolger besitzen. + \vfill\null + \pagebreak + + + \section{Container} + + Jeder Container hat charakteristische Eigenschaften, d.h. bestimmte Sachen macht er besonders effizient bzw. ineffizient. Es lohnt sich also einen geeigneten Container zu wählen. + + + \subsection{Iteratoren} + + Iteration erfordert vom Prinzip her unabhängig vom Container die gleichen Schritte. In C++ gibt es deswegen zu jedem Container einen passenden Iterator. Implementierung vom Iterator ist für den Nutzer nicht relevant (Abstraktion). + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Iterator für vector: & \hspace*{-10pt} \code{std::vector::iterator it;} \\ + Iterator aufs erste Element: & \hspace*{-10pt} \code{it = vec.begin();} \\ + Iterator \textbf{hinters} letzte Element: & \hspace*{-10pt} \code{it = vec.end();} \\ + Zugriff auf aktuelles Element: & \hspace*{-10pt} \code{*it;} \\ + Iterator inkrementieren: & \hspace*{-10pt} \code{++it;} \\ + \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Anwendung: Sequentielle Iteration} + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{using Iterator = std::vector::iterator;} // Alias \\ + \code{for (Iterator it = vec.begin(); it != vec.end(); ++it)} \{ \\ + \quad\code{\dots} // Anweisungen \\ + \} \\ + \end{tabular}} + \end{center} + + + + \subsubsection{const Iterator} + + Neben einem Iterator sollte jeder Container auch einen Const-Iterator bereitstellen, welcher kein Schreibzugriff gewährleistet: + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{std::vector::const\_iterator itr = vec.begin();} \\ + \end{tabular}} + \end{center} + + \subsubsection{Bereichsbasierte for-Schleife} + + Für die Iteration über einen ganzen Container gibt es auch folgende Möglichkeit: + + \begin{center} + \begin{tabular}{l} \toprule + \code{for(int element: container\_name)} \\ + \code{\quad std::cout << element;} // Ausgabe von allen Werten \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Anwendung: Set (\code{\#include})} + + Ein Set kann \emph{kein} Element doppelt enthalten und besitzt keine bestimmte Reihenfolge (kein indexbasierter Zugriff). Es ist aber sehr effizient im überprüfen, ob ein Element enthalten ist und im einfügen bzw. löschen eines Elements. + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Bibliothek: & \hspace*{-10pt} \code{\#include} \\ + Ungeordnetes Set: & \hspace*{-10pt} \code{std::unordered\_set setname;} \\ + Geordnetes Set: & \hspace*{-10pt} \code{std::set setname;} \\ + Element hinzufügen: & \hspace*{-10pt} \code{setname.insert(value);} \\ + Intervall Initialisierung [b,e): & \hspace*{-10pt} \code{std::set setname(b,e);} \\ + \bottomrule + \end{tabular} + + wobei \code{b = vec.begin()} und \code{e = vec.end()} + \end{center} + + + \subsubsection{Element in ungeordnetem Feld suchen} + + Der Vergleich \code{set.find(e) == set.end()} gibt \textbf{wahr} zurück, wenn \code{e} im Set enthalten ist. + \vfill\null + \columnbreak + + + \subsection{Eigener Iterator definieren} + + Der Iterator ist eine \emph{innere Klasse}, d.h. sie wird innerhalb einer Klasse definiert (hier innerhalb der Klasse \code{llvec}). Um einen eigenen Iterator zu definieren benötigt man folgende Funktionalitäten: + + \begin{center} + \begin{tabular}{l} \toprule + \code{class iterator} \{ \\ + \code{\quad llnode* node; // Zeiger auf aktuelles Element} \\ + \code{public:} \\ + \code{\quad iterator(llnode* n);} \\ + \code{\quad iterator\& operator++();} \\ + \code{\quad int\& operator*() const;} \\ + \code{\quad bool operator!=(const iterator\& other) const;} \\ + \}\code{;} \\ + \bottomrule + \end{tabular} + \end{center} + + Sowie folgende Memberfunktionen in der Klasse selbst: + + \begin{center} + \begin{tabular}{l} \toprule + \code{class llvec} \{ \\ + \code{public:} \\ + \code{\quad class iterator} \{\dots\}; \\ + \code{\quad iterator begin();} // Gibt erstes Element \\ + \code{\quad iterator end();} // Zeigt hinter das letzte Element \\ + \}\code{;} \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Nützliche Funktionen für Container} + + Für alle Container kann man, solange es ihre charakteristischen Eigenschaften es erlauben, folgende Funktionen benutzen: + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Bibliothek: & \hspace*{-10pt} \code{\#include} \\ + Bereich [b,p) mit 5 füllen: & \hspace*{-10pt} \code{std::fill(b,p,5);} \\ + Den Bereich [b,e) sortieren: & \hspace*{-10pt} \code{std::sort(b,e);} \\ + Iterator auf Minimum im Bereich [b,p): & \hspace*{-10pt} \code{std::min\_element(b,p);} \\ + Iterator auf den ersten Wert (2) in [b,p): & \hspace*{-10pt} \code{std::find(b,p,2);} \\ + \bottomrule + \end{tabular} + \end{center} + \vfill\null + \columnbreak + + + \section{Objekt orientierte Programmierung} + + \subsection{Kapselung} + + Kapselung ist das Verbergen der Implementierungsdetails von Typen (privater Bereich) vor Benutzern. Anstelle vom direkten Zugriff definiert man eine Schnittstelle (öffentlicher Bereich) zum kontrollierten Zugriff auf Werte und Funktionalität. + + Kapselung ermöglicht das Sicherstellen von Invarianten, sowie den Austausch von Implementierungen ohne Anpassungen von Benutzercode. + + + \subsection{Subtyping (nicht prfgs relevant)} + + Typhierarchien mit Super- und Subtypen können Verwandtschaftbeziehungen sowie Abstraktionen und Spezialisierungen modellieren. \medskip + + Ein Subtyp unterstützt mindestens die Funktionalität, die auch der Supertyp unterstützt - in der Regel aber mehr, d.h. Subtypen erweitern die Schnittstellen ihrer Supertypen (Spezialisierung). + + Daher können Subtypen überall dort eingesetzt werden, wo Supertypen verlangt sind und Funktionen, die auf Supertypen operieren können, können auch auf Subtypen operieren. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{struct Exp} \{ ... \} \\ + \code{struct BinExp : public Exp} \{ .. \} \\ + \end{tabular}} + \end{center} + + Subtyprelationen sind transitiv, d.h. ein Subtyp von \code{BinExp} wäre auch ein Subtyp von \code{Exp}. Man sagt: + + - \code{BinExp} ist eine von \code{Exp} \emph{abgeleitete Klasse} (oder Subklasse, Kindklasse). + + - \code{Exp} ist die \emph{Basisklasse} (oder Superklasse, Elternklasse) von \code{BinExp}. + + \subsubsection{Vererbung} + + Abgeleitete Klassen erben die Funktionalität, d.h. die Implementierungen von Memberfunktionen, ihrer Elternklassen. Dies ermöglicht es, gemeinsam genutzten Code wiederverwenden zu können und vermeidet so Codeduplikation. \medskip + + Geerbte Implementierungen können auch überschrieben werden, um zu erreichen, dass eine abgeleitete Klasse sich anders verhält als ihre Elternklasse. + + + \subsection{Polymorphie und dynamische Bindung (nicht prfgs relevant)} + + Ein Zeiger vom \emph{statischen Typ} \code{T}$_1$ kann zur Laufzeit auf Objekte vom \emph{dynamischen Typ} \code{T}$_2$ zeigen, falls \code{T}$_2$ ein Subtyp von \code{T}$_1$ ist. + + Wird eine virtuelle Memberfunktion von einem solchen Zeiger aus aufgerufen, so entscheidet der dynamische Typ darüber, welche Funktion ausgeführt wird (dynamische Bindung). \medskip + + Zusammen mit Subtyping kann man so neue konkrete Typen zu einem bestehenden System hinzuzufügen, ohne dieses abändern zu müssen! + + Bei Memberfunktionen ohne \code{virtual} wird immer die Memberfunktion des statischen Typ (hier \code{Exp}) ausgeführt. + + \begin{center} + \eqbox{\begin{tabular}{l} + \code{struct Exp} \{ \\ + \code{\quad virtual int size() const = 0;} \\ + \} \\ + \end{tabular}} + \end{center} + + Das \code{= 0} erzwingt eine Implementierung durch abgeleitete Klassen. Solange es in einer Klasse eine Memberfunktion mit \code{= 0} gibt, ist es eine \emph{abstrakte Klasse}, welche nicht als Objekt instanziert werden kann. +\end{multicols*} +\setcounter{secnumdepth}{2} + + +\begin{center} + \includegraphics[width=1\linewidth]{Bilder/ASCII-Table-wide.png} +\end{center} +\end{document} + + + + + + + + + + + + + + + diff --git a/zusammenfassung/mathematische_methoden/Bilder/Euler.jpg b/zusammenfassung/mathematische_methoden/Bilder/Euler.jpg new file mode 100644 index 0000000..d83a4df Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/Euler.jpg differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/Homotopie.jpg b/zusammenfassung/mathematische_methoden/Bilder/Homotopie.jpg new file mode 100644 index 0000000..83a76b5 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/Homotopie.jpg differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/Kreisscheibe.jpg b/zusammenfassung/mathematische_methoden/Bilder/Kreisscheibe.jpg new file mode 100644 index 0000000..c9c0b74 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/Kreisscheibe.jpg differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/Laurent_series.png b/zusammenfassung/mathematische_methoden/Bilder/Laurent_series.png new file mode 100644 index 0000000..fad68f8 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/Laurent_series.png differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/MIttelwert.png b/zusammenfassung/mathematische_methoden/Bilder/MIttelwert.png new file mode 100644 index 0000000..62806b4 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/MIttelwert.png differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/Singularitaet.png b/zusammenfassung/mathematische_methoden/Bilder/Singularitaet.png new file mode 100644 index 0000000..36b965e Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/Singularitaet.png differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/Tangens.png b/zusammenfassung/mathematische_methoden/Bilder/Tangens.png new file mode 100644 index 0000000..358c132 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/Tangens.png differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/UneigentlicheIntegrale.png b/zusammenfassung/mathematische_methoden/Bilder/UneigentlicheIntegrale.png new file mode 100644 index 0000000..360a23e Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/UneigentlicheIntegrale.png differ diff --git a/zusammenfassung/mathematische_methoden/Bilder/UneigentlicheIntegrale2.png b/zusammenfassung/mathematische_methoden/Bilder/UneigentlicheIntegrale2.png new file mode 100644 index 0000000..b0bd7e5 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/Bilder/UneigentlicheIntegrale2.png differ diff --git a/zusammenfassung/mathematische_methoden/KomplexeAnalysisZF.pdf b/zusammenfassung/mathematische_methoden/KomplexeAnalysisZF.pdf new file mode 100644 index 0000000..eaadfc5 Binary files /dev/null and b/zusammenfassung/mathematische_methoden/KomplexeAnalysisZF.pdf differ diff --git a/zusammenfassung/mathematische_methoden/KomplexeAnalysisZF.tex b/zusammenfassung/mathematische_methoden/KomplexeAnalysisZF.tex new file mode 100644 index 0000000..59d5fe0 --- /dev/null +++ b/zusammenfassung/mathematische_methoden/KomplexeAnalysisZF.tex @@ -0,0 +1,1899 @@ +\documentclass[a4paper, fontsize = 8pt, landscape]{scrartcl} +\usepackage[german]{babel} +\usepackage[landscape, margin=0.5cm]{geometry} +\usepackage[dvipsnames]{xcolor} +% Hyperref links, pdf metadata +\usepackage{hyperref} +\usepackage{amscd, amsmath, amssymb, blindtext, empheq, enumitem, multicol} +\usepackage{mathrsfs} +\usepackage{mathtools} +\usepackage{graphicx} +\usepackage{tikz} +\usepackage{array} %for bigger tabular spacings +\usepackage{multirow} % for multirow cells in tabular +%% Formal tables +\usepackage{booktabs} +%% Colorbox +\usepackage[most]{tcolorbox} + +% make document compact +\parindent 0pt +\pagestyle{empty} +\setlength{\unitlength}{1cm} +\setlist{leftmargin = *} +% define some colors +\definecolor{title}{RGB}{229,140,140} +\definecolor{subtitle}{RGB}{234,165,165} +\definecolor{subsubtitle}{RGB}{249,210,210} +\definecolor{text}{RGB}{0,0,0} +\definecolor{formulabox}{RGB}{182,225,189} + +% section color box +\setkomafont{section}{\mysection} +\newcommand{\mysection}[1]{\vspace*{-3pt}% Space before Box + \Large\normalfont \sffamily \bfseries% + \setlength{\fboxsep}{0cm}%already boxed + \colorbox{title}{% + \begin{minipage}{\linewidth}% + \vspace*{2pt}%Space before + \leftskip2pt %Space left + \rightskip\leftskip %Space right + {\color{text} #1} + \vspace*{1pt}%Space after + \end{minipage}% + }} +%subsection color box +\setkomafont{subsection}{\mysubsection} +\newcommand{\mysubsection}[1]{\vspace*{-3pt}% Space before Box + \normalsize \normalfont \sffamily \bfseries% + \setlength{\fboxsep}{0cm}%already boxed + \colorbox{subtitle}{% + \begin{minipage}{\linewidth}% + \vspace*{2pt}%Space before + \leftskip2pt %Space left + \rightskip\leftskip %Space right + {\color{text} #1} + \vspace*{1pt}%Space after + \end{minipage}% + }} +%subsubsection color box +\setkomafont{subsubsection}{\mysubsubsection} +\newcommand{\mysubsubsection}[1]{\vspace*{-5pt}% Space before Box + \normalsize \normalfont \sffamily % + \setlength{\fboxsep}{0cm}%already boxed + \colorbox{subsubtitle}{% + \begin{minipage}{\linewidth}% + \vspace*{2pt}%Space before + \leftskip2pt %Space left + \rightskip\leftskip %Space right + {\color{text} #1} + \vspace*{1pt}%Space after + \end{minipage}% + }} + + +% equation box +\newcommand{\eqbox}[1]{\fcolorbox{black}{white}{\hspace{0.2em}#1\hspace{0.2em}}} +\newcommand{\eqboxf}[1]{\fcolorbox{black}{formulabox}{\hspace{0.2em}#1\hspace{0.2em}}} + +%Laplace Operator +\newcommand{\LAPB}[1]{\text{\textbf{L}}\left\{ #1 \right\}} +\newcommand{\LAPZ}[1]{\text{\textbf{L}}^{-1}\left\{ #1 \right\}} + +%macros +\newcommand{\vect}[1]{\mathbf{\underline{#1}}} +\newcommand{\liminfty}[1]{\lim\limits_{#1 \to \infty}} +\renewcommand{\Im}[1]{\text{Im}(#1)} +\renewcommand{\Re}[1]{\text{Re}(#1)} +\renewcommand{\arg}[1]{\text{arg}(#1)} +\newcommand{\Arg}[1]{\text{Arg}(#1)} +\newcommand{\Log}[1]{\text{Log}(#1)} +\newcommand{\Res}[1]{\text{Res}(#1)} +\newcommand{\R}[0]{\mathbb{R}} +\newcommand{\N}[0]{\mathbb{N}} +\newcommand{\Z}[0]{\mathbb{Z}} +\newcommand{\C}[0]{\mathbb{C}} + +\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} +\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} + + +\begin{document} + +\setcounter{secnumdepth}{0} %no enumeration of sections +\begin{multicols*}{3} + \begin{center} + \Large{Komplexe Analysis} \\ + \tiny{von P.Bölsterli, Fehler bitte an \href{mailto:pbolsterli@student.ethz.ch}{pbolsterli@student.ethz.ch}} + \end{center} + + + \section{Komplexe Zahlen} + + + \subsection{Normalform} + + \begin{center} + \eqbox{$\mathbb{C} := \{a + i b: a,b \in \mathbb{R}\}$} wobei \eqboxf{$i = \sqrt{-1}$} + \end{center} + + Sei $z \in \mathbb{C}$ mit $z = a + ib$. Es gelten folgende Rechenregel: + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + Realteil & $\Re{z} = a = \dfrac{z + \overline{z}}{2}$ \\ + Imaginärteil & $\Im{z} = b = \dfrac{z - \overline{z}}{2i}$ \\ \midrule + Komplexe Konjugation & $\overline{z} = a - ib$ \\ + & $\overline{z_1 + z_2} = \overline{z_1} + \overline{z_2}$, \, $\overline{z_1 \cdot z_2} = \overline{z_1} \cdot \overline{z_2}$ \\ \midrule + Addition & $z_1 + z_2 = (a_1 + a_2) + i(b_1 + b_2)$ \\ + Multiplikation & $z_1 \cdot z_2 = (a_1 a_2 - b_1 b_2) + i(a_2 b_1 + a_1 b_2)$ \\ + Division & $\dfrac{z_1}{z_2} = \dfrac{z_1 \cdot \overline{z_2}}{z_2 \cdot \overline{z_2}}$ \\ \midrule + Dreiecksungleichung & $|z_1 + z_2| \leq |z_1| + |z_2|$ \\ \midrule + Absolutbetrag & $| z | = \sqrt{z \overline{z}} = \sqrt{\Re{z}^2 + \Im{z}^2}$ \\ + & $|z_1 \cdot z_2| = |z_1| \cdot |z_2|$ \\ + Phase & $\varphi = \arctan \left( \dfrac{\Im{z}}{\Re{z}} \right)$ \\ \bottomrule + \end{tabular} + \end{center} + + + \subsection{Eulersche Formel und Eulers Identität} + + \begin{center} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \eqboxf{$e^{i\varphi} = \cos\varphi + i \sin\varphi$} + \end{center} + \end{minipage} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \eqbox{$e^{i \pi} = -1$} \qquad \eqbox{$e^{2 \pi i} = 1$} + \end{center} + \end{minipage} + \end{center} + + \subsubsection{Trigonometrische- und Hyperbelfunktionen} + + \begin{center} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \begin{tabular}{r l} + $\sin(z)$ & \hspace*{-10pt}$= \dfrac{e^{iz} - e^{-iz}}{2i}$ \\ + \\ + $\cos(z)$ & \hspace*{-10pt}$= \dfrac{e^{iz} + e^{-iz}}{2}$ \\ + \\ + $\tan(z)$ & \hspace*{-10pt}$= \dfrac{\sin(z)}{\cos(z)}$ \\ + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \begin{tabular}{r l} + $\sinh(z)$ & \hspace*{-10pt}$= \dfrac{e^{z} - e^{-z}}{2}$ \\ + \\ + $\cosh(z)$ & \hspace*{-10pt}$= \dfrac{e^{z} + e^{-z}}{2}$ \\ + \\ + $\tanh(z)$ & \hspace*{-10pt}$= \dfrac{\sinh(z)}{\cosh(z)}$ \\ + \end{tabular} + \end{center} + \end{minipage} + \end{center} + + + \subsection{Trigonometrische Funktionen: Wertetabelle} + + Die Sinus- und Cosninusfunktionen sind beide $2\pi$-periodisch. + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r c c c c c} \toprule + deg/rad & 0$^\circ$/0 & 30$^\circ$/$\frac{\pi}{6}$ & $45^\circ$/$\frac{\pi}{4}$ & 60$^\circ$/$\frac{\pi}{3}$ & 90$^\circ$/$\frac{\pi}{2}$ \\ \midrule + sin & $0$ & $\frac{\sqrt{1}}{2}$ & $\frac{\sqrt{2}}{2}$ & $\frac{\sqrt{3}}{2}$ & $1$ \\ + cos & $1$ & $\frac{\sqrt{3}}{2}$ & $\frac{\sqrt{2}}{2}$ & $\frac{\sqrt{1}}{2}$ & $0$ \\ + tan & $0$ & $\frac{\sqrt{3}}{3}$ & $1$ & $\sqrt{3}$ & - \\ \bottomrule + \end{tabular} + \begin{tabular}{r c c c c} \toprule + deg/rad & 120$^\circ$/$\frac{2\pi}{3}$ & 135$^\circ$/$\frac{3\pi}{4}$ & $150^\circ$/$\frac{5\pi}{6}$ & 180$^\circ$/$\pi$ \\ \midrule + sin & $\frac{\sqrt{3}}{2}$ & $\frac{\sqrt{2}}{2}$ & $\frac{1}{2}$ & $0$ \\ + cos & $- \frac{1}{2}$ & $- \frac{\sqrt{2}}{2}$ & $- \frac{\sqrt{3}}{2}$ & $-1$ \\ + tan & $-\sqrt{3}$ & $\frac{\sqrt{3}}{3}$ & $-\frac{\sqrt{3}}{3}$ & $0$ \\ \bottomrule + \end{tabular} + \end{center} + + + \subsection{Polarform} + + \begin{center} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/Euler.jpg} + \end{center} + \end{minipage} + \begin{minipage}{0.47 \linewidth} + \begin{center} + Die Polarform lautet: \medskip + + \eqbox{ \begin{tabular}{r l} + $z$ & \hspace*{-10pt}$= |z| \cdot e^{i\varphi}$ \\ + & \hspace*{-10pt}$= |z| \cdot (\cos\varphi + i \sin\varphi)$ \\ + \end{tabular} + } + \end{center} + \end{minipage} + \end{center} + + Die Exponentialfunktion ist $2\pi i$-periodisch, deswegen wird definiert: + + \begin{center} + \begin{tabular}{r l} \toprule + Argument & $\arg{z} = \{\varphi + 2 k \pi , k \in \mathbb + {Z}\}$ \\ + Hauptwert des Argument & $\Arg{z} = \varphi \in (-\pi, \pi]$ \\ \bottomrule + \end{tabular} + \end{center} + + \subsubsection{Rechenregeln in der Polarform (Exponentialform)} + + \begin{center} + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{r l} \toprule + Realteil & $\Re{z} = \cos(\varphi)$ \\ + Imaginärteil & $\Im{z} = \sin(\varphi)$ \\ \midrule + Komplex Konjugation & \hspace*{-10pt} $\overline{z} = | z | e^{-i\varphi} = |z| \cdot (\cos\varphi - i\sin\varphi)$ \\ \midrule + Multiplikation & \hspace*{-10pt} $z_1 \cdot z_2 = |z_1| \cdot |z_2| e^{i(\varphi_1+\varphi_2)}$ \\ + Division & \hspace*{-10pt} $\dfrac{z_1}{z_2} = \dfrac{|z_1|}{|z_2|} \cdot e^{i(\varphi_1 - \varphi_2)}$ \\ \midrule + Potenzieren & \hspace*{-10pt} $(|z|e^{i\varphi})^n = |z|^n \cdot e^{i (n \cdot \varphi)}$ \\ + n-te Wurzel & \hspace*{-10pt} $\sqrt[n]{z} = \sqrt[n]{|z|} \cdot e^{i(\frac{\varphi}{n} + \frac{2 \pi k}{n})}, \, k = 0, \dots, n-1$ \\ \midrule + Logarithmus & \hspace*{-10pt} $\log(z) = \log|z| + i (\varphi + 2 \pi k)$ \\ + Hauptwert des Log & \hspace*{-10pt} $\Log{z} = \log|z| + i \varphi$ \\ \midrule + Potenzen mit $z,w \in \mathbb{C}$ & \hspace*{-10pt} $z^w := e^{w \cdot \log(z)}$ \\ + Hauptwert der Potenz & \hspace*{-10pt} $p.v.(z^w) = e^{w \cdot \Log{z}}$ \\ + \bottomrule + \end{tabular} + \end{center} + + Logarithmusgesetze gelten \textbf{nicht} beim komplexwertigen Logarithmus! + + + \subsection{Komplexe Folgen und Reihen} + + Sei eine komplexe Folge ($z_n = x_n + i y_n$). Der Grenzwert existiert, wenn + + \begin{center} + \eqbox{$\lim\limits_{n \to \infty} x_n = x, \lim\limits_{n \to \infty} y_n = y \Rightarrow \lim\limits_{n \to \infty} z_n = x + iy$} + \end{center} + + Absoluten Konvergenz gilt auch für komplexwertige Reihen, \emph{solange man den komplexen Absolutbetrag nimmt}. + + + \subsection{Offene Kreisscheibe} + + Die offene Kreisscheibe mit Zentrum $z_0 \in \C$ und Radius $r \in \R^+$ ist: + + \begin{center} + \begin{minipage}{0.45 \linewidth} + \begin{center} + \includegraphics[width=0.7\linewidth]{Bilder/Kreisscheibe.jpg} + \end{center} + \end{minipage} + \begin{minipage}{0.52 \linewidth} + \begin{center} + \eqboxf{$B(z_0,r) := \{z \in \mathbb{C}: |z - z_0| < r\}$} + \end{center} + + Sei $z_0 = x_0 + i \, y_0$. Dann ist eine äquivalente Kreisgleichung: + + \begin{center} + $(x - x_0)^2 + (y - y_0)^2 = r^2$ + \end{center} + \end{minipage} + \end{center} + \vfill\null + \columnbreak + + + \subsection{Fundamentalsatz der Algebra} + + Jedes Polynom vom Grad $g$ hat genau $g$ Nullstellen. Falls ein Polynom eine komplexe Nullstelle $z_0$ besitzt, dann ist $\overline{z_0}$ auch eine Nullstelle. + + \subsubsection{Mitternachtsformel} + + Die Nullstellen eines Polynom zweiter Ordnung ($az^2 + b z + c = 0$) sind: + + \begin{center} + \eqbox{$z_\pm = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} = \dfrac{-b}{2a} \pm \sqrt{\dfrac{b^2 - 4 ac}{4a^2}}$} + \end{center} + + + \subsubsection{Binomische Formeln} + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} + $z^2 = (a + ib)^2$ & $= a^2 - b^2 + i2ab$ \\ + $z^3 = (a + ib)^3$ & $= a^3 - 3ab^2 + i(3a^2 b - b^3)$ \\ + $z^4 = (a + ib)^4$ & $= a^4 - 6a^2b^2 + b^4 + i(4a^3b - 4ab^3)$ \\ + \end{tabular} + \end{center} + + + \subsection{Grenzwert einer Funktion} + + Sei $f: U \setminus \{z_0\} \to \C$ eine Funktion, wobei $U \subset \C$ und $z_0 \in U$. Der Grenzwert von $f(z_0)$ ist $\lim\limits_{z \to z_0} f(z) = a$, falls + + \begin{center} + \eqbox{$\forall \epsilon > 0 \,\, \exists \delta > 0, \text{ s.d. } \forall z \in U: |z - z_0| < \delta \Rightarrow \, |f(z) - a| < \epsilon$} + \end{center} + + Bemerkung: Sei $a = a_1 + i a_2 \in \C$. Dann gilt + + \begin{center} + $\lim\limits_{z \to z_0} f(z) = a \Leftrightarrow \left(\lim\limits_{z \to z_0} \Re{f(z)} = a_1\right) \land \left(\lim\limits_{z \to z_0} \Im{f(z)} = a_2\right)$ + \end{center} + + + \subsection{Stetigkeit} + + Sei eine offene Menge $U \in \mathbb{C}$ und $f: U \to \mathbb{C}$. $f(z)$ ist stetig im Punkt $z_0 \in U$, genau dann wenn + + \begin{center} + \eqbox{$\lim\limits_{z \to z_0} f(z) = f(z_0)$} + \end{center} + + $f(z)$ ist auf $U$ stetig, falls $f(z)$ an jeder Stelle $z_0 \in U$ stetig ist. + + \begin{center} + \begin{tabular}{r p{0.87\linewidth}} \toprule + i) & \hspace*{-10pt} Summe, Differenz und Produkt stetiger Funktionen sind stetig. \\ + ii) & \hspace*{-10pt} Komposition von stetigen Funktionen ist stetig. \\ + iii) & \hspace*{-10pt} Eine Funktion ist genau dann stetig, wenn sowohl Realteil als auch Imaginärteil stetig sind. \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Zeigen von Stetigkeit} + + Falls $f$ an der Stelle $z_0$ stetig ist, gilt $\forall w \in \C$: $\lim\limits_{t \to 0} f(z_0 + t w) = f(z_0)$ + + Mit dem Kontrapositiv zeigt man oft, dass $f$ an $z_0$ nicht stetig ist: + + \begin{center} + \renewcommand{\arraystretch}{1.125} + \eqbox{\begin{tabular}{r p{0.8\linewidth}} + i) & \hspace*{-10pt} Um zu zeigen, dass $f$ an der Stelle $z_0$ nicht stetig ist, muss man eine Richtung finden, in der $f$ nicht stetig ist. \\ + & \hspace*{-10pt} Oder man muss zwei Richtungen finden, auf denen die Grenzwerte unterschiedlich sind. \\ + ii) & \hspace*{-10pt} Um die Stetigkeit einer Funktion an Stelle $z_0$ zu zeigen, benutzt man oft die Polarkoordinanten $z = r e^{it}$. Falls $\lim\limits_{r \to r_0}$ unabhängig von $t$ existiert, dann ist $f$ stetig in $z_0$. \\ + \end{tabular}} + \end{center} + \vfill\null + \columnbreak + + + + \section{$\C$-Differenzierbarkeit und Holomorph} + + Man kann eine komplexwertige Funktion als zwei reellwertige Funktionen darstellen: + + \begin{center} + \eqbox{$f(z) = f(x + i\, y) = u(x,y) + i \, v(x,y)$} + \end{center} + + \subsection{$\C$-Differenzierbarkeit} + + Sei eine offene Menge $U \subseteq \mathbb{C}$ und $f: U \to \mathbb{C}$ stetig. $f$ ist $\mathbb{C}$-differenzierbar in $z_0 \in U$ falls folgender Grenzwert existiert: + + \begin{center} + \eqbox{$\lim\limits_{z \to z_0} \dfrac{f(z) - f(z_0)}{z - z_0} = f'(z_0)$} + \end{center} + + Bem: $\R$-Differenzierbarkeit in $z_0$ ist notwendig für $\C$-Differenzierbarkeit. + + \subsubsection{Satz} + + $f(z)$ ist $\C$-differenzierbar $\Rightarrow$ $f(z)$ ist stetig. + + + \subsection{Rechenregeln Ableitung} + + \begin{center} + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{r l} \toprule + Linearität: & $(\alpha f + \beta g)' = \alpha f' + \beta g'$ \\ + Produktregel: & $(f \cdot g)' = f' \cdot g + f \cdot g'$ \\ + Quotientenregel: & $\left(\dfrac{f}{g}\right)' = \dfrac{f' \cdot g - f \cdot g'}{g^2}$ \\ + Kettenregel: & $(f(g(z)))' = f'(g(z)) \cdot g'(z)$ \\ + Potenzreihen (*): & $\displaystyle\left(\sum\limits_{n = 0}^\infty c_n(z - z_0)^n\right)' = \sum\limits_{n = 0}^\infty n \, c_n (z-z_0)^{n - 1}$ \\ + \bottomrule + \end{tabular} + \end{center} + + Bem (*): Potenzreihen nur innerhalb Konvergenzradius differenzierbar! + + + \subsection{Partielle Ableitung} + + Partielle Ableitung von $f(z)$ nach $x$ an der Stelle $x_0, y_0$: + + \begin{center} + \eqbox{$\dfrac{\partial f(x_0,y_0)}{\partial x} = \partial_x f = \lim\limits_{h \to 0} \dfrac{f(x_0 + h, y_0) - f(x_0,y_0)}{h}$} + \end{center} + + Partielle Ableitung nach $y$ an der Stelle $x_0, y_0$: + + \begin{center} + \eqbox{$\dfrac{\partial f(x_0,y_0)}{\partial y} = \partial_y f = \lim\limits_{h \to 0} \dfrac{f(x_0, y_0 + h) - f(x_0,y_0)}{h}$} + \end{center} + + + \subsection{Holomorph} + + Sei eine offene Menge $U \subseteq \C$ und $f: U \to \mathbb{C}$. + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r p{0.85\linewidth}} \toprule + i) & \hspace*{-10pt} $f$ heisst holomorph auf $U$, falls sie auf $U$ $\mathbb{C}$-differenzierbar ist. \\ + ii) & \hspace*{-10pt} $f$ heisst holomorph in $z_0$, falls $f$ holomorph in einer offenen Menge $U_1 \ni z_0$ ist. \\ + iii) & \hspace*{-10pt} Eine holomorphe Funktion ist beliebig oft $\mathbb{C}$-differenzierbar und lässt sich als eine Potenzreihe entwickeln. \\ + iv) & \hspace*{-10pt} Eine \emph{ganze Funktion} ist eine Funktion, die auf $\C$ holomorph ist. \\ + \bottomrule + \end{tabular} + \end{center} + + Bem: Falls die Funktion $\overline{z}$ enthält, ist die Funktion \textbf{nie} holomorph. + \vfill\null + \columnbreak + + + \subsection{Cauchy-Riemann Gleichungen (CRG)} + + Sei $f: U \to \mathbb{C}$ holomorph und $f(x + iy) = u(x,y) + i v(x,y)$. So existieren die partiellen Ableitungen an jeder Stelle $z_0 \in U$ und erfüllen die CRG: + + \begin{center} + \eqboxf{$\partial_x u (x_0, y_0) = \partial_y v(x_0, y_0) \quad \partial_y u(x_0, y_0) = - \partial_x v(x_0, y_0)$} + \end{center} + + + \subsubsection{Kriterium für $\C$-Differenzierbarkeit} + + Sei $f: U \to \C$ und sei $z_0 \in U$. Wenn folgende Bedingungen erfüllt sind: + + \begin{center} + \eqboxf{\begin{tabular}{r p{0.84\linewidth}} + 1) & \hspace*{-10pt} $\partial_x u, \partial_y u, \partial_x v, \partial_y v$ existieren in einer offenen Menge um $z_0$. \\ + 2) & \hspace*{-10pt} $\partial_x u, \partial_y u, \partial_x v, \partial_y v$ sind stetig in $z_0$ und erfüllen die CRG in $z_0$. \\ + \end{tabular}} + \end{center} + + Dann existiert $f'(z_0)$, d.h. $f$ ist $\C$-differenzierbar in $z_0$. + + + \subsubsection{Konsequenzen der CRG} + + Sei $f,g: B(z_0,r) \to \C$ holomorph für $z_0 \in \C$ und $r > 0$. + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} \toprule + i) & \hspace*{-10pt} Falls $\Re{f} = u$ konstant ist, dann ist $f$ auch konstant. \\ + ii) & \hspace*{-10pt} Sei $\Re{f} = \Re{g}$. Dann gilt $f = g + ic$ wobei $c \in \R$. \\ + iii) & \hspace*{-10pt} Falls $\overline{f}: B(z_0,r) \to \C$ holomorph ist, ist $f$ konstant. \\ + iv) & \hspace*{-10pt} Falls $|f(z)|$ konstant ist, ist $f(z)$ konstant. \\ + \bottomrule + \end{tabular} + \end{center} + + Sei $f: U \to \C$ holomorph. Dann gelten folgende Gleichungen + + \begin{center} + \eqbox{$\dfrac{\partial^2 u}{\partial x^2} + \dfrac{\partial^2 u}{\partial y^2} = 0 \quad \dfrac{\partial^2 v}{\partial x^2} + \dfrac{\partial^2 v}{\partial y^2} = 0$} + \end{center} + + + \subsection{Harmonische Funktionen} + + Eine Funktion $g: U \to \R$ heisst \emph{harmonisch} auf $U$, wenn $U \subset \R^2$ und + + \begin{center} + \eqbox{$\dfrac{\partial^2 g}{\partial x^2} + \dfrac{\partial^2 g}{\partial y^2} = 0$} + \end{center} + + + \section{Kurvenintegral} + + Sei $f: [a,b] \to \C$. So gilt: \eqbox{$\int\limits_a^b f(t) dt := \int\limits_a^b \Re{f(t)}dt + i \cdot \int\limits_a^b \Im{f(t)}dt$} + + + \subsection{Pfade} + + Ein Pfad ist eine stetige Abbildung $\gamma:[a,b] \to \C$. Eigenschaften: + + \begin{center} + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{r p{0.85\linewidth}} \toprule + i) & \hspace*{-10pt} Ein Pfad ist \emph{einfach}, falls aus $\gamma(t_1) = \gamma(t_2)$ folgt, dass $t_1 = t_2$ oder $\{t_1,t_2\} = \{a,b\}$. (Pfad ohne Selbstschnittpunkte) \\ + ii) & \hspace*{-10pt} Falls $\gamma(a) = \gamma(b)$ heisst der Pfad \emph{geschlossen}. \\ + + iii) & Der Pfad ist differenzierbar auf $(a,b)$, wenn $\gamma'(t)$ für jedes $t \in (a,b)$ existiert. $\gamma'(t_0)$ heisst Tangentialvektor. \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsubsection{Parametrisierung} + + Gerade von $a$ nach $b$: \eqbox{$\gamma(t) = (1-t) \cdot a + t \cdot b, \, t \in [0,1]$} \medskip + + Kreis mit Zentrum $z_0$ und Radius $r$ im positiven Sinne/positive Umlaufrichtung (Gegenuhrzeigersinn): \eqbox{$\gamma(t) = z_0 + r \cdot e^{2\pi i t}, \, t \in [0,1]$} + \vfill\null + \columnbreak + + + \subsection{Kurvenintegral} + + Sei $U \subseteq \C$ offen, $f: U \to \C$ stetig und sei $\gamma: [0,1] \to U$ ein stückweise stetig differenzierbarer Pfad. Das Kurvenintegral von $f$ entlang $\gamma$ ist + + \begin{center} + \eqboxf{$\displaystyle\int_{\gamma} f(z) dz := \int\limits_0^1 f(\gamma(t)) \cdot \dot \gamma(t) dt$} + \end{center} + + + \subsection{Homotopie} + + Sei $U \subseteq \C$ offen und $\gamma, \delta: [a,b] \to U$ zwei Pfade mit $\gamma(a) = \delta(a) = \alpha \in \C$ und $\gamma(b) = \delta(b) = \beta \in \C$. Man sagt $\gamma$ ist \emph{homotop} zu $\delta$, falls + + + \begin{center} + \begin{minipage}{0.59\linewidth} + i) $H: [0,1] \times [a,b] \to U$ stückweise \textbf{stetig} \medskip + + ii) $\forall t \in [a,b]: \begin{cases} + H(0,t) = \gamma(t) \\ + H(1,t) = \delta(t) \\ + \end{cases}$\medskip + + iii) $\forall s \in [a,b]: \begin{cases} + H(s,0) = \alpha \\ + H(s,1) = \beta \\ + \end{cases}$ + \end{minipage} + \begin{minipage}{0.4\linewidth} + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/Homotopie.jpg} + \end{center} + \end{minipage} + \end{center} + + Die Funktion $H$ ist die sogenannte \emph{Homotopie} von $\gamma$ und $\delta$. + + \begin{center} + Parametrisierung durch $s$: $H(s,t) = (1 - s) \cdot \gamma(t) + s \cdot \delta(t)$ + \end{center} + + + \subsection{Wegzusammenhängend} + + Eine Menge $U$ heisst \emph{wegzusammenhängend}, falls es für jedes Paar $z_1, z_2 \in U$ einen Pfad $\gamma(t)$ gibt, der die zwei Punkte verbindet. + + + \subsection{Einfach zusammenhängend} + + Eine Teilmenge $U \subseteq \C$ heisst \emph{einfach zusammenhängend}, falls sie \emph{wegzusammenhängend} ist und für alle $\alpha, \beta \in U$ alle Pfade von $\alpha$ nach $\beta$ \emph{homotop} zu einander sind. + + + \subsection{Hauptsatz der komplexen Integralrechnung} + + Sei $U \subseteq \C$ eine offene \emph{wegzusammenhängende} Menge, $f: U \to \C$ stetig und $\gamma:[0,1] \to U$. Dann sind folgende Aussagen äquivalent: + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r p{0.85\linewidth}} \toprule + & \hspace*{-10pt} Für jede geschlossene Kurve $\gamma(t): [0,1] \to U$ gilt $\int_\gamma f(z) dz = 0$. + \\ + $\Leftrightarrow$ & \hspace*{-10pt} Das Kurvenintegral $\int_\gamma f(z)dz$ ist unabhängig vom Pfad. + \\ + $\Leftrightarrow$ & \hspace*{-10pt} Es gibt eine $\C$-diffbare Funktion $F: U \to \C$ mit $F'(z) = f(z)$ + \\ + $\Leftrightarrow$ & \hspace*{-10pt} $F$ ist eine Stammfunktion von $f$ und + + \begin{center} + \eqbox{$\displaystyle \int_\gamma f(z) dz = F(\gamma(1)) - F(\gamma(0))$} + \end{center} + \\ + \bottomrule + \end{tabular} + \end{center} + + Bem: Eine Stammfunktion ist eindeutig bis auf eine Konstante $c \in \C$. + + + \subsubsection{Integralsatz von Cauchy} + + Sei $U \subseteq \C$ eine \emph{einfache zusammenhängende} offene Teilmenge und $f: U \to \C$ eine \emph{holomorphe} Funktion. Dann gilt: + + \begin{center} + \renewcommand{\arraystretch}{1.125} + \eqboxf{\begin{tabular}{C{0.8\linewidth}} + $f$ besitzt eine Stammfunktion $F$ und die dazu äquivalenten Eigenschaften. \\ + \end{tabular}} + \end{center} + \vfill\null + \columnbreak + + + \subsection{Eigenschaften des Kurvenintegrals} + + Für KI1-KI4: Sei $\gamma: [0,1] \to U$ ein Pfad und $f: U \to \C$ stetig. Zusätzlich für KI5-KI7: Sei $U \subset \C$ eine offene wegzusammenhängende Menge. \medskip + + KI1 (Linearität): Seien $\alpha, \beta \in \C$. Es gilt + + \begin{center} + \eqbox{$\displaystyle \int_\gamma [\alpha f(z) + \beta g(z)] dz = \alpha \int_\gamma f(z) dz + \beta \int_\gamma g(z) dz$} + \end{center} + + KI2 (Umkehrrichtung): Sei $\delta: [0,1] \to U$ mit $\delta(t) := \gamma(1 - t)$. Dann gilt + + \begin{center} + \eqbox{$\displaystyle \int_\delta f(z)dz = - \int_\gamma f(z)dz$} + \end{center} + + und man schreibt $\delta = \gamma^{-1}$ oder $\delta = -\gamma$. \medskip + + KI3 (Verkettung): Sei $\delta: [0,1]$ ein Pfad mit $\gamma(1) = \delta(0)$. Dann ist + + \begin{center} + \eqbox{$\gamma * \delta (t) := \begin{cases} + y(2t) & t \in [0, \frac{1}{2}] \\ + \delta(2t - 1) & t \in (\frac{1}{2}, 1] \\ + \end{cases}$} + \end{center} + + die Verkettung \textbf{und} es gilt $\displaystyle \int_{\gamma * \delta} f(z) dz = \int_\gamma f(z) dz + \int_\delta f(z) dz$. \medskip + + KI4 (Unabhängigkeit der Parametrisierung): Sei $\delta:[0,1] \to U$ eine andere Parametrisierung des Bildes von $\gamma$. Dann gilt: + + \begin{center} + \eqbox{$\displaystyle \int_\delta f(z) dz = \int_\gamma f(z) dz$} + \end{center} + + KI5 (Cauchy Schwarz): Sei $\gamma:[a,b] \to U$ ein Pfad. Es gilt + + \begin{center} + \eqbox{$\displaystyle \left| \int\limits_a^b f(\gamma(t)) \cdot \dot \gamma(t) dt \right| \leq \int\limits_a^b \left| f(\gamma(t)) \cdot \dot \gamma(t) \right| dt$} + \end{center} + + KI6 (Standardabschätzung): Sei $L(\gamma) := \int\limits_a^b |\dot\gamma(t)| dt$ die Länge vom Pfad $\gamma$. Wenn $|f(z)| \leq M$ für jedes $z \in U$ gilt, dann folgt + + \begin{center} + \eqbox{$\displaystyle \left| \int\limits_\gamma f(z) dz \right| \leq M \cdot L$ \quad wobei $M = \max\limits_{t \in [a,b]} |f(\gamma(t))| < \infty$} + \end{center} + + KI7 a) Seien $\gamma, \delta$ zwei \emph{einfach geschlossene} gleich orientierte Kurven und sei $U$ die Menge, die die äussere Kurve umschliesst. Dann + + \begin{center} + \eqbox{$f: U \to \C$ holomorph $\displaystyle\Rightarrow \int_\gamma f(z) dz = \int_\delta f(z) dz$} + \end{center} + + KI7 b) Sei $\delta \subseteq U$ eine geschlossene Kurve, die in ihrem Inneren nur Punkte enthält, wo $f$ holomorph ist, dann gilt + + \begin{center} + \eqbox{$\displaystyle \int_\delta f(z) dz = 0$} + \end{center} + + + \subsection{Cauchy Integralformel} + + Sei $U \subseteq \C$ eine einfach zusammenhängende offene Menge und $z_0 \in U$. Sei $\gamma: [0,1] \to U \setminus \{z_0\}$ ein Pfad, der $z_0$ einmal im positivem Sinne umläuft. Sei $f: U \to \C$ holomorph. Dann gilt: + + \begin{center} + \eqboxf{$\displaystyle\int_\gamma \dfrac{g(z)}{z - z_0} dz = 2\pi i \cdot g(z_0)$} + \end{center} + + Wobei $z_0$ eine Singularität der Menge $U$ ist und $g(z) = f(z) \cdot z - z_0$. + + + \subsubsection{Allgemeine Cauchy Integralformel} + + Sei $U \subseteq \C$ eine einfach zusammenhängende offene Menge und $z_0 \in U$. Sei $f:U \to \C$ holomorph und $\gamma:[0,1] \to U \setminus \{z_0\}$ ein Pfad, der $z_0 \in U$ einmal im positivem Sinne umläuft. Dann gilt + + \begin{center} + \eqboxf{$\displaystyle\int_\gamma \dfrac{g(z)}{(z-z_0)^{n+1}} dz = \dfrac{2 \pi i}{n!} g^{(n)}(z_0)$} + \end{center} + + wobei $g^{(n)}$ die n-te Ableitung ist und $g(z) = f(z) \cdot (z - z_0)^{n+1}$ + + + \subsubsection{Korollar} + + Sei $f$ holomorph, dann sind alle Ableitungen $f^{(n)}$ auch holomorph und $u:=\Re{f}$, $v:= \Im{f}$ besitzen unendlich viele partielle Ableitungen. + + + \subsection{Windungszahl} + + Die Windungszahl $W(\gamma, z_k)$ einer Kurve $\gamma$ um einen Punkt $z_k$ sagt aus, wie oft sich $\gamma$ um $z_k$ im \emph{positivem Sinne} dreht. Es gilt + + \begin{center} + \eqbox{$\displaystyle\int_{\gamma} f(z) dz = \sum\limits_k^n W(\gamma, z_k) \cdot \int_{\gamma_k} f(z) dz$} + \end{center} + + wobei $\gamma_k$ ein Pfad ist, der nur die Singularität $z_k$ umkreist. + + + \subsection{Der Mittelwertsatz} + + Sei $U \subset \C$ eine offene Menge und $f: U \to \C$ holomorph (bzw. \emph{harmonisch}). Seien $z_0 \in U$ und $r > 0$ s.d. $\overline{B(z_0,r)} \subseteq U$. Dann gilt + + \begin{center} + \eqbox{$f(z_0) = \dfrac{1}{2\pi} \displaystyle\int\limits_0^{2\pi} f(\underbrace{z_0 + r e^{2 \pi i t}}_{= \partial B(z_0,r)}) dt$} + \end{center} + + Jeder Punkt von $u(x,y), v(x,y)$ ist ein Mittelwert von der umgebenden Kreisscheibe $B(z_0, r)$. + + \subsubsection{Lemma} + + Sei $f:B(z_0,r) \to \C$ holomorph. Falls für jedes $z \in B(z_0,r)$ gilt + + \begin{center} + $|f(z)| \leq |\underbrace{f(z_o)}_{\text{Mittelwert}}| \quad \Rightarrow f(z) = const. = f(z_0)$ + \end{center} + + In Worten: Falls der Mittelwert der grösste Wert auf der Kreisscheibe ist, dann muss die $f(z)$ konstant sein. + \vfill\null + \columnbreak + + + \subsection{Maximum Modulus Prinzip} + + Sei $U$ eine wegzusammenhängende Menge. Sei $f: U \to \C$ holomorph und \emph{nicht konstant}. Dann gilt + + \begin{center} + \eqbox{$|f(z)|$ besitzt sein Maximum auf $\partial U$ (Rand von $U$)} + \end{center} + + + \subsubsection{Korollar} + + Sei $f$ eine nicht konstante und stetige Funktion auf einer kompakten Menge $K$, die holomorph auf dem Inneren von $K$ ist. + + \begin{center} + \eqboxf{$\Rightarrow \max\limits_{z \in K} |f(z)|$ wird auf $\partial K$ erreicht.} + \end{center} + + + \subsubsection{Maximum bestimmen auf einer Kreisscheibe} + + \begin{enumerate} + \item Bedingungen überprüfen (Holomorph und Wegzusammenhängend). + \item Man trifft folgende Vereinfachung (dann nur eine 1D-Optimisierung!): + \begin{center} + $\max\limits_{z \in B(0,R)} | f(z) | \Rightarrow \max\limits_{\varphi \in [0, 2\pi)} | f(R \, e^{i\varphi}) |$ + \end{center} + \item Bestimmen der Kandidaten für ein Maximum: + \begin{enumerate} + \item Die Ableitung $\frac{d}{dx} | f(R \, e^{i\varphi}) |$ berechnen. + \item Ableitung = 0 setzen: $0 = \frac{d}{dx} | f(R \, e^{i\varphi}) |$ + \end{enumerate} + \item Die Kandidaten einsetzen in $|f(z)|$ um Maximum (theoretisch auch Minimum) zu bestimmen. Durch Einsetzen in $R e^{i \varphi}$ kann man den Punkt $z_0$ bestimmen. + \end{enumerate} + + + \subsection{Satz von Liouville} + + Sei $f: \C \to \C$ beschränkt und eine \emph{ganze} Funktion $\Rightarrow f$ konstant. \medskip + + Bemerkung: Dieser Satz gilt \emph{nicht} für $f: \R^n \to \R$. + \vfill\null + + + \subsection{Tipps } + + Bei nicht geschlossenen Kurvenintegralen von Funktionen mit Singularitäten ist KI4 nützlich in Kombination mit der Cauchy Integralformel. + + \vfill\null + \columnbreak + + + \section{Reihenentwicklungen} + + + \subsection{Potenzreihen} + + Potenzreihen sind Reihen der folgenden Form: + + \begin{center} + \eqbox{$\displaystyle c_0 + c_1 z + c_2 z^2 + \dots = \sum\limits_{n = 0}^\infty c_n z^n$} + \end{center} + + \subsubsection{Konvergenzradius} + + Der Konvergenzradius $R \geq 0$ von Potenzreihen ist + + \begin{center} + \eqboxf{$R:= \dfrac{1}{\limsup\limits_{n \to \infty} \sqrt[n]{|c_n|}}$} $\begin{cases} + |z| < R & \text{konvergiert absolut} \\ + |z| > R & \text{divergiert} \\ + R = \infty & \text{konvergiert } \forall z \in \mathbb{C} \\ + \end{cases}$ + \end{center} + + mit dem Wurzelkriterium und mit dem Quotientenkriterium ist es: + + \begin{center} + $R:= \dfrac{1}{\lim\limits_{n \to \infty}\vert \dfrac{c_{n + 1}}{c_n} \vert} \begin{cases} + |z| < R & \text{konvergiert absolut} \\ + |z| > R & \text{divergiert} \\ + R = \infty & \text{konvergiert } \forall z \in \mathbb{C} \\ + \end{cases}$ + \end{center} + + \emph{Das Quotientenkriterium gilt zu vermeiden}, wenn der Koeffizient $c_n$ auf zwei oder mehr Arten definiert ist. \medskip + + Innerhalb vom Konvergenzradius darf man stetige Funktionen austauschen! + + + \subsubsection{Analytische Funktionen} + + Eine Funktion heisst \textbf{analytisch} (impliziert holomorph), falls sie sich durch eine Potenzreihe darstellen lässt. \medskip + + Eine Potenzreihe mit Konvergenzradius $R > 0$ definiert eine analytische Funktion auf der offenen Kreisscheibe $\Omega := \{ z \in \C; |z| < R\}$: + + \begin{center} + \eqbox{$\displaystyle f: \Omega \to \mathbb{C} \qquad f(z) = \sum\limits_{n = 0}^\infty c_n z^n$} + \end{center} + + + \subsubsection{Wichtige Potenzreihen} + + Folgende Funktionen besitzen für alle $z \in \C$ konvergente Potenzreihen: + + \begin{center} + \renewcommand{\arraystretch}{1.5} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \begin{tabular}{r l} + $\exp(z)$ & \hspace*{-10pt}$ := \displaystyle\sum\limits_{n = 0}^\infty \dfrac{z^n}{n!}$ \\ + $\sin(z)$ & \hspace*{-10pt}$:= \displaystyle\sum\limits_{n = 0}^\infty (-1)^n \dfrac{z^{2n+1}}{(2n+1)!}$ \\ + $\cos(z)$ & \hspace*{-10pt}$:= \displaystyle\sum\limits_{n = 0}^\infty (-1)^n \dfrac{z^{2n}}{(2n)!}$ \\ + \end{tabular} + \end{center} + \end{minipage} + \begin{minipage}{0.47 \linewidth} + \begin{center} + \begin{tabular}{r l} + $\sinh(z)$ & \hspace*{-10pt}$:= \displaystyle\sum\limits_{n = 0}^\infty \dfrac{z^{2n+1}}{(2n+1)!}$ \\ + $\cosh(z)$ & \hspace*{-10pt}$:= \displaystyle\sum\limits_{n = 0}^\infty \dfrac{z^{2n}}{(2n)!}$ \\ + \end{tabular} + \end{center} + \end{minipage} + \end{center} + + + \subsection{Geometrische Reihe} + + Die Geometrische Reihe ist für $|z| < 1$ konvergent und es gilt: + + \begin{center} + \eqboxf{$\displaystyle\sum\limits_{k = 0}^\infty z^k = \dfrac{1}{1-z}$} \qquad\qquad $\displaystyle\sum\limits_{k = 0}^n z^k = \dfrac{1 - z^{n + 1}}{1 - z}$ + \end{center} + \vfill\null + \columnbreak + + + \subsection{Taylorreihe} + + Sei $f:B(z_0,R_0) \to \C$ holomorph und $R_0 > 0$. Dann besitzt $f(z)$ für jedes $z \in B(z_0,R_0)$ eine Taylorreihe: + + \begin{center} + \eqbox{$\displaystyle f(z) = \sum\limits_{n = 0}^\infty \dfrac{1}{n!} f^{(n)}(z_0) (z- z_0)^n$} + \end{center} + + Insbesondere konvergiert die Reihe absolut $\forall z \in B(z_0,R_0)$. + + + \subsubsection{MacLaurin-Reihe} + + Falls $z_0 = 0$, dann heisst es MacLaurin-Reihe und es gilt + + \begin{center} + \eqbox{$\displaystyle f(z) = \sum\limits_{n = 0}^\infty \dfrac{1}{n!} f^{(n)}(0) (z)^n$} + \end{center} + + + \subsection{Laurent-Reihe} + + Sei $f$ holomorph auf dem Kreisring $r < |z - z_0| < R$ und $\gamma$ eine geschlossene Kurve, die im Kreisring enthalten ist und $z_0$ einmal im positivem Sinn umläuft. Dann besitzt $f$ für jedes $z$ im Kreisring eine Laurent-Reihe: + + \begin{center} + \begin{minipage}{0.74 \linewidth} + \begin{center} + \eqboxf{$\displaystyle f(z) = \sum\limits_{n = 0}^\infty a^n (z - z_0)^n + \sum\limits_{n = 1}^\infty b_n \dfrac{1}{(z - z_0)^n}$} \medskip + + $\displaystyle a_n = \dfrac{1}{2 \pi i} \displaystyle\int_\gamma \dfrac{f(z)}{(z-z_0)^{n+1}} dz$ \medskip + + $\displaystyle b_n = \dfrac{1}{2 \pi i} \displaystyle\int_\gamma \dfrac{f(z)}{(z-z_0)^{-n+1}} dz$ + \end{center} + \end{minipage} + \begin{minipage}{0.25 \linewidth} + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/Laurent_series.png} + \end{center} + \end{minipage} + \end{center} + + Man kann die Laurent-Reihe auch kompakter schreiben: + + \begin{center} + \eqbox{$\displaystyle f(z) = \sum\limits_{n = - \infty}^\infty c_n (z - z_0)^n$ mit $\displaystyle c_n = \dfrac{1}{2 \pi i} \int\limits_\gamma \dfrac{f(z)}{(z - z_0)^{n + 1}} d z$} + \end{center} + + + \subsubsection{Entwickeln einer Laurent-Reihe} + + Zuerst die rationale Funktion durch Partialbruchzerlegung zerlegen, dann eine Fallunterscheidung je nach Singularität des Einzelbruchs: \medskip + + i) Singularität ist \textbf{ausserhalb} vom Kreisring: + + \begin{center} + Gesuchte Form: $\displaystyle \dfrac{1}{1 - \frac{z}{a}} = \sum\limits_{k = 0}^\infty \dfrac{z^k}{a^k}, \text{konvergent für } | z | < a$ + \end{center} + + ii) Singularität ist \textbf{umschlossen} vom Kreisring: + + \begin{center} + Gesuchte Form: $\displaystyle \dfrac{1}{1 - \frac{b}{z}} = \sum\limits_{n = 0}^{\infty} \dfrac{b^n}{z^n}, \text{ konvergent für } \left| \frac{b}{z} \right| < 1 \Leftrightarrow |z| > |b|$ + \end{center} + + \subsubsection{Kreisring mit verschobenem Zentrum $w_0$} + + Ist das Gebiet $r < | z - w_0 | < R$, dann Substitution $u = z - w_0$ benutzen! + \vfill\null + \columnbreak + + + \subsection{Singularität} + + Sei $f$ nicht holomorph in $z_0$. Falls $f$ holomorph in mindestens einem Punkt in \emph{irgendeiner} möglichen Kreisscheibe $B(z_0, \epsilon)$ ist, heisst $z_0$ eine \emph{Singularität}. + + \subsubsection{Isolierte Singularität} + + Eine Singularität heisst isoliert, falls es ein $\epsilon > 0$ gibt, so dass $f(z)$ auf $B(z_0, \epsilon) \setminus \{z_0\}$ holomorph ist. + + \subsubsection{Klassifizierungen} + + Sei $U \subseteq \C$ offen und $z_0 \in U$, und sei $f$ holomorph auf $U \setminus \{z_0\}$. So besitzt $f$ eine Laurententwicklung auf $U \setminus \{z_0\}$. + + Sei $c_k = 0$ für alle $k < n$ und $c_n \neq 0$. Dann gilt: + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r p{0.85\linewidth}} \toprule + i) & \hspace*{-10pt} $0 < n \Rightarrow z_0$ ist eine \emph{Nullstelle n-ter Ordnung}. + \\ + ii) & \hspace*{-10pt} $n = 0 \Rightarrow z_0$ ist eine \emph{hebbare Singularität}. \\ + iii) & \hspace*{-10pt} $n < 0 \Rightarrow z_0$ ist ein \emph{Pol n-ter Ordnung}. \\ + iv) & \hspace*{-10pt} Falls für alle $c_k = 0$ ein $c_m \neq 0$ mit $m < k$ existiert, dann ist $z_0$ eine \emph{wesentliche Singularität}. \\ + \bottomrule + \end{tabular} + \end{center} + + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/Singularitaet.png} + \end{center} + + + \subsection{Hebbarkeitsatz von Riemann} + + Sei $z_0$ eine isolierte Singularität von $f: U \setminus \{z_0\} \to \C$. Es ist äquivalent: + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r p{0.8\linewidth}} \toprule + & \hspace*{-10pt} $z_0$ ist eine hebbare Singularität von $f$. \\ + $\Leftrightarrow$ & \hspace*{-10pt} $\lim\limits_{z \to z_0} f(z)$ existiert in $\C$ (holomorph fortsetzbar in $z_0$) \\ + $\Leftrightarrow$ & \hspace*{-10pt} $f$ ist auf einer punktierten Scheibe $B(z_0,\epsilon) \setminus \{z_0\}$ beschränkt. \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Meromorph} + + Eine holomorphe Funktion auf $U \setminus \{z_0, \dots, z_N\}$ heisst \emph{meromorph} auf $U$, falls $z_0, \dots, z_N$ Pole oder hebbare Singularitäten sind. + + + \subsection{Satz von Picard} + + Sei $z_0$ eine wesentliche Singularität von $f(z)$. In jeder noch so kleinen punktierten Scheibe $B(z_0, \epsilon) \setminus \{z_0\}$ nimmt $f(z)$ jeden Wert in $\C$, bis auf höchstens eine Ausnahme, unendlich oft an. + \vfill\null + \columnbreak + + + \section{Der Residuensatz} + + + \subsection{Das Residuum} + + Sei $z_0$ eine isolierte Singularität von $f$. Man nennt den Koeffizient $c_{-1}$ der Laurent-Reihe, das \emph{Residuum} von $f$ an der Stelle $z_0$. + + \begin{center} + \eqbox{$\displaystyle \Res{f, z_0}:= c_{-1} = \dfrac{1}{2 \pi i} \int\limits_\gamma f(\xi) d \xi$} + \end{center} + + + \subsection{Der Residuensatz} + + Sei $U \subset \C$ eine offene wegzusammenhängende Menge, $\gamma \subset U$ eine positiv orientierte geschlossene Kurve die $z_1, \dots, z_n \in U$ mit der jeweiligen Windungszahl $W(\gamma,z_k)$ umschliesst. Sei $f: U \setminus \{z_1, \dots, z_n\} \to \C$ holomorph. Dann gilt: + + \begin{center} + \eqboxf{$\displaystyle\int\limits_\gamma f(z) dz = 2 \pi i \sum\limits_{k = 1}^n W(\gamma,z_k) \cdot \Res{f,z_k}$} + \end{center} + + + \subsection{Polstellen} + + Sei $z_0$ eine isolierte Singularität von $f(z)$. Die Stelle $z_0$ ist ein Pol der Ordnung $m \geq 1$ genau dann, wenn es eine in der Umgebung von $z_0$ holomorphe Funktion $\phi$ gibt, mit + + \begin{center} + \eqbox{$f(z) = \dfrac{\phi(z)}{(z - z_0)^m}$ wobei $\phi(z_0) \neq 0$} \medskip + + Bzw: \eqboxf{$\phi(z_0) = \lim\limits_{z \to z_0} (z - z_0)^m f(z) \neq 0$} + \end{center} + + Ist $\phi(z_0) = 0$, dann muss man über die Laurententwicklung gehen. + + \subsubsection{Korollar} + + Falls $z_0$ ein Pol der Ordnung $m$ der Funktion $f$ ist, gilt + + \begin{center} + \eqbox{$\Res{f, z_0} = \dfrac{\phi^{(m - 1)}(z_0)}{(m - 1)!}$} \medskip + + Bzw: \eqboxf{$\Res{f, z_0} = \dfrac{1}{(m-1)!} \lim\limits_{z \to z_0} \dfrac{d^{(m-1)}}{dz^{m-1}}\left[(z - z_0)^m f(z)\right]$} + \end{center} + + + \subsection{Nullstellen} + + Sei $f: U \to \C$ holomorph an der Stelle $z_0 \in U$. $f$ hat in $z_0$ eine Nullstelle der Ordnung $m$ genau dann, wenn es ein $g: U \to \C$ holomorph gibt, mit + + \begin{center} + \eqbox{$f(z) = (z - z_0)^m g(z)$ wobei $g(z_0) \neq 0$} + \end{center} + + \subsubsection{Korollar} + + Seien $p(z),q(z)$ holomorph an der Stelle $z_0$ mit $p(z_0) \neq 0$ und sei $z_0$ eine Nullstelle der Ordnung $m$ für $q(z)$. + + \begin{center} + \eqbox{$\Rightarrow z_0$ ein Pol der Ordnung $m$ für $\dfrac{p(z)}{q(z)}$} + \end{center} + + Bem: Nützlicher Alternativer Weg zur Ermittlung der Ordnung vom Pol in $z_0 = 0$ von Termen mit bekannten Potenzreihen ($\exp, \sin, \cos$). + \vfill\null + \columnbreak + + + \subsection{Anwendung: Bedingungen unter denen $f(z) \equiv 0$} + + \subsubsection{Lemma} + + Sei $f: B(z_0, \epsilon) \to \C$ holomorph und $f(z_0) = 0$. Dann ist entweder $f(z) \equiv 0 \,\, \forall z \in B(z_0, \epsilon)$ oder $z_0$ ist eine isolierte Nullstelle von $f$. + + \subsubsection{Satz} + + Sei $U$ wegzusammenhängend und $f: U \to \C$ holomorph. Falls $f(z) \equiv 0$ auf einer offenen Menge oder Geradenstrecke ist, dann ist $f \equiv 0$ auf $U$. + + \subsubsection{Identitätsprinzip für holomorphe Funktionen} + + Sei $U \subseteq \C$ offen und seien $f,g: U \to \C$ holomorph. Falls $f(z) = g(z)$ auf einer offenen Menge oder Geradenstrecke in $U$, dann gilt $f(z) \equiv g(z)$. + + + \subsection{Eigentliche Integrale mit Sinus und Cosinus} + + Die Strategie ist es das reelle Integral in ein Kurvenintegral zu wandeln und dieses mit dem Residuensatz zu lösen. + + Sei ein Pfad $\gamma(t) = e^{it}$ mit $t \in [0, 2\pi]$, so dass $\dot \gamma(t) = i e^{i t} dt$ ist, dann erhaltet man mit der Substitution $z = e^{it}$: + + \begin{center} + \eqbox{$\displaystyle\int\limits_0^{2\pi} F(cos(t),sin(t)) dt = \int\limits_\gamma F(\dfrac{z + z^{-1}}{2}, \dfrac{z - z^{-1}}{2i}) \dfrac{dz}{i z}$} + \end{center} + + + \subsection{Anwendung: Uneigentliche Integrale} + + Das Uneigentliche Integral ist, wie folgt definiert: + + \begin{center} + $\displaystyle \int\limits_{-\infty}^\infty f(x) dx = \lim\limits_{R \to \infty} \int\limits_{-R}^0 f(x) dx + \lim\limits_{R \to \infty} \int\limits_{0}^R f(x) dx$ + \end{center} + + Sei $\gamma_R = R e^{i \pi t}$ und $\gamma_{[-R,R]} = 2 R t - R$ mit $t \in [0,1]$. Die Idee ist es alle Pole in der oberen Halbebene über die geschlossene Kurve $\gamma_R * \gamma_{[-R,R]}$ zu integrieren und den Residuensatz zu verwenden: + + \begin{center} + \begin{minipage}{0.70\linewidth} + \begin{center} + $\displaystyle \lim\limits_{R \to \infty} \int_{\gamma_R} f(x) dx + \int\limits_{-R}^R f(x) dx = 2 \pi i \sum\limits_{k = 1}^n \Res{f, z_k}$ + \end{center} + \end{minipage} + \begin{minipage}{0.29\linewidth} + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/UneigentlicheIntegrale.png} + \end{center} + \end{minipage} + \end{center} + + Ist $\lim\limits_{R \to \infty} \int_{\gamma_R} f(x) dx = 0$ so vereinfacht sich das Kurvenintegral zu: + + \begin{center} + \eqboxf{$\displaystyle \lim\limits_{R \to \infty} \int\limits_{-R}^R f(z) dz = P.V. \int\limits_{-\infty}^\infty f(z) dz = 2\pi i \sum\limits_{\Im{z_k} > 0} \Res{f, z_k}$} + \end{center} + + wobei $z_k$ alle Polstellen in der oberen Halbebene sind ($\Im{z_k} > 0$). + + \subsubsection{Bemerkung: Gerade Funktionen} + + Für gerade Funktionen ($f(x) = f(-x)$) gilt ausserdem immer: + + \begin{center} + \eqbox{$\displaystyle P.V. \int\limits_{-\infty}^\infty f(z) dz = 2 \cdot \int\limits_{0}^\infty f(x) dx$} + \end{center} + \vfill\null + \columnbreak + + + \subsubsection{Lemma} + + Sei $f(z):= \dfrac{p(z)}{q(z)} h(z)$ mit den Polynomen $p(z), q(z)$. Wenn folgendes gilt: + + \begin{center} + \renewcommand{\arraystretch}{1.1} + \begin{tabular}{r l} \toprule + 1. & $\deg(p) + 2 \leq \deg(q)$ \\ + 2. & $q(z)$ hat keine Nullstellen auf der Reellen Achse. \\ + 3. & $|h(z)|$ ist auf $\{z \in \C; \Im{z} \geq 0\}$ beschränkt. \\ + \bottomrule + \end{tabular} + \end{center} + + Dann ist die Vorraussetzung $\displaystyle \lim\limits_{R \to \infty} \int_{\gamma_R} f(z) dz = 0$ erfüllt. \medskip + + Wenn $|h(z)|$ auf $\{z \in \C: \Im{z} \leq 0\}$ beschränkt ist, dann gilt: + + \begin{center} + \begin{minipage}{0.69\linewidth} + \begin{center} + \eqbox{$\displaystyle P.V. \int\limits_{-\infty}^\infty f(x) dx = - 2\pi i \sum\limits_{\Im{z_j} < 0} \Res{f, z_j}$} + \end{center} + \end{minipage} + \begin{minipage}{0.3\linewidth} + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/UneigentlicheIntegrale2.png} + \end{center} + \end{minipage} + \end{center} + + Bem: Falls $q(z)$ eine Nullstelle auf der Reellen Achse besitzt, muss man ein Kurvenintegral anschauen, welches nur einen einzigen Pol umschliesst (Kurve der Form eines Kreiskegel zum Beispiel). + + + \subsubsection{Uneigentliche Integrale mit Sinus und Cosinus} + + Die Idee ist folgende Gleichung mit dem oberen Lemma anzuwenden: + + \begin{center} + \eqbox{$\displaystyle \int\limits_{-\infty}^\infty g(x) \cos(\alpha x) dx + i \int\limits_{-\infty}^\infty g(x) \sin(\alpha x) dx = \int\limits_{-\infty}^\infty g(x) e^{i \alpha x} dx$} + \end{center} + + Dabei ist $f(z) := \dfrac{p(z)}{q(z)} h(z)$ mit: $h(z) = e^{i \alpha x}$ und $g(x) = \dfrac{p(z)}{q(z)}$. \medskip + + Mit der Fallunterscheidung für $|h(z)|$ kommt man dann auf folgendes: + + \begin{center} + $\displaystyle \int\limits_{-\infty}^\infty g(x) \cos(\alpha x) dx = \begin{cases} + \text{Re}\left(2\pi i \sum\limits_{\Im{z_j} > 0} \Res{f(z), z_j}\right) & , \alpha > 0 \\ + \text{Re}\left(-2\pi i \sum\limits_{\Im{z_j} < 0} \Res{f(z), z_j}\right) & , \alpha < 0 \\ + \end{cases}$ \medskip + + $\displaystyle \int\limits_{-\infty}^\infty g(x) \sin(\alpha x) dx = \begin{cases} + \text{Im}\left(2\pi i \sum\limits_{\Im{z_j} > 0} \Res{f(z), z_j}\right) & , \alpha > 0 \\ + \text{Im}\left(-2\pi i \sum\limits_{\Im{z_j} < 0} \Res{f(z), z_j}\right) & , \alpha < 0 \\ + \end{cases}$ + \end{center} + + \subsubsection{Ergänzung zum Verfahren} + + Vorgehen um zu zeigen, dass $\displaystyle \lim\limits_{R \to \infty} \int_{\gamma_[-R,R]} f(z) dz = \lim\limits_{R \to \infty} \int\limits_{-R}^R f(x) dx$: + + \begin{enumerate} + \item Kurvenintegral aufstellen für $\gamma_{[-R,R]} = 2 R t - R$ mit $t \in [0,1]$. + \item Substitutionregel anwenden mit $x = 2Rt - R$. + \end{enumerate} + + \vfill\null + \pagebreak + + \section{Fourier Analysis} + + \subsection{Periodische Funktionen} + + Sei $h: \R \to \C$. $h$ ist periodisch, falls es ein $T \in \R$ gibt, sodass + + \begin{center} + \eqbox{$h(t + T) = h(t) \quad \forall t \in \R$} + \end{center} + + $T$ heisst die Periode von $h$. Die kleinste Periode heisst \emph{Fundamentalperiode}. Die \emph{Frequenz} von $h$ ist $f = \frac{1}{T}$. + + \subsubsection{Bemerkung} + + Die Summe und das Produkt periodischer Funktionen ist genau dann periodisch, wenn alle Perioden ein gemeinsames Vielfaches haben. + + + \subsection{Fourierreihe} + + Die Fourierreihe (bzw. trigonometrische Reihe) ist eine Reihe der Form + + \begin{center} + \eqboxf{$\displaystyle f(t) = a_0 + \sum\limits_{n = 1}^\infty \left(a_n \cos(\frac{2 \pi}{T} n t) + b_n \sin(\frac{2 \pi}{T} n t)\right) = \sum\limits_{n = -\infty}^\infty c_n e^{i \frac{2 \pi}{T} n t}$} + \end{center} + + mit $a_b, b_n \in \R$ und $c_n \in \C$. + + + \subsubsection{Koeffizienten der Fourierreihe} + + Sei $t_0$ der Startzeitpunkt der Periode $T$ und $n \in \N$. Dann gilt + + \begin{center} + \eqboxf{$\displaystyle a_n = \dfrac{2}{T} \int\limits_{t_0}^{t_0 + T} f(t) \cos(\dfrac{2 \pi}{T} n t) \, dt$} + \eqboxf{$\displaystyle b_n = \dfrac{2}{T} \int\limits_{t_0}^{t_0 + T} f(t) \sin(\dfrac{2 \pi}{T} n t) \, dt$} \medskip + + \eqboxf{$\displaystyle a_0 = \dfrac{1}{T} \int\limits_{t_0}^{t_0 + T} f(t) \, dt$} \qquad\quad + \eqbox{$\displaystyle c_n = \dfrac{1}{T} \int\limits_{t_0}^{t_0 + T} f(t) \exp(-i \dfrac{2 \pi}{T} n t) \, dt$} + \end{center} + + + \subsubsection{Symmetrieeigenschaften} + + Falls $f(t)$ \textbf{gerade} ist, dann gilt: + + \begin{center} + \eqbox{$\displaystyle a_n = \dfrac{4}{T} \int\limits_{t_0}^{t_0 + T/2} f(t) \cos(\dfrac{2 \pi}{T} n t) \, dt$ \qquad $b_n = 0$} + \end{center} + + Falls $f(t)$ \textbf{ungerade} ist, dann gilt: + + \begin{center} + \eqbox{$a_n = 0$ \qquad $\displaystyle b_n = \dfrac{4}{T} \int\limits_{t_0}^{t_0 + T/2} f(t) \sin(\dfrac{2 \pi}{T} n t) \, dt$} + \end{center} + + \subsubsection{Koeffizientenumrechnung} + + \begin{center} + \begin{minipage}{0.49\linewidth} + \renewcommand{\arraystretch}{1.25} + \begin{center} + \begin{tabular}{r l} + $c_{-n}$ & \hspace*{-12pt} $= \frac{1}{2}(a_n + i b_n)$ \\ + $c_0$ & \hspace*{-12pt} $= a_0$ \\ + $c_{n}$ & \hspace*{-12pt} $= \frac{1}{2}(a_n - i b_n)$ \\ + \end{tabular} + \end{center} + \renewcommand{\arraystretch}{1} + \end{minipage} \vline + \begin{minipage}{0.49\linewidth} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{r l} + $a_0$ & \hspace*{-12pt} $= c_0$ \\ + $a_n$ & \hspace*{-12pt} $= c_n + c_{-n}$ \\ + $b_n$ & \hspace*{-12pt} $= i(c_n - c_{-n})$ \\ + \end{tabular} + \renewcommand{\arraystretch}{1} + \end{minipage} + \end{center} + \vfill\null + \columnbreak + + + \subsubsection{Begriffe} + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{R{0.5\linewidth} l} + Mittelwert von $f$ auf einer Periode: & $a_0$ \\ + 1. Harmonische oder 1. Grundschwingung: & $a_1 \cos(\dfrac{2 \pi}{T} t) + b_1 \sin(\dfrac{2 \pi}{T} t)$ \\ + $n$-te Harmonische oder $n-1$-te Oberschwingung: & $a_n \cos(\dfrac{2 \pi}{T} n t) + b_n \sin(\dfrac{2 \pi}{T} n t)$ \\ + \end{tabular} + \end{center} + + + \subsection{Satz von Dirichlet} + + Sei $f$ eine $2L$-periodische Funktion auf $[-L,L]$. Sei $f$ stückweise stetig und es existiert eine linke und rechte Ableitung an \emph{jedem Punkt} in $[-L,L]$. Dann ist die Fourierreihe von $f$ auf $[-L,L]$ \emph{konvergent} und + + \begin{center} + \eqbox{$\displaystyle \sum\limits_{n = -\infty}^\infty c_n e^{i \frac{n \pi}{L} t} = \begin{cases} + f(t) & f \text{ ist stetig} \\ \frac{1}{2} \left(f(t^-) + f(t^+)\right) & f \text{ ist nicht stetig} \\ + \end{cases}$} + \end{center} + + wobei $f(t^-) := \lim\limits_{t \to t^-_0} f(t)$ und $f(t^+) := \lim\limits_{t \to t^+_0} f(t)$. + + + \subsection{Trigonometrisches Polynom} + + Ein trigonometrisches Polynom $N$-ten Grades ist + + \begin{center} + \eqbox{$\displaystyle f(t) \approx a_0 + \sum\limits_{n = 1}^N \left(a_n \cos(\frac{2 \pi}{T} n t) + b_n \sin(\frac{2 \pi}{T} n t)\right) = \sum\limits_{n = -N}^N c_n e^{i \frac{2 \pi}{T} n t}$} + \end{center} + + \subsubsection{Gibbsches Phänomen} + + In der Nähe einer Sprungstelle treten immer Überschwingungen ('Gibbs tower') auf. Die Höhe der Überschwingungen wird \emph{immer} etwa $18\%$ der Sprunghälfte betragen: + + \begin{center} + \eqbox{$\sup\limits_{t \in [-L,L]} | f(t) - s_N(t) | \approx 0.18 \cdot \frac{1}{2} \left(f(t^-) + f(t^+)\right)$} + \end{center} + + Gibbs tower verschwinden erst bei unendlich vielen Termen (Punktweise Konvergenz), sie nähern sich mit mehr Termen nur der Sprungstelle an. + + + \subsubsection{Beste Approximation} + + Das trigonometrische Polynom vom Grad $N$, welches am besten eine $2\pi$-periodische Funktion $f$ auf dem Intervall $[-\pi,\pi]$ approximiert, ist die partielle Summe $s_N$ der Fourierreihe von $f$. Der kleinste quadratischen Fehler $E^*_N(f)$ ist + + \begin{center} + \eqbox{$\displaystyle E^*_N(f) := \frac{1}{2\pi}\int\limits_{-\pi}^\pi |f(t)|^2 \, dt - \frac{1}{2}\left( a_0^2 + \sum\limits_{n = 1}^N (a_n^2 + b_n^2)\right)$} + \end{center} + + wobei $E^*_N(f)$ monoton abnimmt mit zunehmendem $N$. + + + \subsection{Satz von Parseval} + + Die ''Energie'' vom Signal ist in Zeit- und Frequenzbereich gleich: + + \begin{center} + \eqbox{$\hspace*{-1.5pt}\displaystyle |f(t)|^2 = \frac{1}{T} \int\limits_{t_0}^{t_0 + T} |f(t)|^2 \, dt = \sum\limits_{n = -\infty}^\infty |c_n|^2 = a_0^2 + \frac{1}{2} \sum\limits_{n = 1}^\infty (|a_n|^2 + |b_n|^2)\hspace*{-1.5pt}$} + \end{center} + \vfill\null + \columnbreak + + + \subsection{Sonstiges} + + \subsubsection{Gerade und ungerade Funktionen} + + Eine Funktion $f(t)$ heisst: + + \begin{center} + \renewcommand{\arraystretch}{1.25} + \begin{tabular}{l} \toprule + i) \emph{gerade} falls $f(t) = f(-t)$ (Symmetrisch zur $y$-Achse). \\ + ii) \emph{ungerade} falls $f(t) = -f(-t)$ (Punktsymm. zum Ursprung). \\ + \bottomrule + \end{tabular} + \end{center} + + Es gelten die folgenden Eigenschaften: \medskip + + - Das Produkt zweier geraden oder ungeraden Funktionen ist gerade. + + - Das Produkt einer geraden und ungeraden Funktion ist ungerade. + + - Falls $g(t)$ gerade ist, gilt $\int\limits_{t_0}^{t_0 + T} g(t) dt = 2 \int\limits_{t_0}^{t_0 + T/2} g(t) dt$. + + - Falls $g(t)$ ungerade ist, gilt $\int\limits_{t_0}^{t_0 + T} g(t) dt = 0$. + + + \subsubsection{Orthonormalitätsrelationen} + + Seien $n, m \in \Z$. Dann gilt + + \begin{center} + \begin{tabular}{r l} \toprule + i) & $\dfrac{1}{2T} \int\limits_{-T}^T e^{i \frac{n \pi}{T} t} \, e^{-i \frac{m \pi}{T} t} dt = + \begin{cases} + 1 & n = m \\ 0 & n \neq m \\ + \end{cases}$ \\ + \bottomrule + \end{tabular} + \end{center} + + Seien $n, m \in \N_0$. Dann gilt + + \begin{center} + \begin{tabular}{r l} \toprule + i) & $\displaystyle\int\limits_{-T}^T \cos(\dfrac{n \pi}{T}t) \cos(\dfrac{m \pi}{T} t) dt = + \begin{cases} + 0 & n \neq m \\ T & n = m \neq 0 \\ 2T & n = m = 0 \\ + \end{cases}$ \\ + ii) & $\displaystyle\int\limits_{-T}^T \sin(\dfrac{n \pi}{T}t) \sin(\dfrac{m \pi}{T} t) dt = + \begin{cases} + 0 & n \neq m \\ T & n = m \neq 0 \\ + \end{cases}$ + \\ + iii) & $\displaystyle\int\limits_{-T}^T \cos(\dfrac{n \pi}{T}t) \sin(\dfrac{m \pi}{T} t) dt = 0, \, \forall n,m$ \\ + \bottomrule + \end{tabular} + \end{center} + + + \subsection{Tipps/Ergänzungen aus Serien} + + Die Fourierreihe eines Terms der Form $\sin(t)^a \cos(t)^b$ berechnet man am schnellsten, indem man $\sin(t) = \dfrac{e^{it} - e^{-it}}{2i}$ und $\cos(t) = \dfrac{e^{it} + e^{-it}}{2}$ benutzt. \medskip + + Sei $f(x) = \sum\limits_{k = -\infty}^\infty c_k e^{i k x}$ eine Fourierreihe mit $c_k = c_{-k}$ und $c_k = \overline{c_k}$. Dann liegt eine Kosinus-Reihe mit reellen Koeffizienten vor. \medskip + + Sei $f(x) = \sum\limits_{k = -\infty}^\infty c_k e^{i k x}$ eine Fourierreihe mit $-c_k = c_{-k}$ und $i c_k \in \R$. Dann liegt eine Sinus-Reihe mit reellen Koeffizienten vor. + + \vfill\null + \columnbreak + + + \section{Fourier-Transformation} + + \subsection{Integraltransformation} + + Eine Integraltransformation ist eine Transformation der Art + + \begin{center} + \eqbox{$\displaystyle T f(y) := \int_X K(x,y) f(x) dx$} + \end{center} + + wobei $f$ eine Funktion auf der Menge $X$ ist und $K$ auf $X \times Y$. Die Funktion $K(x,y)$ heisst der \emph{Kern} der Integraltransformation. \medskip + + Bei der Fourier-Transformation ist $X = \R = Y$ und $K(x,y) = e^{-i x y}$. + + + \subsection{Absolut integrierbar} + + Die Funktion $f: \R \to \C$ heisst \emph{absolut integrierbar}, falls + + \begin{center} + \eqbox{$\displaystyle \int\limits_{-\infty}^\infty |f(t)| dt < \infty$}$ \qquad \left(\Rightarrow \lim\limits_{t \to \pm \infty} f(t) = 0 \right)$ + \end{center} + + + \subsection{Fourier-Transformation} + + Sei $f: \R \to \C$ absolut integrierbar. Die \emph{Fourier Transformation} $\hat{f}$ ist + + \begin{center} + \eqboxf{$\displaystyle \hat{f}(\omega) = \mathcal{F}\{f(t)\} (\omega) = \dfrac{1}{\sqrt{2 \pi}} \int\limits_{-\infty}^\infty f(t) \, e^{-i \omega t} \, dt$} + \end{center} + + \subsubsection{Inverse Fourier-Transformation} + + Sei $\hat{f}$ auch absolut integrierbar. Die \emph{inverse Fourier Transformation} ist + + \begin{center} + \eqbox{$f(t) = \displaystyle \mathcal{F}^{-1}\{\hat{f}(\omega)\}(t) := \dfrac{1}{\sqrt{2 \pi}} \int\limits_{-\infty}^\infty \hat{f}(\omega) \, e^{i \omega t} \, d\omega$} + \end{center} + + Bemerkung: Der Faktor $\frac{1}{\sqrt{2 \pi}}$ kann man bei $\mathcal{F}\{f(t)\}$ weglassen und anstelle diesem bei $\mathcal{F}^{-1}\{\hat{f}(\omega)\}$ den Faktor $\frac{1}{2 \pi}$ nehmen (vice-versa auch). + + + \subsection{Satz von Dirichlet für die Fourier Transformation} + + Sei $f: \R \to \C$ eine \emph{stückweise} stetige absolut integrierbare Funktion, die eine linke und rechte Ableitung an \emph{jedem Punkt} hat. Dann gilt abhängig von der Stetigkeit vom Punkt $t_0 \in \R$: + + \begin{center} + $f(t) = \begin{cases} + \frac{1}{\sqrt{2 \pi}} \int\limits_{-\infty}^\infty \left( \frac{1}{\sqrt{2 \pi}} \int\limits_{-\infty}^\infty f(\nu) e^{-i\omega \nu} \, d\nu\right) e^{-i \omega t} \, dt & f(t_0) \text{ stetig} \\ + \dfrac{1}{2} \left( \lim\limits_{t \to t^-_0} f(t) + \lim\limits_{t \to t^+_0} f(t) \right) & f(t_0) \text{ nicht stetig} \\ + \end{cases}$ + \end{center} + \vfill\null + \columnbreak + + + \subsection{Satz von Plancherel} + + Sei $f: \R \to \C$ eine absolut integrierbare Funktion deren Fourier-Transformation auch absolut integrierbar ist. Dann gilt + + \begin{center} + \eqboxf{$\displaystyle \int\limits_{-\infty}^\infty |f(t)|^2 dt = \int\limits_{-\infty}^\infty |\mathcal{F}\{f\}(\omega)|^2 d\omega$} + \end{center} + + Die Physikalische Interpretation ist, dass die Fouriertransformation die Gesamtenergie eines Zeitsignals erhält. + + + \subsection{Eigenschaften der Fourier Transformation} + + Seien $f,g: \R \to \C$ (und $\hat{f}, f^{(n)}$) absolut integrierbar. Dann gilt \medskip + + FT1 (Linearität): Für jedes $\alpha, \beta \in \C$ gilt + + \begin{center} + \eqbox{$\mathcal{F}\{\alpha f + \beta g\}(\omega) = \alpha \mathcal{F}\{f\}(\omega) + \beta \mathcal{F} \{g\}(\omega)$} + \end{center} + + FT2 (Verschiebung in der t-Variable): Sei $\alpha \in \R$. Dann gilt + + \begin{center} + \eqbox{$\mathcal{F}\{f(t - a)\}(\omega) = e^{-i \omega a} \cdot \mathcal{F}\{f(t)\}(\omega)$} + \end{center} + + FT3 (Verschiebung in der $\omega$-Variabel): Sei $a \in \R$. Dann gilt + + \begin{center} + \eqbox{$\mathcal{F}\{e^{i a t} f(t)\}(\omega) = \mathcal{F}\{f(t)\}(\omega - a)$} + \end{center} + + FT4 (Streckung) Sei $a \in \R$. Dann gilt + + \begin{center} + \eqbox{$\mathcal{F}\{f(at)\} (\omega) = \dfrac{1}{|a|} \cdot \mathcal{F}\{f(t)\} \left(\dfrac{\omega}{a}\right)$} + \end{center} + + FT5 (Fouriertransformierte einer Fouriertransform) Es gilt: + + \begin{center} + \eqbox{$\mathcal{F}\{\mathcal{F} \{ f(t) \} \} = f(-t)$} + \end{center} + + FT6 (Fourier-Transformation der Ableitung $f^{(n)}$) Für $n \in N$ gilt + + \begin{center} + \eqbox{$\mathcal{F}\{ f^{(n)} (t)\}(\omega) = (i \omega)^n \cdot \mathcal{F}\{f(t)\}(\omega)$} + \end{center} + + FT7 (Ableitung der Fourier-Transformation) Für $n \in N$ gilt + + \begin{center} + \eqbox{$\mathcal{F}\{t^n f(t)\}(\omega) = i^n \dfrac{d^n}{d\omega^n} \mathcal{F}\{f(t)\} (\omega)$} + \end{center} + \vfill\null + \columnbreak + + + \subsection{Faltung} + + Seien $f,g: \R \to \C$ zwei absolut integrierbare Funktionen. Das Faltungsprodukt $f * g$ von $f$ und $g$ ist + + \begin{center} + \eqbox{$\displaystyle (f * g)(x) := \int\limits_{-\infty}^\infty f(x - t) g(t) dt = \int\limits_{-\infty}^\infty f(t)g(x-t) dt$} + \end{center} + + Die Faltung ist ein gewichteter Mittelwert von $f$ mit Gewicht gegeben durch $g$. + + \subsubsection{Bemerkungen} + + i) Falls für jedes $t<0$ $f(t) = 0$ und $g(t) = 0$ gilt, dann folgt + + \begin{center} + \eqbox{$(f * g)(x) = \int\limits_{-\infty}^\infty f(x-t) g(t) dt = \int\limits_{0}^\infty f(x-t) g(t) dt = \int\limits_{0}^x f(x-t) g(t) dt$} + \end{center} + + wobei die Beschränkungen vom Integral durch die Bedingungen oben gegeben sind. Der erste Schritt folgt durch $g(t) = 0$ und der zweite aus $f(x-t) = 0 \Rightarrow x - t < 0 \Rightarrow x < t$. \medskip + + ii) $f*g$ ist mindestens so glatt, wie die glatteste der beiden Funktionen. Je öfters eine Funktion differenzierbar ist, desto glätter ist sie. + + \subsubsection{Eigenschaften der Faltung} + + Seien $f,g: \R \to \C$ absolut integrierbare Funktionen und $\alpha, \beta \in \C$. Dann + + F1 (Kommutativität) Es gilt + + \begin{center} + \eqbox{$f * g = g * f$} + \end{center} + + F2 (Assoziativität) Es gilt + + \begin{center} + \eqbox{$(f * g) * h = f * (g * h)$} + \end{center} + + F3 (Distributivität) Es gilt + + \begin{center} + \eqbox{$(\alpha f + \beta g) * h = \alpha f * h + \beta g * h$} + \end{center} + + F4 Falls $(T_a f)(x) := f(x - a)$, dann gilt + + \begin{center} + \eqbox{$(T_a f) * g = T_a(f * g)$} + \end{center} + + F5 (Faltungssatz) Die Fouriertransformation der Faltung ist: + + \begin{center} + \eqbox{$\mathcal{F}\{f * g\} = \sqrt{2 \pi} \mathcal{F}\{f\} \mathcal{F}\{g\}$} \medskip + + $\mathcal{F}^{-1}\{f * g\} = \dfrac{1}{\sqrt{2 \pi}} \mathcal{F}^{-1}\{f\} \mathcal{F}^{-1}\{g\}$ + \end{center} + + F6 Seien $\mathcal{F}\{f\}$, $\mathcal{F}\{g\}$ und $f \cdot g$ auch absolut integrierbar, dann gilt + + \begin{center} + \eqbox{$\mathcal{F}\{f \cdot g\} = \sqrt{2 \pi} \cdot \mathcal{F}\{f\} * \mathcal{F}\{g\}$} \medskip + + $\mathcal{F}^{-1}\{f \cdot g\} = \dfrac{1}{\sqrt{2 \pi}} \cdot \mathcal{F}^{-1}\{f\} * \mathcal{F}^{-1}\{g\}$ + \end{center} + + \vfill\null + + + \pagebreak + + + \section{Laplace-Transformation} + + Der Unterschied zwischen der Laplace-Transformation und der Fourier-Transformation ist, dass man für die Laplace-Transformation auch wachsende Funktionen betrachten kann. \medskip + + Sei $s \in \C$. Die Laplace-Transformation der Funktion $f: \R \to \C$ ist + + \begin{center} + \eqboxf{$\displaystyle\mathcal{L}\{f(t)\}(s) := \int\limits_0^\infty e^{-st} f(t) dt$} + \end{center} + + Sei $\mathcal{E}$ der Raum der Funktionen $f: \R \to \C$ mit folgenden Eigenschaften: + + \begin{center} + \begin{tabular}{r p{0.85\linewidth}} \toprule + 1) & $f(t) = 0$ für jedes $t < 0$ \\ + 2) & Es gibt ein $\sigma \in \R$ und ein $M > 0$ für alle $t > 0$ mit + + \begin{center} + $|f(t)| \leq M e^{\sigma t}$ + \end{center} \\ + 3) & $f$ ist stückweise stetig und die Grenzwerte + + \begin{center} + $\lim\limits_{t \to t_0^-} f(t)$ und $\lim\limits_{t \to t_0^+} f(t)$ + \end{center} + + existieren an jeder Sprungstelle $t_0 \in \R_{> 0}$, \textbf{auch bei} $t_0 = 0$. \\ + \bottomrule + \end{tabular} + \end{center} + + Dann ist die Laplace-Transformation für jedes $f \in \mathcal{E}$ auf der Halbebene $\{s \in \C: \Re{s} > \sigma\}$ wohldefiniert und eine komplexe Analytische Funktion der Variable $s$. Ausserdem gilt + + \begin{center} + $\lim\limits_{\Re{s} \to \infty} \mathcal{L} \{f(t)\}(s) = 0$ + \end{center} + + \subsubsection{Grundbegriffe} + + Man nennt $\mathcal{E}$ \emph{Originalraum} und eine Funktion $f \in \mathcal{E}$ \emph{Originalfunktion} und der Definitionsbereich von $f$ heisst \emph{Zeitbereich}. Die Laplace-Transformation $\mathcal{L}\{f\}$ ist eine \emph{Bildfunktion} und der Definitionsbereich von $\mathcal{L}\{f\}$ heisst \emph{Bildbereich}. + + \subsubsection{Wachstumskoeffizient} + + Das kleinste $\sigma_f$, so dass $|f(t)| < Ce^{\sigma t}$ für jedes $\sigma_f < \sigma$ heisst Wachstumskoeffizient. + + \subsection{Heaviside Funktion} + + Falls $f \not\equiv 0$ für $t < 0$, kann man immer die Funktion zwingen die Bedingung zu erfüllen indem man die Funktion $f$ mit der Heaviside Funktion $H(t)$ multipliziert. + + \begin{center} + \eqbox{$H(t) := \begin{cases} + 0 & t < 0 \\ + 1 & t > 0 \\ + \end{cases}$} + \end{center} + \vfill\null + \columnbreak + + \subsection{Eigenschaften der Laplace-Transformation} + + Seien $f,g \in \mathcal{E}$, $\alpha, \beta \in \C$. Dann gilt \medskip + + LT1 (Linearität): + + \begin{center} + \eqbox{$\mathcal{L}\{\alpha f(t) + \beta g(t)\}(s) = \alpha \mathcal{L}\{f(t)\}(s) + \beta \mathcal{L} \{g(t)\}(s)$} + \end{center} + + LT2 (Verschiebung in der t-Variable): Sei $a \in \R$. Dann gilt + + \begin{center} + \eqboxf{$\mathcal{L}\{f(t-a)\}(s) = e^{-a s} \mathcal{L}\{f(t)\}(s)$} + \end{center} + + Bem: Bei der Rücktransformation mit $H(t - a)$ multiplizieren! + + LT3 (Verschiebung in der $s$-Variabel): + + \begin{center} + \eqbox{$\mathcal{L}\{e^{\alpha t} f(t)\}(s) = \mathcal{L}\{f(t)\}(s - \alpha)$} + \end{center} + + LT4 (Ähnlichkeit) Sei $a \in \R^+$. Dann gilt + + \begin{center} + \eqbox{$\mathcal{L}\{f(a t)\} (s) = \dfrac{1}{a} \mathcal{L}\{f(t)\} \left(\dfrac{s}{a}\right)$} + \end{center} + + LT5 (Laplace-Transformation der Ableitung) Sei $f' \in \mathcal{E}$ und $f(t)$ stetig für $t > 0$. Dann gilt + + \begin{center} + \eqbox{$\mathcal{L}\{ f' (t)\}(s) = s \mathcal{L}\{ f (t)\}(s) - \lim\limits_{t \to 0^+} f(t)$} + \end{center} + + Falls $f'', \dots, f^{(n)} \in \mathcal{E}$ und $f, \dots, f^{(n-1)}$ stetig für $t > 0$ sind, dann gilt + + \begin{center} + \eqboxf{$\displaystyle \mathcal{L}\{ f^{(n)} (t)\}(s) = s^n \mathcal{L}\{ f(t)\}(s) - \sum\limits_{k = 1}^n s^{n-k} \lim\limits_{t \to 0^+} f^{(k-1)}(t)$} + \end{center} + + LT6 (Ableitung der Laplace-Transformation) Für $n \in N$ gilt + + \begin{center} + \eqbox{$\dfrac{d^n}{d s^n} \mathcal{L}\{f(t)\}(s) = (-1)^n \mathcal{L}\{t^n f(t)\} (s)$} + \end{center} + + LT7 (Laplace-Transformation eines Integrals) + + \begin{center} + \eqbox{$\displaystyle \mathcal{L} \left\{ \int\limits_0^t f(\tau ) d \tau \right\} (s) = \dfrac{1}{s} \mathcal{L}\{f(t)\}(s)$} + \end{center} + + LT8 Sei $\sigma_f$ der Wachstumskoeffizient von $f$. Für $x > \sigma_f$ ($x \in \R$) gilt + + \begin{center} + \eqbox{$\displaystyle \mathcal{L}\left\{ \dfrac{f(t)}{t} \right\} ( x + i y) = \int\limits_{x + iy}^{\infty + i y} \mathcal{L} \{f(t)\} (\tau) d\tau$} + \end{center} + + LT9 Sei $f$ eine $T$-periodische Funktion ($f(t + T) = T$) für jedes $t \geq 0$. Dann gilt für jedes $s \in \C$ mit $\Re{s} > 0$. + + \begin{center} + \eqbox{$\displaystyle \mathcal{L}\{f(t)\} (s) = \dfrac{1}{1 - e^{- s T}} \int\limits_0^T e^{-st} f(t) dt$} + \end{center} + + LT10 (Faltungssatz) + + \begin{center} + \eqbox{$\mathcal{L} \{f * g\}(s) = \mathcal{L}\{\int_0^tf(\tau)g(t-\tau)d\tau\}(s) = \mathcal{L} \{f(t)\}(s) \cdot \mathcal{L} \{g(t)\}(s)$} + \end{center} + + LT11 (Dirac-Delta Funktion) Sei $a \in \R$. Dann gilt + + \begin{center} + \eqbox{$\mathcal{L}\{\delta(t - a)\} (s) = e^{-as}$} + \end{center} + + + \subsection{Satz von Lerch (Eindeutigkeit der Laplace-Transformation)} + + Seien $f_1, f_2 \in \mathcal{E}$ mit Wachstumskoeffizienten $\sigma_1, \sigma_2$. Gilt + + \begin{center} + $\mathcal{L} \{f_1(t)\}(s) = \mathcal{L} \{f_2(t)\} (s)$ + \end{center} + + für jedes $s$ mit $\Re{s} > \max\{\sigma_1, \sigma_2\}$. Dann ist + + \begin{center} + $f_1(t) = f_2(t)$ + \end{center} + + an allen Stellen $t$ an denen $f_1$ und $f_2$ stetig sind. + + + \subsection{Inverse Laplace-Transformation} + + Sei $f \in \mathcal{E}$ mit Wachstumskoeffizient $\sigma_f$. Sei $\beta_c(y) := c + i y$ für $y \in (-\infty, \infty)$ ein Pfad, wobei $c > \sigma_f$ beliebig ist. Dann gilt an allen Stetigstellen $t \in (0, \infty)$ von $f$ + + \begin{center} + \eqbox{$\displaystyle f(t) = \dfrac{1}{2 \pi i} \int_{\beta_c} e^{st} \mathcal{L}\{f(t)\}(s) \, ds$} + \end{center} + + An den Unstetigstellen $t_0 \in (0, \infty)$ gilt + + \begin{center} + \eqbox{$\displaystyle \frac{1}{2} \left(\lim\limits_{t \to t_0^-} \mathcal{L}\{f(t)\}(s) + \lim\limits_{t \to t_0^+} \mathcal{L}\{f(t)\}(s)\right) = \dfrac{1}{2 \pi i} \int_{\beta_c} e^{st} \mathcal{L}\{f(t)\}(s) \, ds$} + \end{center} + + Die Inverse Laplace-Transformation kann entweder durch dieses Kurvenintegral berechnet werden oder über die Eigenschaften der Laplace-Transformation bzw. die Transformationstabelle. + + + \subsection{Laplace-Transformationstabelle} + + Bei der Rücktransformation \emph{immer} mit $H(t)$ multiplizieren!!! + + \begin{center} + \renewcommand{\arraystretch}{2.5} + \begin{tabular}{c c} \toprule + Originalraum $f(t)$ & Bildbereich $\mathcal{L}\{f(t)\}(s)$ \\ + \midrule + $1$ & $\dfrac{1}{s}, s>0$ \\ + \hline + $t^n$ & $\dfrac{n!}{s^{n+1}}, s>0$ \\ + \hline + $\sin(at)$ & $\dfrac{a}{s^2+a^2}, s>0$ \\ + \hline + $\cos(at)$ & $\dfrac{s}{s^2+a^2}, s>0$ \\ + \hline + $e^{at}$ & $\dfrac{1}{s-a}, s>a$ \\ + \hline + $e^{at}\cdot \sin(bt)$ & $\dfrac{b}{(s-a)^2+b^2}, s>a$ \\ + \hline + $e^{at}\cdot \cos(bt)$ & $\dfrac{s-a}{(s-a)^2+b^2}, s>a$ \\ + \hline + $t^ne^{at}$ & $\dfrac{n!}{(s-a)^{n+1}}, s>a$ \\ + \hline + $f'(t)$ & $s \mathcal{L}\{f(t)\}(s)-f(0)$ \\ + \hline + $f''(t)$ & $s^2 \mathcal{L}\{f(t)\}(s)-sf(0)-f'(0)$ \\ + \bottomrule + \end{tabular} + \end{center} + \vfill\null + \columnbreak + + + \subsection{Differentialgleichungen (DGL) lösen mit Laplace} + + \begin{enumerate} + \item Die DGL in den Bildbereich transformieren (LT5). + \item Anfangswerte in transformierte DGL einsetzen. + \item DGL nach $\mathcal{L}\{y(t)\}(s) = Y(s)$ auflösen. + \item Partialbruchzerlegung + \item [4.5] Je nachdem wie die Transfomierte aussieht nach der Partialbruchzerlegung, muss man die Zerlegung zurücktransformieren, damit man Eigenschaften anwenden kann, um zur Lösung zu kommen. (z.B. LT2) + \item Rücktransformation mit Tabellen und mit $H(t)$ multiplizieren. + \end{enumerate} + + + \subsection{Dirac-Delta Funktion (Dirac-Impuls)} + + Die Dirac-Delta Funktion ($\delta (t)$) ist, wie folgt definiert: + + \begin{center} + $\delta_\epsilon (t) := \dfrac{1}{2\epsilon}\chi_{(-\epsilon,\epsilon)}(t)$ \qquad \eqbox{$\delta(t) := \lim\limits_{\epsilon \to 0} \delta_\epsilon (t)$} + \end{center} + + \subsubsection{Eigenschaften} + + Die Eigenschaften D1 und D2 charakterisieren die Delta Dirac \emph{eindeutig}! \medskip + + D1 Obwohl $\delta(t)$ im Ursprung ''unendlich'' ist, gilt trotzdem + + \begin{center} + \eqbox{$\int\limits_{-\infty}^\infty \delta(t) = 1$} + \end{center} + + D2 Für jede stetige Funktion $f$ gilt + + \begin{center} + \eqbox{$\int\limits_{-\infty}^\infty \delta(t - t_0) f(t) dt = f(t_0)$} + \end{center} + + D3 Sei $H(t)$ die Heaviside Funktion, dann gilt + + \begin{center} + \eqbox{$H(t) = \int\limits_{-\infty}^t \delta(s) ds$} + \end{center} + \vfill\null + \columnbreak + + + \section{Sonstiges} + + \begin{center} + \includegraphics[width=1\linewidth]{Bilder/Tangens.png} + \end{center} + + +\end{multicols*} +\setcounter{secnumdepth}{2} +\end{document} + + + + + + + + + + + + + + +