Compare commits

..

15 Commits

23 changed files with 637 additions and 5 deletions

View File

Binary file not shown.

View File

@@ -132,6 +132,8 @@ Moral of the story: Use descriptive variable names and do NOT use $t$, $tt$, $tt
\input{parts/01_interpolation/02_piece-wise/01_hermite-interpolation.tex}
\input{parts/01_interpolation/02_piece-wise/02_splines.tex}
% ── quadrature ──────────────────────────────────────────────────────
\newsection
\section{Numerische Quadratur}
\input{parts/02_quadrature/00_introduction.tex}
@@ -144,11 +146,21 @@ Moral of the story: Use descriptive variable names and do NOT use $t$, $tt$, $tt
\input{parts/02_quadrature/06_reduction-of-variance.tex}
% ── Nullstellen ─────────────────────────────────────────────────────
% ── zeros ───────────────────────────────────────────────────────────
\newsection
\section{Nullstellensuche}
\input{parts/03_zeros/00_intro.tex}
\input{parts/03_zeros/01_termination-criteria.tex}
\input{parts/03_zeros/02_fix-point-iteration.tex}
\input{parts/03_zeros/03_bisection-method.tex}
\input{parts/03_zeros/04_newton-one-d.tex}
\input{parts/03_zeros/05_sectant-method.tex}
\input{parts/03_zeros/06_newton-nd.tex}
\input{parts/03_zeros/07_damped-newton.tex}
\input{parts/03_zeros/08_quasi-newton.tex}
\newsection
\section{Intermezzo: Lineare Algebra}
\input{parts/04_linalg/00_intro.tex}
\end{document}

View File

@@ -7,14 +7,14 @@
Die Definition ist dabei rekursiv: $x^{(k)} := \phi_F(x^{(k - 1)})$, sofern $x^{(0)}$ und $\phi$ gegeben sind.
\setLabelNumber{all}{5}
\fancydef{Konvergenz} $\phi_F$ zur Lösung $F(x^*) = 0$ konvergiert, wenn $x^{(k)} \rightarrow x^*$, mit $x^*$ der gesuchte Wert.
\fancydef{Konvergenz} $\phi_F$ zur Lösung $F(x^*) = 0$ konvergiert, wenn $x^{(k)} \rightarrow x^*$, mit $x^*$ die Nullstelle.
\setLabelNumber{all}{8}
\fancydef{Norm}
\innumpy haben wir \texttt{numpy.linalg.norm}, welches zwei Argumente nimmt. Dabei ist das erste Argument der Vektor und das Zweite die Art der Norm.
Ohne zweites Argument wird die Euklidische Norm $||x||_2$, mit Argument $1$ wird die $1$-Norm $||x||_1 := |x_1| + \ldots + |x_n|$
und mit mit \texttt{inf} als Argument wird die $\infty$-Norm, bzw die Max-Norm $||x||_\infty := \max\{ |x_1|, \ldots, |x_n| \}$ berechnet.
und mit mit \texttt{inf} als Argument wird die $\infty$-Norm, bzw. die Max-Norm $||x||_\infty := \max\{ |x_1|, \ldots, |x_n| \}$ berechnet.
\stepLabelNumber{all}
\inlinedef Zwei Normen $||\cdot||_1$ und $||\cdot||_2$ sind äquivalent auf $\cV$, falls es Konstanten $\underline{C}$ und $\overline{C}$ gibt so dass
@@ -30,7 +30,7 @@ und mit mit \texttt{inf} als Argument wird die $\infty$-Norm, bzw die Max-Norm $
\fancydef{Lineare Konvergenz} $x^{(k)}$ konvergiert linear gegen $x^*$, falls es ein $L < 1$ gibt, so dass
\rmvspace
\begin{align*}
||x^{(k + 1)} - x^*|| \leq L||x^{(k)} - x^*|| \smallhspace \forall k \geq k_0, \smallhspace L \text{ gennant Konvergenzrate }
||x^{(k + 1)} - x^*|| \leq L||x^{(k)} - x^*|| \smallhspace \forall k \geq k_0, \smallhspace L \text{ genannt Konvergenzrate }
\end{align*}
\drmvspace\stepLabelNumber{all}
@@ -42,7 +42,40 @@ und mit mit \texttt{inf} als Argument wird die $\infty$-Norm, bzw die Max-Norm $
\drmvspace
Wir nehmen dabei an, dass $||x^{(0)} - x^*|| < 1$, damit wir eine konvergente Folge haben.
Man kann die Konvergenzordnung folgendermassen abschätzen, mit $\varepsilon_k := ||x^{(k)} - x^*||$ (Konvergenzrate in Bemerkung \ref{all:6-1-19}):
\rmvspace
\begin{align*}
p \approx \frac{\log(\varepsilon_{k + 1}) - \log(\varepsilon_k)}{\log(\varepsilon_k) - \varepsilon_{k - 1}}
\end{align*}
\drmvspace
Intuitiv haben wir Quadratische (oder Kubische, etc.) Konvergenzordnung, wenn sich die Anzahl Nullen im Fehler jede Iteration verdoppeln (verdreifachen, etc.)
\numberingOff
\inlineremark Eine höhere Konvergenzordnung ist in Lin-Log-Skala an einer gekrümmten Konvergenzkurve erkennbar.
\numberingOn
\rmvspace\setLabelNumber{all}{19}
\fancyremark{Abschätzung der Konvergenzrate} Sei $\varepsilon_k := ||x^{(k)} - x^*||$ die Norm des Fehlers im $k$-ten Schritt.
\drmvspace\rmvspace
\begin{align*}
\varepsilon_{k + 1} \approx L \cdot \varepsilon_k \Longrightarrow \log(\varepsilon_{k + 1}) \approx \log(L) + \log(\varepsilon_k)
\Longrightarrow \varepsilon_{k + 1} \approx k \log(L) + \log(\varepsilon_0)
\end{align*}
\drmvspace
Untenstehender Code berechnet den Fehler und die Konvergenzrate von $\displaystyle x^{(k + 1)} = x^{(k)} + \frac{\cos(x^{(k)}) + 1}{\sin(x^{(k)})}$.
Dabei verwenden wir $x^{(15)}$ anstelle von $x^*$ zur Berechnung der Konvergenzrate, da $x^*$ meist unbekannt ist.
\drmvspace
\begin{code}{python}
def linear_convergance(x):
y = [] # container for the x(j)
for k in range(15):
x = x + (np.cos(x) + 1) / np.sin(x) # apply the iteration formula
y += [x] # store the value in the container
err = abs(np.array(y) - x) # estimation for the error
rate = err[1:] / err[:-1]
# estimation for convergence rate
return err, rate
\end{code}

View File

@@ -0,0 +1,16 @@
% ┌ ┐
% │ AUTHOR: Janis Hutz<info@janishutz.com> │
% └ ┘
\newsection
\subsection{Abbruchkriterien}
Wir müssen irgendwann unsere Iteration abbrechen können, dazu haben wir folgende Möglichkeiten:
\begin{fullTable}{p{2.5cm}p{5.5cm}p{3cm}p{4.5cm}}{Typ & Idee & Vorteile & Nachteile}{Vergleich der Abbruchkriterien}
\bi{A priori} & Fixe Anzahl $k_0$ Schritte & Einfach zu implementieren & Zu ungenau \\
\bi{A posteriori} & Berechnen bis Toleranz $\varepsilon < \tau$ erreicht & Präzise & Man kennt $x^*$ nicht \\
\bi{Ungefähr gleich} & Itaration bis$x^{(k + 1)} \approx x^{(k)}$ & Keine Voraussetzungen & Ineffizient \\
\bi{Residuum} & Abbruch wenn $||F(x^{(k)})|| < \tau$ (wir also fast bei $0$ sind mit dem Funktionswert) & Einfach zu implementieren & Bei flachen Funktionen kann $||F(x^{(k)}||$ klein sein, aber $\varepsilon$ gross) \\
\end{fullTable}
\drmvspace
\inlineremark Für das \textit{a posteriori} Abbruchkriterium mit linearer Konvergenz und bekanntem $L$ gilt die Abschätzung aus Lemma \ref{all:6-3-6} mit Korollar \ref{all:6-3-17}

View File

@@ -0,0 +1,66 @@
% ┌ ┐
% │ AUTHOR: Janis Hutz<info@janishutz.com> │
% └ ┘
\rmvspace\newsectionNoPB
\subsection{Fixpunktiteration}
Ein $1$-Punkt-Verfahren benötigt nur den vorigen Wert: $x^{(k + 1)} = \phi(x^{(k)})$
% FIXME: Below konsistent is probably wrong, but is what is in the script
\inlinedef Eine Fixpunktiteration heisst konsistent mit $F(x) = 0$ falls $F(x) = 0 \Leftrightarrow \phi(x) = x$
\inlineex Für $F(x) = xe^x - 1$ mit $x \in [0, 1]$ liefert $\phi_1(x) = e^{-x}$ lineare Konvergenz,
$\phi_2(x) = \frac{1 + x}{1 + e^x}$ quadratische Konvergenz und $\phi_3(x) = x + 1 - xe^x$ eine divergente Folge.
\setLabelNumber{all}{5}
\fancydef{Kontraktion} $\phi$ falls es ein $L < 1$ gibt, so dass $||\phi(x) - \phi(y)|| \leq L||x - y|| \ \forall x, y$
\inlineremark Falls $x^*$ ein Fixpunkt der Kontraktion $\phi$ ist, dann ist
\drmvspace
\begin{align*}
||x^{(k + 1)} - x^*|| = ||\phi(x^{(k)}) - \phi(x^*)|| \leq L||x^{(k)} - x^*||
\end{align*}
\drmvspace
\begin{theorem}[]{Banach'scher Fixpunktsatz}
Sei $D \subseteq \K^n$ ($\K = \R, \C$) mit $D$ abgeschlossen und $\phi: D \rightarrow D$ eine Kontraktion.
Dann existiert ein eindeutiger Fixpunkt $x^*$, für welchen also gilt, dass $\phi(x^*) = x^*$.
Dieser ist der Grenzwert der Folge $x^{(k + 1)} = \phi(x^{(k)})$.
\end{theorem}
% NOTE: If need be, we can switch to theorem here, or I can add a new environment for "support theorem" or the like,
% I however feel like a Lemma suits the idea of "Hilfstheorem" quite well
\inlinelemma Für $U \subseteq \R^n$ konvex und $\phi : U \rightarrow \R^n$ stetig differenzierbar mit $L := \sup_{x \in U} ||D_\phi(x)|| < 1$
($D_\phi(x)$ ist die Jacobi-Matrix von $\phi(x)$).
Wenn $\phi(x^*) = x^*$ für $x^* \in U$, dann konvergiert $x^{(k + 1)} = \phi(x^{(k)})$ gegen $x^*$ lokal mindestens linear.
Dies ist eine hinreichende (= sufficient) Bedingung.
\setLabelNumber{all}{11}
\inlinelemma Für $\phi : \R^n \rightarrow \R^n$ mit $\phi(x^*) = x^*$ und $\phi$ stetig differenzierbar in $x^*$.
Ist $||D_\phi(x^*)|| < 1$, dann konvergiert $x^{(k + 1)} = \phi(x^{(k)})$ lokal und mindestens linear mit $L = ||D_\phi(x^*)||$
\stepLabelNumber{all}
\fancytheorem{Satz von Taylor} Sei $I \subseteq \R$ ein Intervall, $\phi : I \rightarrow \R$ $(m + 1)$-mal differenzierbar und $x \in I$.
Dann gilt für jedes $y \in I$
\drmvspace
\begin{align*}
\phi(y) - \phi(x) = \sum_{k = 1}^{m} \frac{1}{k!} \left( \phi^{(k)}(x) (y - x)^k \right) + \tco{|y - x|^{m + 1}}
\end{align*}
\drmvspace
\inlinelemma Sei $I$ und $\phi$ wie in Satz \ref{all:6-3-13}. Sei zudem $\phi^{(l)}(x^*) = 0$ für $l \in \{ 1, \ldots, m \}$ mit $m \geq 1$.
Dann konvergiert $x^{(k + 1)} = \phi(x^{(k)})$ lokal gegen $x^*$ mit Ordnung $p \geq m + 1$
\stepLabelNumber{all}
\inlinelemma Konvergiert $\phi$ linear mit $L < 1$, dann gilt:
\drmvspace
\begin{align*}
||x^{*} - x^{(k)}|| \leq \frac{L^{k - l}}{1 - L} ||x^{(l + 1)} - x^{(l)}||
\end{align*}
\drmvspace
\inlinecorollary für $l = 0$ haben wir ein \textit{a priori} und für $l = k - 1$ ein \textit{a posteriori} Abbruchkriterium:
\drmvspace
\begin{align*}
||x^* - x^{(k)}|| \leq \frac{L^k}{1 - L} ||x^{(1)} - x^{(0)}|| \leq \tau & & ||x^* - x^{(k)}|| \leq \frac{L}{1 - L} ||x^{(k)} - x^{(k - 1)}|| \leq \tau
\end{align*}

View File

@@ -0,0 +1,13 @@
\newsection
\subsection{Intervallhalbierungsverfahren}
Die Idee hier ist, das Intervall immer weiter zu halbieren und ein bekannterer Namen für dieses Verfahren ist \bi{Bisektionsverfahren}.
\innumpy haben wir \texttt{scipy.optimize.bisect} und \texttt{scipy.optimize.fsolve}, wobei \texttt{fsolve} ein alter Algorithmus ist.
Im Skript auf Seiten 206 - 207 findet sich eine manuelle implementation des Bisektionsverfahren.
Der Code ist jedoch (at the time of writing) nicht ausführbar aufgrund von \texttt{IndentationErrors}
Das Bisektionsverfahren konvergiert linear und kann nur für Funktionen verwenden, bei welchen die Nullstellen auf beiden Seiten jeweils ungleiche Vorzeichen haben.
Für jeden Iterationsschritt ermitteln wir die Mitte des Intervalls und berechnen die Funktionswerte an den Rändern, wie auch dem Mittelpunkt.
Dann ersetzen wir den Rand des Intervalls, dessen Funktionswert dasselbe Vorzeichen hat, wie der Funktionswert des Mittelpunkts.

View File

@@ -0,0 +1,17 @@
\newsectionNoPB
\subsection{Newtonverfahren in 1D}
Beim Newtonverfahren verwendet man für jeden Iterationsschritt die lineare Funktion $\tilde{F} = F(x^(k)) + F'(x^{(k)})(x - x^{(k)})$. Die Nullstelle ist dann:
\rmvspace
\begin{align*}
x^{(k + 1)} := x^{(k)} - \frac{F(x^{(k)})}{F'(x^{(k)})}, \mediumhspace \text{falls } F'(x^{(k)}) \neq 0
\end{align*}
\stepLabelNumber{all}
\inlineremark Die Newton-Iteration ist eine Fixpunktiteration mit quadratischer lokaler Konvergenz, mit
\rmvspace
\begin{align*}
\phi(x) = x - \frac{F(x)}{F'(x)} \Longrightarrow \phi'(x) = \frac{F(x) F''(x)}{(F'(x))^2} \Longrightarrow \phi'(x^*) = 0
\end{align*}
\drmvspace
falls $F(x^*) = 0$ und $F^(x^*) \neq 0$

View File

@@ -0,0 +1,8 @@
\newsectionNoPB
\subsection{Sekantenverfahren}
Falls die Ableitung zu teuer oder nicht verfügbar ist, kann man sie durch $q^(k) := \frac{F(x^{(k)}) - F(x^{(k - 1)})}{x^{(k)} - x^{(k - 1)}}$.
Dann ist ein Schritt:
\rmvspace
\begin{align*}
\tilde{F}(x) = F(x^{(k)}) + q^{(k)} (x - x^{(k)}) \Longrightarrow x^{(k + 1)} := x^{(k)} - \frac{F(x^{(k)})}{q^{(k)}}, \smallhspace \text{ falls } q^{(k)} \neq 0
\end{align*}

View File

@@ -0,0 +1,36 @@
\newsectionNoPB
\subsection{Newton-Verfahren in $n$ Dimensionen}
Sei $D \subseteq \R^n$ und $F: D \rightarrow \R^n$ stetig differenzierbar. Die Nullstelle ist
\rmvspace
\begin{align*}
x^{(k + 1)} := x^{(k)} - DF(x^{(k)})^{-1} F(x^{(k)})
\end{align*}
\drmvspace
wobei $DF(x^{(k)}) =
\begin{bmatrix}
\frac{\partial F_j}{\partial x_k} (x)
\end{bmatrix}_{j, k = 1, 2, \ldots, n}$ die Jacobi-Matrix von $F$ ist.
Wichtig ist dabei, dass wir \bi{niemals} das Inverse der Jacobi-Matrix (oder irgend einer anderen Matrix) von der Form $s = A^{-1} b$,
sondern immer das Gleichungssystem $As = b$ lösen sollten, da dies effizienter ist:
\begin{code}{python}
def newton(x, F, DF, tol=1e-12, maxit=50):
x = np.atleast_2d(x) # solve erwartet x als 2-dimensionaler numpy array
# Newton Iteration
for _ in range(maxit):
s = np.linal.solve(DF(x), F(x))
x -= s
if np.linalgnorm(s) < tol * np.linalg.norm(x):
return x
\end{code}
Wollen wir aber garantiert einen Fehler kleiner als unsere Toleranz $\tau$ können wir das Abbruchkriterium
\rmvspace
\begin{align*}
||DF(x^{(k - 1)})^{-1}F(x^{(k)})|| \leq \tau
\end{align*}
\drmvspace
verwenden. Code, welcher dies implementiert findet sich auf Seite 213-216 im Skript.

View File

@@ -0,0 +1,16 @@
\newsection
\subsection{Gedämpftes Newton-Verfahren}
Wir wenden einen einen Dämpfungsfaktor $\lambda^{(k)}$ an, welcher heuristisch gewählt wird:
\rmvspace
\begin{align*}
x^{(k + 1)} := x^{(k)} - \lambda^{(k)}DF(x^{(k)})^{-1} F(x^{(k)})
\end{align*}
\drmvspace
Wir wählen $\lambda^{(k)}$ so, dass für $\Delta x^{(k)} = DF(x^{(k)})^{-1} F(x^{(k)})$ und $\Delta(\lambda^{(k)}) = DF(x^{(k)})^{-1} F(x^{(k)} - \lambda^{(k)} \Delta x^{(k)})$
\rmvspace
\begin{align*}
||\Delta x(\lambda^{(k)})||_2 \leq \left( 1 - \frac{\lambda^{(k)}}{2} \right) ||\Delta x^{(k)}||_2
\end{align*}
\drmvspace

View File

@@ -0,0 +1,13 @@
\newsectionNoPB
\subsection{Quasi-Newton-Verfahren}
Falls $DF(x)$ zu teuer ist oder nicht zur Verfügung steht, können wir im Eindimensionalen das Sekantenverfahren verwenden.
Im höherdimensionalen Raum ist dies jedoch nicht direkt möglich und wir erhalten die Broyden-Quasi-Newton Methode:
\rmvspace
\begin{align*}
J_{k + 1} := J_k + \frac{F(x^{(k + 1)}) (\Delta x^{(k)})^\top}{||\Delta x^{(k)}||_2^2}
\end{align*}
\drmvspace
Dabei ist $J_0$ z.B. durch $DF(x^{(0)})$ definiert.
% Page 222

View File

@@ -0,0 +1,44 @@
Das Skript-Kapitel hierzu existiert nicht. Die Vorlesung orientiert sich an dem äquivalenten Teil des NumCSE Dokuments.
\textbf{Perturbierte LGS}
Statt $Ax = b$ ist das LGS ungenau gegeben: $(A + \Delta A)(\tilde{x} - x) = \Delta b - \Delta Ax$.
$\text{cond}(A) := \left\lvert\left\lvert A^{-1} \right\rvert\right\rvert \cdot \lvert\lvert A \rvert\rvert \in \mathbb{R}$ (Konditionszahl von $A$)
$\text{cond}(A) \gg 1$ bedeutet intuitiv: kleine Änderung der Daten $\mapsto$ grosse Änderung in der Lösung
\textbf{Gauss Elimination / LU Zerlegung}
$A \in \mathbb{R}^{n\times m} = PLU$ wie bekannt.
\textbf{Cholesky Zerlegung} ($A$ pos. def. und hermitesch)
$A = LDL^\top = \underbrace{L\sqrt{D}}_{R^\top}\underbrace{\sqrt{D}L^\top}_{R} = R^\top R$
Kann $Ax = b$ potenziell schneller lösen als LU.
\begin{code}{python}
L = np.linalg.solve(A) # A = L @ L.T
y = np.linalg.solve(L, b)
x = np.linalg.solve(L.T, y)
\end{code}
\textbf{Grosse Matrizen}
Passen oft nicht (direkt) in den Speicher: effizientere Speicherung nötig, möglich für z.B. Diagonalmatrizen, Dreiecksmatrizen. Auch für Cholesky möglich.
\textbf{Dünnbesetzte Matrizen}
$\text{nnz}(A) := |\{ (i,j) \ |\ a_{ij} \in A, a_{ij} \neq 0 \}| \ll m\cdot n$
$\underset{l \to \infty}{\lim} \frac{\text{nnz}(A^{(l)})}{n_l m_l} = 0$
Einfacher zu speichern: \verb|val, col, row| vektoren s.d. \verb|val[k]| $ = a_{ij}$ wobei $i=$ \verb|row[k]|, $j=$ \verb|col[k]|. (nur $a_{ij} \neq 0$)
Viele Formate, je nach Anwendung gewisse sinnvoller als andere. (Siehe Tabelle, NumCSE)
\verb|scipy.sparse.csr_matrix(A)| $\mapsto$ Dramatische Speichereinsparung.\\
Deprecated: \verb|bsr_array| und \verb|coo_array| verwenden, kompatibel mit \verb|numpy| arrays.
\verb|CSC, CSR| erlauben weitere Optimierungen, je nach Gewichtung der $a_{ij}$ auf Zeilen, Spalten.

View File

@@ -1 +1,75 @@
\newpage
\subsection{Die Methode der Reduktion}
% TODO: Add guide for reducing languages
\fancydef{Rekursiv reduzierbare Sprache} Eine Sprache $L_1 \subseteq \word_1$ ist auf $L_2 \subseteq \word_2$ rekursiv reduzierbar, geschrieben $L_1 \leq_R L_2$,
falls $L_2 \in \cL_R \Rightarrow L_1 \in \cL_R$.
\shade{teal}{Intuition:} $L_2$ ist bezüglich der algorithmischen Lösbarkeit mindestens so schwer wie $L_1$. $\cL_R$ ist die Menge aller rekursiv reduzierbaren Sprachen.
Ist also $L_2$ lösbar, so muss auch $L_1$ lösbar sein.
\fancydef{EE-reduzierbare Sprache} $L_1$ ist auf $L_2$ \bi{EE-reduzierbar}, geschrieben $L_1 \leq_{EE} L_2$, wenn eine TM $M$ existiert,
die eine Abbildung $f_M : \word_1 \rightarrow \word_2$ mit der Eigenschaft $x \in L_1 \Leftrightarrow f_M(x) \in L_2$ für alle $x \in \word_1$ berechnet.
Anders ausgedrückt: die TM $M$ reduziert die Sprache $L_1$ auf die Sprache $L_2$
\inlinelemma Falls $L_1 \leq_{EE} L_2$, dann auch $L_1 \leq_R L_2$. \inlineproof Im Buch auf Seite 135 (= 148 im PDF)
Wir müssen also nur zeigen, dass $L_1 \leq_{EE} L_2$ um zu zeigen, dass $L_1 \leq_R L_2$
\inlinelemma Für jede Sprache $L \subseteq \word$ gilt: $L \leq_R L^C$ und $L^C \leq_R L$
\inlinecorollary $(L_\text{diag})^C \notin \cL_R$
\inlineproof Folgt davon, dass $L_\text{diag} \notin \cL_{RE}$ (was heisst, dass $L_\text{diag} \notin \cL_R$)
und nach Lemma 5.4 $L_\text{diag} \leq_R (L_\text{diag})^C$ und das umgekehrte gelten muss.
\inlinelemma $(\ldiag)^C \in \cL_{RE}$
\inlineproof Auf Seite 137 (= 150 im PDF) wird eine Turingmaschine aufgezeigt, die $(L_\text{diag})^C$ akzeptiert.
\inlinecorollary $(\ldiag)^C \in \cL_{RE} - \cL_R$ und daher $\cL_R \subsetneq \cL_{RE}$
Folgende Sprachen sind nicht rekursiv, liegen aber in $\cL_{RE}$
\fancydef{Universelle Sprache} $L_U = \{ \text{Kod}(M)\# w \divides w \in \wordbool \text{ und TM } M \text{ akzeptiert } w \}$
\fancytheorem{Universelle TM} Eine TM $U$, so dass $L(U) = L_U$, also gilt $L_U \in \cL_{RE}$\\
%
\inlineproof Auf Seite 138 (= 151 im PDF)
Was dies bedeutet, es existiert eine TM ohne Haltegarantie, die eine beliebige Turingmaschine auf einer gegebenen Eingabe simulieren kann.
Untenstehendes Resultat bedeutet, dass man das Resultat der Berechnung einer TM $M$ auf einer Eingabe $x$ anders berechnen kann, als die Berechnung von $M$ auf $x$ zu simulieren.
\inlinetheorem $L_U \notin \cL_R$
Wenn jetzt aber $M$ unendlich lange auf $x$ arbeitet, so wissen wir nicht, ob wir die Simulation beenden können. Dies führt zum Halteproblem
\begin{definition}[]{Halteproblem}
Das Halteproblem ist das Entscheidungsproblem $(\{ 0, 1, \# \}, L_H)$ mit
\begin{align*}
L_H = \{ \text{Kod}(M)\# x \divides x \in \{ 0, 1 \}^* \text{ und } M \text{ hält auf } x \}
\end{align*}
\end{definition}
Dies scheint vorerst nicht ein allzu grosses Problem zu sein, jedoch besagt das nächste Resultat, dass es keinen Algorithmus gibt,
der testen kann, ob ein gegebenes Programm immer terminiert.
\inlinetheorem $L_H \in \cL_R$
\inlineproof Auf Seiten 140 - 142 (153 - 155 im PDF)
Betrachten wir die Sprache $\lempty = \{ \text{Kod}(M) \divides L(M) = \emptyset \}$, die die Kodierungen aller Turingmaschinen enthält,
die die leere Menge (kein Wort) akzeptieren. Es gilt
\rmvspace
\begin{align*}
(\lempty)^C = \{ x \in \wordbool \divides x \notin \text{Kod}(\overline{M}) \forall \text{ TM } \overline{M} \text{ oder } x = \text{Kod}(M) \text{ und } L(M) \neq \emptyset \}
\end{align*}
\drmvspace
\inlinelemma $(\lempty)^C \in \cL_{RE}$
\inlineproof Auf Seiten 142 - 143 (155 - 156 im PDF)
\inlinelemma $(\lempty)^C \notin \cL_R$
Wir haben als wiederum die Nichtexistenz eines Algorithmus zur Überprüfung, ob ein gegebenes Programm die leere Menge akzeptiert.
Ein Beweis dazu findet sich auf Seiten 143 und 144 im Buch (156 - 157 im PDF)
\inlinecorollary $\lempty \notin \cL_R$
\inlinecorollary $L_{EQ} = \{ \text{Kod}(M)\# \text{Kod}(\overline{M}) \divides L(M) = L(\overline{M}) \}$ ist nicht entscheidbar (also $L_{EQ} \notin \cL_R$)

View File

@@ -0,0 +1,18 @@
\subsection{Der Satz von Rice}
\inlinedef $L$ heisst \bi{semantisch nichttriviales Entscheidungsproblem über Turingmaschinen}, falls folgende Bedingungen gelten:
\begin{enumerate}[label=(\roman*)]
\item Es gibt eine TM $M_1$, so dass $\text{Kod}(M_1) \in L$ (also $L \neq \emptyset$)
\item Es gibt eine TM $M_2$, so dass $\text{Kod}(M_2) \notin L$ (also sind nicht alle Kodierungen in $L$)
\item für zwei TM $A$ und $B$: $L(A) = L(B) \Rightarrow \text{Kod}(A) \in L \Leftrightarrow \text{Kod}(B) \in L$
\end{enumerate}
Sei $L_{H, \lambda} = \{ \text{Kod}(M) \divides M \text{ hält auf } \lambda \}$ ein spezifisches Halteproblem.
\inlinelemma $L_{H, \lambda} \notin \cL_R$
\inlineproof Auf Seite 146 im Buch (= 159 im PDF)
\begin{theorem}[]{Satz von Rice}
Jedes semantisch nichttriviale Entscheidungsproblem über Turingmaschinen ist unentscheidbar.
\end{theorem}
\inlineproof Ausführlich im Buch auf Seiten 146 - 149 beschrieben (= 159 - 162 im PDF)
\stepcounter{subsection}

View File

@@ -0,0 +1,6 @@
\subsection{Die Methode der Kolmogorov-Komplexität}
\inlinetheorem Das Probelem, für jedes $x \in \wordbool$ die Kolmogorov-Komplexität $K(x)$ von $x$ zu berechnen ist algorithmisch unlösbar.
\inlinelemma Falls $L_H \in \cL_R$, dann existiert ein Algorithmus zur Berechnung der Kolmogorov-Komplexität $K(x)$ für jedes $x\in \wordbool$
% TODO: See if we need to do these kinds of proofs and if so, elaborate

View File

@@ -0,0 +1,61 @@
\subsection{Komplexitätsmasse}
\begin{definition}[]{Zeitkomplexität}
Sei $M$ eine Mehrband-TM oder TM, die immer hält, $x \in \word$ und $D = C_1, C_2, \ldots, C_k$ die Berechnung von $M$ auf $x$, deren Zeitkomplexität definiert ist durch:
\rmvspace
\begin{align*}
\tc_M(x) = k - 1
\end{align*}
\rmvspace
also durch die Anzahl der Berechnungsschritte in $D$
Die Zeitkomplexität der TM $M$ ist dabei definiert durch:
\drmvspace
\begin{align*}
\tc_M(n) = \max\{ \tc_M(x) \divides x \in \Sigma^n \}
\end{align*}
\end{definition}
Wir können weiterhin die big-O-notation verwenden um den Worstcase anzugeben.
\begin{definition}[]{Speicherplatzkomplexität}
Sei $C = (q, x, i, \alpha_1, i_1, \alpha_2, i_2, \ldots, \alpha_k, i_k)$ mit $0 \leq i |x| + 1$ und $0 \leq i_j \leq |\alpha_j|$
für $j = 1, \ldots, k$ eine Konfiguration von $M$, welche eine $k$-Band TM ist.
\bi{Die Speicherplatzkomplexität von} $C$ ist
\rmvspace
\begin{align*}
\spc_M(C) = \max\{ |\alpha_i| \divides i = 1, \ldots, k \}
\end{align*}
\rmvspace
Für die Berechnung $C_1, C_2, \ldots, C_l$ von $M$ auf $x$ haben wir:
\rmvspace
\begin{align*}
\spc_M(x) = \max\{ \spc_M(C_i) \divides i = 1, \ldots, l \}
\end{align*}
\rmvspace
Und die \bi{Speicherplatzkomplexität von} $M$ ist
\rmvspace
\begin{align*}
\spc_M(n) = \max\{ \spc_M(x) \divides x \in \Sigma^n \}
\end{align*}
\end{definition}
Es ist auch möglich $\spc_M(n)$ als eine Summe zu definieren, aber laut Lemma \ref{lemma:4-2} wissen wir, dass man eine $k$-Band-TM mit einer $1$-Band-TM simulieren kann.
\inlinelemma Sei $k \in \N$. Für jede $k$-Band-TM $A$, die immer hält existiert eine äquivalente $1$-Band-TM $B$, so dass $\spc_B(n) \leq \spc_A(n)$
\inlinelemma Für jede $k$-Band-TM $A$, existiert eine äquivalente $k$-Band-TM $B$, so dass $L(A) = L(B)$ und $\spc_B(n) \leq \frac{\spc_A(n)}{2} + 2$
\inlinedef Wir notieren mit der big-O-notation folgendermassen: Falls $r \in \tco{f(n)}$, so wächst $r$ asymptotisch nicht schneller als $f$.
Äquivalent für $s \in \tcl{g(n)}$ und $l \in \tct{h(n)}$ sagen wir asymptotisch mindestens so (gleich) schnell.
Falls $\limni \frac{f(n)}{g(n)} = 0$, dann wächst $g$ asymptotisch schneller als $f$ und $f(n) = o(g(n))$
% TODO: Check if above really is a typo (pretty sure it is)
\inlinetheorem Es existiert ein Entscheidungsproblem $(\alphabetbool, L)$, so dass für jede MTM $A$, die $(\alphabetbool, L)$ entscheidet,
eine MTM $B$ existiert, die es auch entscheidet und für die gilt: $\tc_B(n) \leq \log_2(\tc_A(n))$ für alle $n \in \N$
\begin{definition}[]{Schranken, Optimal}
$\tco{g(n)}$ ($\tcl{f(n)}$) ist eine \bi{obere (untere) Schranke für die Zeitkomplexität von} $L$,
falls eine MTM $A$ ($B$) existiert, die $L$ entscheidet und $\tc_A(n) \in \tco{g(n)}$ ($\tc_B(n) \in \tcl{f(n)}$)
Eine MTM $C$ heisst \bi{optimal für} $L$, falls $\tc_C(n) \in \tco{f(n)}$ gilt und $\tct{f(n)}$ eine untere Schranke für die Zeitkomplexität von $K$ ist.
\end{definition}

View File

@@ -0,0 +1,86 @@
\newpage
\subsection{Komplexitätsklassen und die Klasse P}
\begin{definition}[]{Komplexitätsklasen}
Für alle Funktionen $f, g : \N \rightarrow \R^+$ definieren wir:
\begin{align*}
\text{TIME}(f) & = \{ L(B) \divides B \text{ ist eine MTM mit } \tc_B(n) \in \tco{f(n)} \} \\
\text{SPACE}(g) & = \{ L(A) \divides A \text{ ist eine MTM mit } \spc_A(n) \in \tco{g(n)} \} \\
\text{DLOG} & = \text{SPACE}(\log_2(n)) \\
\text{P} & = \bigcup_{c \in \N} \text{TIME}(n^c) \\
\text{PSPACE} & = \bigcup_{c \in \N} \text{SPACE}(n^c) \\
\text{EXPTIME} & = \bigcup_{d \in \N} \text{TIME}(2^{n^d})
\end{align*}
\end{definition}
\inlinelemma Für alle $t : \N \rightarrow \R^+$ gilt $\text{TIME}(t(n)) \subseteq \text{SPACE}(t(n))$
\inlinecorollary $\text{P} \subseteq \text{PSPACE}$
\begin{definition}[]{Platz- und Zeitkonstruierbarkeit}
Eine Funktion $s : \N \rightarrow \N$ heisst \bi{platzkonstruierbar}, falls eine $1$-Band-TM $M$ existiert, so dass
\begin{enumerate}
\item $\spc_M(n) \leq s(n) \smallhspace \forall n \in \N$
\item für jede Eingabe $0^n$ für $n \in \N$, generiert $M$ das Wort $0^{s(n)}$ auf ihrem Arbeitsband und hält in $\qacc$
\end{enumerate}
\vspace{0.25cm}
Eine Funktion $t : \N \rightarrow \N$ heisst \bi{zeitkonstruierbar}, falls eine MTM $A$ existiert, so dass
\begin{enumerate}
\item $\tc_A(n) \in \tco{t(n)}$
\item für jede Eingabe $0^n$ für $n \in \N$, generiert $A$ das Wort $0^{t(n)}$ auf dem ersten Arbeitsband und hält in $\qacc$
\end{enumerate}
\end{definition}
Wichtig ist, dass wir hier nicht \textit{zwingend} eine $1$-Band-TM konstruieren müssen, eine MTM geht auch.
% TODO: Possibly include construction guide here
\inlinelemma Sei $s$ platzkonstruierbar und $M$ eine MTM mit $\spc_M(x) \leq s(|x|) \ \forall x \in L(M)$.
Dann existiert MTM $A$ mit $L(A) = L(M)$ und $\spc_A(n) \leq s(n)$, es gilt also $\spc_A(y) \leq s(|y|) \ \forall y \in \Sigma_M$
\inlinelemma Sei $t$ zeitkonstruierbar und $M$ eine MTM mit $\tc_M(x) \leq t(|x|) \ \forall x \in L(M)$.
Dann existiert eine MTM $A$ mit $L(A) = L(M)$ und $\tc_A(n) \in \tco{t(n)}$
\inlinetheorem Für jede Funktion $s$ mit $s(n) \geq \log_2(n)$ gilt $\text{SPACE}(s(n)) \subseteq \bigcup_{c\in \N} \text{TIME}(c^{s(n)})$
Obiger Satz trifft auch für $s(n)$-platzbeschränkten TM zu, die nicht halten, aber nur, wenn $s(n)$ platzkonstruierbar ist.
\inlinecorollary $\text{DLOG} \subseteq \text{P}$ und $\text{PSPACE} \subseteq \text{EXPTIME}$
Die Korollare \ref{corollary:6-1} und \ref{corollary:6-2} geben zusammen $\text{DLOG} \subseteq \text{P} \subseteq \text{PSPACE} \subseteq \text{EXPTIME}$
\inlinetheorem Für $s_1, s_2 : \N \rightarrow \N$ mit folgenden Eigenschaften:
\drmvspace
\begin{multicols}{3}
\begin{enumerate}
\item $s_2(n) \geq \log_2(n)$
\item $s_2$ ist platzkonstruierbar
\item $s_1(n) = o(s_2(n))$
\end{enumerate}
\end{multicols}
\drmvspace\rmvspace
Dann gilt: $\text{SPACE}(s_1) \subsetneq \text{SPACE}(s_2)$
\inlinetheorem Für $t_1, t_2 : \N \rightarrow \N$ mit folgenden Eigenschaften:
\drmvspace
\begin{multicols}{2}
\begin{enumerate}
\item $t_2$ ist platzkonstruierbar
\item $t_1(n) \cdot \log_2(t_1(n)) = o(t_2(n))$
\end{enumerate}
\end{multicols}
\drmvspace\rmvspace
Dann gilt: $\text{TIME}(s_1) \subsetneq \text{TIME}(s_2)$
In den Sechzigerjahren entstand folgende ``Definition'' von parktisch lösbaren Problemen:
\begin{center}
\fbox{
\parbox{16cm}{
\textit{Ein Problem ist praktisch lösbar genau dann, wenn ein polynomialer Algorithmus zu seiner Lösung existiert.
Die Klasse P ist die Klasse der praktisch entscheidbaren Probleme}
}
}
\end{center}

View File

@@ -0,0 +1,65 @@
\newpage
\subsection{Nichtdeterministische Komplexitätsmasse}
\begin{definition}[]{Zeit- und Speicherkomplexität}
Sei $M$ eine NMTM oder MTM und $x \in L(M) \subseteq \word$. $\tc_M(x)$ ist die länge einer kürzesten akzeptierenden Berechnung von $M$ auf $x$
und $\tc_M(n) = \max(\{ \tc_M(x) \divides x \in L(M) \text{ und }|x| = n \} \cup \{ 0 \} )$.
\vspace{0.25cm}
$\spc_M(C_i)$ ist die Speicherkomplexität von Konfiguration $C_i$ und $\spc_M(C) = \max\{ \spc_M(C_i) \divides i = 1, 2, \ldots, m \}$.
Zudem ist $\spc_M(x) = \min\{ \spc_M(C) \divides C \text{ ist akzeptierende Berechnung von $M$ auf } x \}$.
Ausserdem ist $\spc_M(n) = \max(\{ \spc_M(x) \divides x \in L(M) \text{ und } |x| = n \} \cup \{ 0 \})$
\end{definition}
\begin{definition}[]{Komplexitätsklassen}
Für alle $f, g : \N \rightarrow \R^+$ definieren wir:
\begin{align*}
\text{NTIME}(f) & = \{ L(M) \divides M \text{ ist eine NMTM mit } \tc_M(n) \in \tco{f(n)} \} \\
\text{NSPACE}(g) & = \{ L(M) \divides M \text{ ist eine NMTM mit } \spc_M(n) \in \tco{g(n)} \} \\
\text{NLOG} & = \text{NSPACE}(\log_2(n)) \\
\text{NP} & = \bigcup_{c \in \N} \text{NTIME}(n^c) \\
\text{NPSPACE} & = \bigcup_{c \in \N} \text{NSPACE}(n^c)
\end{align*}
\end{definition}
\inlinelemma Für alle $t$ und $s$ mit $s(n) \geq \log_2(n)$ gilt: $\text{NTIME}(t) \subseteq \text{NSPACE}(t)$, $\text{NSPACE}(s) \subseteq \bigcup_{c \in \N} \text{NTIME}(c^{s(n)})$
\inlinetheorem Für jedes $t : \N \rightarrow \R^+$ und jedes platzkonstruierbare $s$ mit $s(n) \geq \log_2(n)$ gilt:
\rmvspace
\begin{multicols}{2}
\begin{enumerate}[label=(\roman*)]
\item $\text{TIME}(t) \subseteq \text{NTIME}(t)$
\item $\text{SPACE}(t) \subseteq \text{NSPACE}(t)$
\item $\text{NTIME}(s(n)) \subseteq \text{SPACE}(s(n)) \subseteq \bigcup_{c \in \N} \text{TIME}(c^{s(n)})$
\end{enumerate}
\end{multicols}
\drmvspace
\inlinecorollary $\text{NP} \subseteq \text{PSPACE}$
\inlineremark Für jede platzkonstruierbare Funktion $s$ mit $s(n) \geq \log_2(n)$ gilt
\rmvspace
\begin{align*}
\text{NSPACE}(s(n)) \subseteq \bigcup_{c \in \N} \text{TIME}(c^{s(n)})
\end{align*}
\drmvspace
\inlinecorollary $\text{NLOG} \subseteq \text{P}$ und $\text{NPSPACE} \subseteq \text{EXPTIME}$
\fancytheorem{Satz von Savitch} Sei $s$ mit $s(n) \geq \log_2(n)$ eine platzkonstruierbare Funktion. Dann gilt:
\rmvspace
\begin{align*}
\text{NSPACE}(s(n)) \subseteq \text{SPACE}(s(n)^2)
\end{align*}
\drmvspace
\inlinecorollary $\text{PSPACE} = \text{NPSPACE}$
Aus den obigen Resultaten resultiert die Komplexitätsklassenhierarchie der sequentiellen Berechnungen:
\begin{align*}
\text{DLOG} \subseteq \text{NLOG} \subseteq \text{P} \subseteq \text{NP} \subseteq \text{PSPACE} \subseteq \text{EXPTIME}
\end{align*}

View File

@@ -0,0 +1,31 @@
\newpage
\subsection{Die Klasse NP und Beweisverifikation}
Da praktische Lösbarkeit eines Problems mit polynomieller Zeit verbunden wird, ist es wichtig zu wissen, welche Probleme in polynomieller Zeit lösbar sind und welche nicht.
Der Vergleich zwischen den Klassen $P$ und $NP$ ist äquivalent zu der Frage, ob es einfacher ist, gegebene Beweise zu verifizieren, als sie herzustellen.
Betrachten wir folgendes: Sei $L = SAT$, wobei
\rmvspace
\begin{align*}
SAT = \{ x \in \words{logic} \divides x \text{ kodiert eine erfüllbare Formel in CNF} \}.
\end{align*}
\drmvspace
Dann ist die Aussage $\Phi \in SAT$ äquivalent zu der Behauptung ``$\Phi$ ist eine erfüllbare Formel in CNF''
Für nichtdeterministische Berechnungen nennen wir $\alpha_1, \ldots, \alpha_n$ \bi{Zertifikate} für eine Aussage $\Xi$, falls für diese $\Xi(\alpha_1, \ldots, \alpha_n)$ hält.
\begin{definition}[]{Verifizierer}
Sei $L \subseteq \word$ und $p : \N \rightarrow \N$.
Eine MTM $A$ ist ein $p$-Verifizierer und $V(A) = L$, falls $A$ mit folgenden Eigenschaften auf allen Eingaben aus $\word \times \wordbool$ arbeitet:
\begin{enumerate}[label=(\roman*)]
\item $\tc_A(w, x) \leq p(|w|)$ für jede Eingabe $(w, x) \in \word \times \wordbool$
\item Für jedes $w \in L$ existiert ein $x \in \wordbool$, so dass $|x| \leq p(|w|)$ und $(w, x) \in L(A)$. $x$ ist \bi{Zeugen} (oder \bi{Beweis}) der Behauptung $w \in L$
\item Für jedes $y \notin L$ gilt $(y, z) \notin L(A)$ für alle $z \in \wordbool$
\item Falls $p(n) \in \tco{n^k}$ für ein $k \in \N$, so ist $p$ ein \bi{Polynomialzeit-Verifizierer}. Die Klasse ist
\vspace{-0.8pc}
\begin{align*}
VP = \{ V(A) \divides A \text{ ist ein Polynomialzeit-Verifizierer } \}
\end{align*}
\end{enumerate}
\end{definition}

View File

@@ -0,0 +1,2 @@
\newpage
\subsection{NP-Vollständigkeit}

Binary file not shown.

View File

@@ -8,6 +8,10 @@
\newcommand{\hdelta}{\hat{\delta}}
\newcommand{\qacc}{q_{\text{accept}}}
\newcommand{\qrej}{q_{\text{reject}}}
\newcommand{\ldiag}{L_{\text{diag}}}
\newcommand{\lempty}{L_{\text{empty}}}
\renewcommand{\tc}{\text{Time}}
\newcommand{\spc}{\text{Space}}
\begin{document}
\startDocument
@@ -94,6 +98,17 @@
\stepcounter{subsection}
\input{parts/04_computability/00_intro.tex}
\input{parts/04_computability/01_reduction.tex}
\input{parts/04_computability/02_rice.tex}
\input{parts/04_computability/03_kolmogorov.tex}
\newsection
\section{Komplexitätstheorie}
\stepcounter{subsection}
\input{parts/05_complexity/00_intro.tex}
\input{parts/05_complexity/01_class_p.tex}
\input{parts/05_complexity/02_non-deterministic-complexity.tex}
\input{parts/05_complexity/03_class-np.tex}
\input{parts/05_complexity/04_np-completeness.tex}
\end{document}