[NumCS] Linear curve fitting

This commit is contained in:
2025-12-22 11:56:55 +01:00
parent b0bdb10a71
commit 9f908784dc
7 changed files with 99 additions and 4 deletions

Binary file not shown.

View File

@@ -33,7 +33,6 @@
\vspace{4cm} \vspace{4cm}
\begin{center} \begin{center}
\begin{Large} \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{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} \quote{Wenn ich keine Lust habe, das zu berechnen, dann wende ich einfach Gewalt an}
\end{Large} \end{Large}

View File

@@ -37,3 +37,6 @@ $B_a =
A^H & 0 A^H & 0
\end{bmatrix} \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

View File

@@ -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}

View File

@@ -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*}

View File

@@ -1 +1,2 @@
\newsection
\subsection{Nichtlineare Ausgleichsrechnung} \subsection{Nichtlineare Ausgleichsrechnung}

View File

@@ -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, 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. 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} \vspace{0.3cm}
\hrule \hrule