Push
This commit is contained in:
@@ -8,123 +8,9 @@ import Datumsfestlegung
|
||||
import numpy as np
|
||||
|
||||
|
||||
def ausgleichung_global(A, dl, Q_ext, P):
|
||||
"""
|
||||
Führt eine Ausgleichung nach kleinsten Quadraten durch.
|
||||
|
||||
Aus der Designmatrix A, dem Verbesserungsvektor dl und der Gewichtsmatrix P wird das Normalgleichungssystem
|
||||
aufgestellt und gelöst. Anschließend werden Residuen sowie Kofaktor-Matrizen der Unbekannten und Beobachtungen berechnet.
|
||||
|
||||
Es werden folgende Berechnungsschitte durchgeführt:
|
||||
|
||||
1) Normalgleichungsmatrix N = Aᵀ · P · A und Absolutglied n = Aᵀ · P · dl
|
||||
2) Lösung dx = N⁻¹ · n
|
||||
3) Residuen v = A · dx − dl
|
||||
4) Kofaktormatrix der Unbekannten Q_xx
|
||||
5) Kofaktormatrix der ausgeglichenen Beobachtungen Q_ll_dach
|
||||
6) Kofaktormatrix der Verbesserungen Q_vv
|
||||
|
||||
:param A: Jacobi-Matrix (A-Matrix).
|
||||
:type A: array_like
|
||||
:param dl: Verbesserungsvektor bzw. Beobachtungsabweichungen.
|
||||
:type dl: array_like
|
||||
:param Q_ext: a-priori Kofaktormatrix der Beobachtungen.
|
||||
:type Q_ext: array_like
|
||||
:param P: Gewichtsmatrix der Beobachtungen.
|
||||
:type P: array_like
|
||||
:return: Dictionary mit Ausgleichungsergebnissen, Zuschlagsvektor dx.
|
||||
:rtype: tuple[dict[str, Any], numpy.ndarray]
|
||||
:raises numpy.linalg.LinAlgError: Wenn das Normalgleichungssystem singulär ist und nicht gelöst werden kann.
|
||||
"""
|
||||
A=np.asarray(A, float)
|
||||
dl = np.asarray(dl, float).reshape(-1, 1)
|
||||
Q_ext = np.asarray(Q_ext, float)
|
||||
P = np.asarray(P, float)
|
||||
|
||||
# 1) Gewichtsmatrix P
|
||||
#P = Q_ext
|
||||
|
||||
# 2) Normalgleichungsmatrix N und Absolutgliedvektor n
|
||||
N = A.T @ P @ A
|
||||
n = A.T @ P @ dl
|
||||
|
||||
# 3) Zuschlagsvektor dx
|
||||
dx = np.linalg.solve(N, n)
|
||||
|
||||
# 4) Residuenvektor v
|
||||
v = A @ dx - dl
|
||||
|
||||
# 5) Kofaktormatrix der Unbekannten Q_xx
|
||||
Q_xx = StochastischesModell.berechne_Q_xx(N)
|
||||
|
||||
# 6) Kofaktormatrix der Beobachtungen Q_ll_dach
|
||||
Q_ll_dach = StochastischesModell.berechne_Q_ll_dach(A, Q_xx)
|
||||
|
||||
# 7) Kofaktormatrix der Verbesserungen Q_vv
|
||||
Q_vv = StochastischesModell.berechne_Qvv(Q_ext, Q_ll_dach)
|
||||
|
||||
# 8) Ausgabe
|
||||
dict_ausgleichung = {
|
||||
"dx": dx,
|
||||
"v": v,
|
||||
"P": P,
|
||||
"N": N,
|
||||
"Q_xx": Q_xx,
|
||||
"Q_ll_dach": Q_ll_dach,
|
||||
"Q_vv": Q_vv,
|
||||
"Q_ext": Q_ext,
|
||||
}
|
||||
return dict_ausgleichung, dx
|
||||
|
||||
|
||||
|
||||
def ausgleichung_lokal(A, dl, Q_ll):
|
||||
A = np.asarray(A, dtype=float)
|
||||
dl = np.asarray(dl, dtype=float).reshape(-1, 1)
|
||||
Q_ll = np.asarray(Q_ll, dtype=float)
|
||||
|
||||
# 1) Gewichtsmatrix
|
||||
P = np.linalg.inv(Q_ll)
|
||||
|
||||
# 2) Normalgleichungen
|
||||
N = A.T @ P @ A
|
||||
n = A.T @ P @ dl
|
||||
|
||||
# 3) Datumsfestlegung
|
||||
G = Datumsfestlegung.build_G_from_names(x0, Jacobimatrix_symbolisch_liste_unbekannte, liste_punktnummern, mit_massstab=True)
|
||||
u = A.shape[1]
|
||||
aktive = Datumsfestlegung.aktive_indices_from_selection(auswahl, Jacobimatrix_symbolisch_liste_unbekannte)
|
||||
E = Datumsfestlegung.auswahlmatrix_E(u, aktive)
|
||||
Gi = E @ G
|
||||
|
||||
# 3) Zuschlagsvektor dx
|
||||
dx, k = Datumsfestlegung.berechne_dx_geraendert(N, n, Gi)
|
||||
|
||||
# 5) Residuen
|
||||
v = dl - A @ dx
|
||||
|
||||
# 5) Kofaktormatrix der Unbekannten Q_xx
|
||||
Q_xx = StochastischesModell.berechne_Q_xx(N)
|
||||
|
||||
# 6) Kofaktormatrix der Beobachtungen Q_ll_dach
|
||||
Q_ll_dach = StochastischesModell.berechne_Q_ll_dach(A, Q_xx)
|
||||
|
||||
# 7) Kofaktormatrix der Verbesserungen Q_vv
|
||||
Q_vv = StochastischesModell.berechne_Qvv(Q_ll, Q_ll_dach)
|
||||
|
||||
# 8) Ausgabe
|
||||
dict_ausgleichung = {
|
||||
"dx": dx,
|
||||
"v": v,
|
||||
"P": P,
|
||||
"N": N,
|
||||
"Q_xx": Q_xx,
|
||||
"Q_ll_dach": Q_ll_dach,
|
||||
"Q_vv": Q_vv,
|
||||
"Q_ll": Q_ll,
|
||||
}
|
||||
return dict_ausgleichung, dx
|
||||
|
||||
|
||||
class Iterationen:
|
||||
"""Iterative Ausgleichung auf Basis des funktionalen und stochastischen Modells.
|
||||
@@ -167,6 +53,75 @@ class Iterationen:
|
||||
self.fm = Funktionales_Modell.FunktionalesModell(self.pfad_datenbank, self.a, self.b, self.pfad_tif_quasigeoidundolation)
|
||||
|
||||
|
||||
def ausgleichung_global(self, A, dl, Q_ext, P):
|
||||
"""
|
||||
Führt eine Ausgleichung nach kleinsten Quadraten durch.
|
||||
|
||||
Aus der Designmatrix A, dem Verbesserungsvektor dl und der Gewichtsmatrix P wird das Normalgleichungssystem
|
||||
aufgestellt und gelöst. Anschließend werden Residuen sowie Kofaktor-Matrizen der Unbekannten und Beobachtungen berechnet.
|
||||
|
||||
Es werden folgende Berechnungsschitte durchgeführt:
|
||||
|
||||
1) Normalgleichungsmatrix N = Aᵀ · P · A und Absolutglied n = Aᵀ · P · dl
|
||||
2) Lösung dx = N⁻¹ · n
|
||||
3) Residuen v = A · dx − dl
|
||||
4) Kofaktormatrix der Unbekannten Q_xx
|
||||
5) Kofaktormatrix der ausgeglichenen Beobachtungen Q_ll_dach
|
||||
6) Kofaktormatrix der Verbesserungen Q_vv
|
||||
|
||||
:param A: Jacobi-Matrix (A-Matrix).
|
||||
:type A: array_like
|
||||
:param dl: Verbesserungsvektor bzw. Beobachtungsabweichungen.
|
||||
:type dl: array_like
|
||||
:param Q_ext: a-priori Kofaktormatrix der Beobachtungen.
|
||||
:type Q_ext: array_like
|
||||
:param P: Gewichtsmatrix der Beobachtungen.
|
||||
:type P: array_like
|
||||
:return: Dictionary mit Ausgleichungsergebnissen, Zuschlagsvektor dx.
|
||||
:rtype: tuple[dict[str, Any], numpy.ndarray]
|
||||
:raises numpy.linalg.LinAlgError: Wenn das Normalgleichungssystem singulär ist und nicht gelöst werden kann.
|
||||
"""
|
||||
A = np.asarray(A, float)
|
||||
dl = np.asarray(dl, float).reshape(-1, 1)
|
||||
Q_ext = np.asarray(Q_ext, float)
|
||||
P = np.asarray(P, float)
|
||||
|
||||
# 1) Gewichtsmatrix P
|
||||
# P = Q_ext
|
||||
|
||||
# 2) Normalgleichungsmatrix N und Absolutgliedvektor n
|
||||
N = A.T @ P @ A
|
||||
n = A.T @ P @ dl
|
||||
|
||||
# 3) Zuschlagsvektor dx
|
||||
dx = np.linalg.solve(N, n)
|
||||
|
||||
# 4) Residuenvektor v
|
||||
v = A @ dx - dl
|
||||
|
||||
# 5) Kofaktormatrix der Unbekannten Q_xx
|
||||
Q_xx = StochastischesModell.berechne_Q_xx(N)
|
||||
|
||||
# 6) Kofaktormatrix der Beobachtungen Q_ll_dach
|
||||
Q_ll_dach = StochastischesModell.berechne_Q_ll_dach(A, Q_xx)
|
||||
|
||||
# 7) Kofaktormatrix der Verbesserungen Q_vv
|
||||
Q_vv = StochastischesModell.berechne_Qvv(Q_ext, Q_ll_dach)
|
||||
|
||||
# 8) Ausgabe
|
||||
dict_ausgleichung = {
|
||||
"dx": dx,
|
||||
"v": v,
|
||||
"P": P,
|
||||
"N": N,
|
||||
"Q_xx": Q_xx,
|
||||
"Q_ll_dach": Q_ll_dach,
|
||||
"Q_vv": Q_vv,
|
||||
"Q_ext": Q_ext,
|
||||
}
|
||||
return dict_ausgleichung, dx
|
||||
|
||||
|
||||
def iterationen(self, datumfestlegung: str, speichern_in_csv: bool) -> tuple[np.ndarray, list, list, np.ndarray, np.ndarray, np.ndarray, dict]:
|
||||
"""Führt die iterative Ausgleichung (Parameterschätzung) aus und gibt die Ergebnisse zurück.
|
||||
|
||||
@@ -365,7 +320,7 @@ class Iterationen:
|
||||
dl_k = np.asarray(dl_k, float)
|
||||
|
||||
# Parameterschätzung für die aktuelle Iteration berechnen
|
||||
ausgabe_parameterschaetzung, dx = Parameterschaetzung.ausgleichung_global(A_matrix_numerisch, dl_k, Q_k, P)
|
||||
ausgabe_parameterschaetzung, dx = self.ausgleichung_global(A_matrix_numerisch, dl_k, Q_k, P)
|
||||
dx = np.asarray(dx, float).reshape(-1, 1)
|
||||
|
||||
# Matrizen je Iteration als CSV-Datei speichern
|
||||
|
||||
Reference in New Issue
Block a user