diff --git a/semester3/numcs/numcs-summary.pdf b/semester3/numcs/numcs-summary.pdf index c812771..8931452 100644 Binary files a/semester3/numcs/numcs-summary.pdf and b/semester3/numcs/numcs-summary.pdf differ diff --git a/semester3/numcs/numcs-summary.tex b/semester3/numcs/numcs-summary.tex index 555a9ad..d422199 100644 --- a/semester3/numcs/numcs-summary.tex +++ b/semester3/numcs/numcs-summary.tex @@ -33,7 +33,6 @@ \vspace{4cm} \begin{center} \begin{Large} - \quote{Denken vor Rechnen} % FIXME: Marked for removal \quote{Wer in Python Type annotation benötigt, der soll kein Python verwenden} (2025-10-09T10:43) % FIXME: Marked for removal \quote{Wenn ich keine Lust habe, das zu berechnen, dann wende ich einfach Gewalt an} \end{Large} diff --git a/semester3/numcs/parts/05_curve-fitting/01_linear/01_normal-equations.tex b/semester3/numcs/parts/05_curve-fitting/01_linear/01_normal-equations.tex index 1a56597..7360883 100644 --- a/semester3/numcs/parts/05_curve-fitting/01_linear/01_normal-equations.tex +++ b/semester3/numcs/parts/05_curve-fitting/01_linear/01_normal-equations.tex @@ -36,4 +36,7 @@ $B_a = -aI & A \\ A^H & 0 \end{bmatrix} -$ +$ +% TODO: What the f does the kappa mean??? +ersetzen, wobei wir $a$ so wählen, dass $\kappa(B_a)$ minimal wird. +% TODO: Consider adding the code and the example, but likely skip diff --git a/semester3/numcs/parts/05_curve-fitting/01_linear/02_orthogonal-transforms.tex b/semester3/numcs/parts/05_curve-fitting/01_linear/02_orthogonal-transforms.tex index e69de29..de4ebf1 100644 --- a/semester3/numcs/parts/05_curve-fitting/01_linear/02_orthogonal-transforms.tex +++ b/semester3/numcs/parts/05_curve-fitting/01_linear/02_orthogonal-transforms.tex @@ -0,0 +1,54 @@ +\subsubsection{Lösung mittels orthogonaler Transformation} +Nicht nur die Normalengleichungen, aber auch das LU-Verfahren kann für gewisse Matrizen (im Falle von LU sind es Matrizen mit $m > n$) ungeeignet sein. + +Wir versuchen wieder $||r||_2^2$ zu minimieren, mit $r = Ax - b$. +Mithilfe der $QR$-Zerlegung lässt sich ein Lösungsansatz herleiten, der höhere numerische Stabilität aufweist, als die Normalengleichungen. +Sei $A = QR = Q \begin{bmatrix} + \tilde{R} \\ 0 + \end{bmatrix}$. +Dann, nach Umformungen erhalten wir $||Rx - \tilde{b}||_2^2$ mit $\tilde{b} = Q^Hb$. + +Nutzt man beispielsweise Housholder-Spiegelungen zur Berechnung der $QR$-Zerlegung, so kann man die Transformationen direkt auf $b$ anwenden +und so kann man sich das Abspeichern der Matrix $Q$ komplett sparen. + +Falls jedoch die Matrix $A$ nicht vollen Rang hat (was sehr oft der Fall ist), dann ist es besser, die Singulärwertzerlegung zu verwenden. +Dann ist: +\rmvspace +\begin{align*} + ||Ax - b||_2 = ||U \Sigma V^H x - b||_2 = ||\Sigma V^H x - U^H b||_2 +\end{align*} + +\drmvspace +\innumpy verwendet \texttt{numpy.linalg.lstsq} die SVD für das Lösen + +\setLabelNumber{all}{15} +\fancydef{Pseudoinverse} $A^+ = (A^H A)^{-1} A^H = V_1 \Sigma_r^+ U_1^H$ + +Die drei bisher besprochenen Verfahren lassen sich in zwei Kategorien einordnen: +\begin{enumerate} + \item $A \in K^{m \times n}$ ist voll besetzt und $n$ ist klein ($m \gg n$) + \item $A \in K^{m \times n}$ ist dünn besetzt und $m, n$ sind gross +\end{enumerate} +Im ersten Fall wird aufgrund der numerischen Stabilität die $QR$ oder SVD-Methode verwendet. +Im zweiten Fall verwendet man die Normalengleichungen, da diese die Struktur der dünn besetzten Matrizen verwenden können. + +\begin{code}{python} +import numpy as np + +A = np.array([[98.269, 1.0], [0.0, 1.0], [-194.96, 1.0]]) +b = np.array([852.7, 624.5, 172.7]) + +def least_squares_svd(A, b, epsilon=1e-6): + U, s, Vh = np.linalg.svd(A) + r = 1 + np.where(s / s[0] > epsilon)[0].max() # numerical rank + y = np.dot(Vh[:r, :].T, np.dot(U[:, :r].T, b) / s[:r]) + return y + +# qr-decomposition: +def least_squares_qr(A, b): + Q, R = np.linalg.qr(A) + b_tilde = np.dot(Q.T, b) + return np.linalg.solve(R, b_tilde) + +np.linalg.lstsq(A, b) +\end{code} diff --git a/semester3/numcs/parts/05_curve-fitting/01_linear/03_total-curve-fitting.tex b/semester3/numcs/parts/05_curve-fitting/01_linear/03_total-curve-fitting.tex index e69de29..6c63585 100644 --- a/semester3/numcs/parts/05_curve-fitting/01_linear/03_total-curve-fitting.tex +++ b/semester3/numcs/parts/05_curve-fitting/01_linear/03_total-curve-fitting.tex @@ -0,0 +1,40 @@ +\subsubsection{Totale Ausgleichsrechnung} +Es kann vorkommen, dass sowohl die Matrix $A$, wie auch der Vektor $b$ fehlerhaft sind. +Dann ersetzen wir das System $Ax = b$ durch ein neues System $\hat{A}\hat{x} = \hat{b}$, +welches so nah wie möglich am ursprünglichen System liegt und so für welches gilt $\hat{b} \in \text{Bild}(\hat{A})$. + +Wir versuchen also die folgende Norm zu minimieren: +\begin{align*} + ||C - \hat{C}||_F + = + \left|\left| + \begin{bmatrix} + A & b + \end{bmatrix} + - + \begin{bmatrix} + \hat{A} & \hat{b} + \end{bmatrix} + \right|\right|_F +\end{align*} + +\drmvspace +Das Problem lässt sich umschreiben als +\rmvspace +\begin{align*} + \min_{\text{Rang}(\hat{C}) = n} ||C - \hat{C}||_F +\end{align*} + +\drmvspace +Theorem \ref{all:7-1-50} liefert die Lösung. Die Singulärwertzerlegung +\rmvspace +\begin{align*} + C = U\Sigma V^H = \sum_{j = 1}^{n + 1} \sigma_j (u)_j (v)_j^H +\end{align*} + +\drmvspace +gibt das Optimum +\rmvspace +\begin{align*} + \hat{C} = \sum_{j = 1}^{n} \sigma_j (u)_j (v)_j^H +\end{align*} diff --git a/semester3/numcs/parts/05_curve-fitting/02_non-linear/00_intro.tex b/semester3/numcs/parts/05_curve-fitting/02_non-linear/00_intro.tex index a6825c2..6834e37 100644 --- a/semester3/numcs/parts/05_curve-fitting/02_non-linear/00_intro.tex +++ b/semester3/numcs/parts/05_curve-fitting/02_non-linear/00_intro.tex @@ -1 +1,2 @@ +\newsection \subsection{Nichtlineare Ausgleichsrechnung} diff --git a/semester3/ti/parts/02_finite-automata/02_proofs-of-nonexistance.tex b/semester3/ti/parts/02_finite-automata/02_proofs-of-nonexistance.tex index e606dd2..116e6b7 100644 --- a/semester3/ti/parts/02_finite-automata/02_proofs-of-nonexistance.tex +++ b/semester3/ti/parts/02_finite-automata/02_proofs-of-nonexistance.tex @@ -43,8 +43,6 @@ Dies gilt jedoch nicht, weil für jedes $z = 1^i$ zwar jedes $0^i 1^i \in L$ gil Um die Nichtregularität konkreter Sprachen zu beweisen, sucht man nach einfach verifizierbaren Eigenschaften, denn wenn eine Sprache eine dieser Eigenschaften \textit{nicht} erfüllt, so ist sie nicht regulär. -% TODO: For Kolmogorov complexity elaborate some more, i.e. how to do proofs properly / how to derive a word more easily -% -> TA Slides explain that really well \vspace{0.3cm} \hrule