diff --git a/semester3/numcs/numcs-summary.tex b/semester3/numcs/numcs-summary.tex index 67e2941..075f461 100644 --- a/semester3/numcs/numcs-summary.tex +++ b/semester3/numcs/numcs-summary.tex @@ -154,6 +154,10 @@ Moral of the story: Use descriptive variable names and do NOT use $t$, $tt$, $tt \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} diff --git a/semester3/numcs/parts/03_zeros/03_bisection-method.tex b/semester3/numcs/parts/03_zeros/03_bisection-method.tex index 34cbaa8..bb5b252 100644 --- a/semester3/numcs/parts/03_zeros/03_bisection-method.tex +++ b/semester3/numcs/parts/03_zeros/03_bisection-method.tex @@ -9,4 +9,5 @@ Der Code ist jedoch (at the time of writing) nicht ausführbar aufgrund von \tex Das Bisektionsverfahren konvergiert linear und kann nur für Funktionen verwenden, bei welchen die Nullstellen auf beiden Seiten jeweils ungleiche Vorzeichen haben. -% TODO: Need to add the formula from SPAM script +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. diff --git a/semester3/numcs/parts/03_zeros/04_newton-one-d.tex b/semester3/numcs/parts/03_zeros/04_newton-one-d.tex index 7dd9839..7d47de5 100644 --- a/semester3/numcs/parts/03_zeros/04_newton-one-d.tex +++ b/semester3/numcs/parts/03_zeros/04_newton-one-d.tex @@ -1,2 +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$ diff --git a/semester3/numcs/parts/03_zeros/05_sectant-method.tex b/semester3/numcs/parts/03_zeros/05_sectant-method.tex new file mode 100644 index 0000000..29ad1e6 --- /dev/null +++ b/semester3/numcs/parts/03_zeros/05_sectant-method.tex @@ -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*} diff --git a/semester3/numcs/parts/03_zeros/06_newton-nd.tex b/semester3/numcs/parts/03_zeros/06_newton-nd.tex new file mode 100644 index 0000000..6ab2878 --- /dev/null +++ b/semester3/numcs/parts/03_zeros/06_newton-nd.tex @@ -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. diff --git a/semester3/numcs/parts/03_zeros/07_damped-newton.tex b/semester3/numcs/parts/03_zeros/07_damped-newton.tex new file mode 100644 index 0000000..bff16ac --- /dev/null +++ b/semester3/numcs/parts/03_zeros/07_damped-newton.tex @@ -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 diff --git a/semester3/numcs/parts/03_zeros/08_quasi-newton.tex b/semester3/numcs/parts/03_zeros/08_quasi-newton.tex new file mode 100644 index 0000000..855743d --- /dev/null +++ b/semester3/numcs/parts/03_zeros/08_quasi-newton.tex @@ -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