Push 05.02.2026

This commit is contained in:
2026-02-05 12:52:27 +01:00
parent 5842255a6a
commit e0796deec6
15 changed files with 38386 additions and 1765 deletions

View File

@@ -9,6 +9,32 @@ class Datumsfestlegung:
@staticmethod
def weiches_datum(Q_ll: np.ndarray, Q_AA: np.ndarray, varianzkompontenschaetzung_erfolgt: bool,
dict_indizes_beobachtungsgruppen: dict) -> np.ndarray:
"""
Erstellt die erweiterte Kofaktor- und Gewichtsmatrix für eine weiche Datumsfestlegung.
Aus den Kofaktormatrizen der Beobachtungen Q_ll und der Kofaktormatrix der Anschlusspunkte Q_AA
wird eine erweiterte Kofaktormatrix Q_ext aufgebaut. Zusätzlich wird die zugehörige Gewichtsmatrix P erzeugt.
Falls keine Varianzkomponentenschätzung durchgeführt wurde, wird P als Blockmatrix aus den
Inversen (Gewichten) von Q_ll und Q_AA aufgebaut.
Falls eine Varianzkomponentenschätzung durchgeführt wurde, wird Q_ext entsprechend den in definierten
Beobachtungsgruppen in Teilblöcke zerlegt (z.B. SD, R, ZW, gnss, niv, lA). Für jeden Block wird die Gewichtsmatrix
berechnet und anschließend zu einer Gesamtgewichtsmatrix zusammengesetzt.
:param Q_ll: a-priori Kofaktormatrix der Beobachtungen.
:type Q_ll: numpy.ndarray
:param Q_AA: a-priori Kofaktormatrix der Anschlusspunkte.
:type Q_AA: numpy.ndarray
:param varianzkompontenschaetzung_erfolgt: Kennzeichen, ob eine Varianzkomponentenschätzung berücksichtigt werden soll.
:type varianzkompontenschaetzung_erfolgt: bool
:param dict_indizes_beobachtungsgruppen: Dictionary mit Indexbereichen je Beobachtungsgruppe zur Blockzerlegung.
:type dict_indizes_beobachtungsgruppen: dict
:return: Tuple aus erweiterter Kofaktormatrix Q_ext und zugehöriger Gewichtsmatrix P.
:rtype: tuple[numpy.ndarray, numpy.ndarray]
:raises ValueError: Wenn Q_ll oder Q_AA keine quadratische Matrix ist.
"""
if Stochastisches_Modell.StochastischesModell.berechne_P(Q_ll).ndim != 2 or \
Stochastisches_Modell.StochastischesModell.berechne_P(Q_ll).shape[0] != \
Stochastisches_Modell.StochastischesModell.berechne_P(Q_ll).shape[1]:
@@ -95,21 +121,37 @@ class Datumsfestlegung:
Z(aufgeteilt_lA_invertiert, aufgeteilt_gnss_invertiert),
Z(aufgeteilt_lA_invertiert, aufgeteilt_niv_invertiert), aufgeteilt_lA_invertiert]
])
# print(aufgeteilt)
# print(beobachtungsgruppe, indizes)
# Export.matrix_to_csv(
# fr"Zwischenergebnisse\_{beobachtungsgruppe}.csv",
# [""],
# labels,
# aufgeteilt,
# f"{beobachtungsgruppe}"
# )
return Q_ext, P
@staticmethod
def indizes_beobachtungsvektor_nach_beobachtungsgruppe(Jacobimatrix_symbolisch_liste_beobachtungsvektor):
"""
Ermittelt Indexbereiche des Beobachtungsvektors getrennt nach Beobachtungsgruppen.
Die Funktion analysiert die Bezeichner des symbolischen Beobachtungsvektors (z.B.
aus der Jacobi-Matrix) und ordnet jede Beobachtung anhand ihres Kennzeichens
(Beobachtungsart) einer Gruppe zu. Für jede Beobachtungsgruppe wird anschließend
der minimale und maximale Index im Beobachtungsvektor bestimmt.
Unterstützte Beobachtungsgruppen sind u.a.:
- SD : Tachymeter-Strecken,
- R : Tachymeter-Richtungen,
- ZW : Tachymeter-Zenitwinkel,
- gnss: GNSS-Basislinienkomponenten (bx/by/bz),
- niv : Geometrisches Nivellement,
- lA : Pseudobeobachtungen.
Die zurückgegebenen Indexbereiche dienen insbesondere zur Blockzerlegung von
Kofaktor- oder Gewichtsmatrizen (z.B. bei Varianzkomponentenschätzung oder
weicher Datumsfestlegung).
:param Jacobimatrix_symbolisch_liste_beobachtungsvektor: Liste der Beobachtungen.
:type Jacobimatrix_symbolisch_liste_beobachtungsvektor: list
:return: Dictionary mit Indexbereichen je Beobachtungsgruppe.
:rtype: dict
:raises ValueError: Wenn für eine Beobachtungsgruppe keine Indizes ermittelt werden können.
"""
liste_strecken_indizes = []
liste_richtungen_indizes = []
liste_zenitwinkel_indizes = []
@@ -156,7 +198,7 @@ class Datumsfestlegung:
return names, {n: i for i, n in enumerate(names)}
@staticmethod
def build_G_from_names(x0, unbekannten_liste, liste_punktnummern=None, mit_massstab=True):
def erstelle_G(x0, unbekannten_liste, liste_punktnummern=None, mit_massstab=True):
"""
Baut G (u x d) in den vollen Unbekanntenraum.
Wenn liste_punktnummern=None, werden alle Punkt-IDs aus unbekannten_liste
@@ -235,11 +277,8 @@ class Datumsfestlegung:
return E
def loese_geraendert_mit_Qxx(N, n, G):
"""
löst [N G; G^T 0] [dx;k] = [n;0]
und liefert zusätzlich Q_xx als oberen linken Block von inv(K).
"""
def berechne_dx(N, n, G):
N = np.asarray(N, float)
n = np.asarray(n, float).reshape(-1, 1)
G = np.asarray(G, float)