Push
This commit is contained in:
@@ -5,6 +5,11 @@ from Berechnungen import Berechnungen
|
||||
import numpy as np
|
||||
import importlib
|
||||
from Koordinatentransformationen import Transformationen
|
||||
from pathlib import Path
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import sympy as sp
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -28,9 +33,8 @@ class FunktionalesModell:
|
||||
def jacobi_matrix_symbolisch(self, datumsfestlegung = None, liste_unbekannte_datumsfestlegung = None):
|
||||
#liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel"]
|
||||
|
||||
liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel", "gnss_basislinien", "geometrisches_nivellement"]
|
||||
#liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel",
|
||||
# "gnss_basislinien"]
|
||||
#liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel", "gnss_basislinien", "geometrisches_nivellement"]
|
||||
liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel", "gnss_basislinien"]
|
||||
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
|
||||
|
||||
liste_beobachtungen_rohdaten_gnssbasislinien = []
|
||||
@@ -371,7 +375,7 @@ class FunktionalesModell:
|
||||
return A_gesamt, liste_unbekannte, liste_zeilenbeschriftungen_gesamt
|
||||
|
||||
|
||||
def jacobi_matrix_zahlen_iteration_0(self, A_symbolisch, koordinatenart, liste_unbekannte = None, liste_zeilenbeschriftungen_gesamt = None):
|
||||
def jacobi_matrix_zahlen_iteration_0(self, A_symbolisch, koordinatenart, liste_unbekannte = None, liste_zeilenbeschriftungen_gesamt = None, iterationsnummer = 0):
|
||||
self.liste_beobachtungsvektor_symbolisch = [str(x) for x in liste_zeilenbeschriftungen_gesamt]
|
||||
|
||||
if koordinatenart == "naeherung_us":
|
||||
@@ -385,13 +389,34 @@ class FunktionalesModell:
|
||||
cse=True
|
||||
)
|
||||
|
||||
fehlend = [s for s in self.liste_symbole_lambdify if s not in self.substitutionen_dict]
|
||||
if fehlend:
|
||||
Export.matrix_to_csv(
|
||||
r"Zwischenergebnisse\fehlende_substitutionen_A.csv",
|
||||
[""],
|
||||
[str(s) for s in fehlend],
|
||||
sp.Matrix([[str(s)] for s in fehlend]),
|
||||
"fehlend"
|
||||
)
|
||||
raise ValueError(f"Fehlende Substitutionen in A: {[str(s) for s in fehlend[:30]]}")
|
||||
|
||||
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
|
||||
#A_numerisch = sp.Matrix(self.func_A0(*liste_werte))
|
||||
A_numerisch = np.asarray(self.func_A0(*liste_werte), dtype=float)
|
||||
|
||||
Export.matrix_to_csv(r"Zwischenergebnisse\Jacobi_Matrix_Numerisch_Iteration0.csv", liste_unbekannte,
|
||||
Export.matrix_to_csv(fr"Zwischenergebnisse\{iterationsnummer}Jacobi_Matrix_Numerisch_Iteration0.csv", liste_unbekannte,
|
||||
liste_zeilenbeschriftungen_gesamt, A_numerisch, "Beobachtung")
|
||||
|
||||
condA = float(np.linalg.cond(A_numerisch))
|
||||
rankA = int(np.linalg.matrix_rank(A_numerisch))
|
||||
Export.matrix_to_csv(
|
||||
fr"Zwischenergebnisse\{iterationsnummer}_Jacobi_Matrix_Stats.csv",
|
||||
[""],
|
||||
["condA", "rankA"],
|
||||
np.array([[condA], [rankA]], dtype=float),
|
||||
"Wert"
|
||||
)
|
||||
|
||||
return A_numerisch
|
||||
else:
|
||||
print("Koordinaten noch nicht implementiert!")
|
||||
@@ -543,7 +568,7 @@ class FunktionalesModell:
|
||||
|
||||
return beobachtungsvektor_naeherung_symbolisch
|
||||
|
||||
def beobachtungsvektor_naeherung_numerisch_iteration0(self, liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_symbolisch):
|
||||
def beobachtungsvektor_naeherung_numerisch_iteration0(self, liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_symbolisch, iterationsnummer=0):
|
||||
#beobachtungsvektor_naeherung_numerisch_iteration0 = beobachtungsvektor_naeherung_symbolisch.xreplace(self.substitutionen_dict)
|
||||
if self.func_beob0 is None:
|
||||
#self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
|
||||
@@ -559,7 +584,7 @@ class FunktionalesModell:
|
||||
beobachtungsvektor_naeherung_numerisch_iteration0 = np.asarray(self.func_beob0(*liste_werte),
|
||||
dtype=float).reshape(-1, 1)
|
||||
|
||||
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Näherung_Numerisch_Iteration0.csv", [""],
|
||||
Export.matrix_to_csv(fr"Zwischenergebnisse\{iterationsnummer}_Beobachtungsvektor_Näherung_Numerisch_Iteration0.csv", [""],
|
||||
liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_numerisch_iteration0,
|
||||
"Beobachtungsvektor")
|
||||
|
||||
@@ -571,23 +596,29 @@ class FunktionalesModell:
|
||||
"Unbekanntenvektor")
|
||||
return(unbekanntenvektor_symbolisch)
|
||||
|
||||
def unbekanntenvektor_numerisch(self, liste_unbekanntenvektor_symbolisch, unbekanntenvektor_symbolisch, dX_Vektor = None, unbekanntenvektor_neumerisch_vorherige_Iteration = None):
|
||||
if not hasattr(self, "liste_unbekanntenvektor_symbolisch"):
|
||||
self.liste_unbekanntenvektor_symbolisch = liste_unbekanntenvektor_symbolisch
|
||||
def unbekanntenvektor_numerisch(self, liste_unbekanntenvektor_symbolisch, unbekanntenvektor_symbolisch, dX_Vektor = None, unbekanntenvektor_neumerisch_vorherige_Iteration = None, iterationsnummer=0):
|
||||
self.liste_unbekanntenvektor_symbolisch = liste_unbekanntenvektor_symbolisch
|
||||
|
||||
#if not hasattr(self, "liste_unbekanntenvektor_symbolisch"):
|
||||
# self.liste_unbekanntenvektor_symbolisch = liste_unbekanntenvektor_symbolisch
|
||||
|
||||
if dX_Vektor is None and unbekanntenvektor_neumerisch_vorherige_Iteration is None:
|
||||
#unbekanntenvektor_numerisch = unbekanntenvektor_symbolisch.xreplace(self.substitutionen_dict)
|
||||
if self.func_u0 is None:
|
||||
self.func_u0 = sp.lambdify(
|
||||
self.liste_symbole_lambdify,
|
||||
unbekanntenvektor_symbolisch,
|
||||
modules="numpy",
|
||||
cse=True
|
||||
)
|
||||
#if self.func_u0 is None:
|
||||
# self.func_u0 = sp.lambdify(
|
||||
# self.liste_symbole_lambdify,
|
||||
# unbekanntenvektor_symbolisch,
|
||||
# modules="numpy",
|
||||
# cse=True
|
||||
# )
|
||||
unbekanntenvektor_numerisch = np.asarray(
|
||||
[[float(self.substitutionen_dict[sym])] for sym in self.liste_unbekanntenvektor_symbolisch],
|
||||
dtype=float
|
||||
).reshape(-1, 1)
|
||||
|
||||
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
|
||||
#liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
|
||||
#unbekanntenvektor_numerisch = sp.Matrix(self.func_u0(*liste_werte))
|
||||
unbekanntenvektor_numerisch = np.asarray(self.func_u0(*liste_werte), dtype=float).reshape(-1, 1)
|
||||
#unbekanntenvektor_numerisch = np.asarray(self.func_u0(*liste_werte), dtype=float).reshape(-1, 1)
|
||||
|
||||
|
||||
else:
|
||||
@@ -595,38 +626,57 @@ class FunktionalesModell:
|
||||
unbekanntenvektor_neumerisch_vorherige_Iteration = np.asarray(
|
||||
unbekanntenvektor_neumerisch_vorherige_Iteration, dtype=float).reshape(-1, 1)
|
||||
dX_Vektor = np.asarray(dX_Vektor, dtype=float).reshape(-1, 1)
|
||||
|
||||
unbekanntenvektor_numerisch = unbekanntenvektor_neumerisch_vorherige_Iteration + dX_Vektor
|
||||
|
||||
self.substitutionen_dict = self.dict_substitutionen_uebergeordnetes_system(unbekanntenvektor_numerisch)
|
||||
|
||||
Export.matrix_to_csv(r"Zwischenergebnisse\Unbekanntenvektor_Numerisch_Iteration0.csv", [""],
|
||||
Export.matrix_to_csv(fr"Zwischenergebnisse\{iterationsnummer}_Unbekanntenvektor_Numerisch_Iteration0.csv", [""],
|
||||
liste_unbekanntenvektor_symbolisch, unbekanntenvektor_numerisch,
|
||||
"Unbekanntenvektor")
|
||||
return unbekanntenvektor_numerisch
|
||||
|
||||
def unbekanntenvektor_numerisch_to_dict_unbekanntenvektor(self, liste_unbekanntenvektor_symbolisch, unbekanntenvektor_numerisch):
|
||||
dict_unbekanntenvektor_numerisch = {}
|
||||
index = 0
|
||||
#index = 0
|
||||
|
||||
unbekanntenvektor_numerisch = np.asarray(unbekanntenvektor_numerisch, dtype=float).reshape(-1, 1)
|
||||
|
||||
for symbol in liste_unbekanntenvektor_symbolisch:
|
||||
name = str(symbol)
|
||||
if not name.startswith("X"):
|
||||
idx = {str(sym): i for i, sym in enumerate(liste_unbekanntenvektor_symbolisch)}
|
||||
|
||||
punktnummern = []
|
||||
for sym in liste_unbekanntenvektor_symbolisch:
|
||||
name = str(sym)
|
||||
if name.startswith("X"):
|
||||
pn = name[1:]
|
||||
if pn not in punktnummern:
|
||||
punktnummern.append(pn)
|
||||
|
||||
dict_koordinaten = {}
|
||||
for pn in punktnummern:
|
||||
iX = idx.get(f"X{pn}", None)
|
||||
iY = idx.get(f"Y{pn}", None)
|
||||
iZ = idx.get(f"Z{pn}", None)
|
||||
|
||||
if iX is None or iY is None or iZ is None:
|
||||
continue
|
||||
|
||||
punktnummer = str(name[1:])
|
||||
|
||||
dict_unbekanntenvektor_numerisch[punktnummer] = sp.Matrix([
|
||||
float(unbekanntenvektor_numerisch[index, 0]),
|
||||
float(unbekanntenvektor_numerisch[index + 1, 0]),
|
||||
float(unbekanntenvektor_numerisch[index + 2, 0])
|
||||
dict_koordinaten[pn] = sp.Matrix([
|
||||
float(unbekanntenvektor_numerisch[iX, 0]),
|
||||
float(unbekanntenvektor_numerisch[iY, 0]),
|
||||
float(unbekanntenvektor_numerisch[iZ, 0]),
|
||||
])
|
||||
index += 3
|
||||
return dict_unbekanntenvektor_numerisch
|
||||
|
||||
#dict_unbekanntenvektor_numerisch[punktnummer] = sp.Matrix([
|
||||
# float(unbekanntenvektor_numerisch[index, 0]),
|
||||
# float(unbekanntenvektor_numerisch[index + 1, 0]),
|
||||
# float(unbekanntenvektor_numerisch[index + 2, 0])
|
||||
#])
|
||||
#index += 3
|
||||
return dict_koordinaten
|
||||
|
||||
def berechnung_dl(self, beobachtungsvektor_numerisch, beobachtungsvektor_naeherung_numerisch,
|
||||
liste_beobachtungsvektor_symbolisch=None):
|
||||
liste_beobachtungsvektor_symbolisch=None, iterationsnummer=0):
|
||||
dl = beobachtungsvektor_numerisch - beobachtungsvektor_naeherung_numerisch
|
||||
dl = np.asarray(dl, dtype=float)
|
||||
|
||||
@@ -637,6 +687,14 @@ class FunktionalesModell:
|
||||
if "_R_" in str(name):
|
||||
dl[i] = np.arctan2(np.sin(dl[i]), np.cos(dl[i]))
|
||||
|
||||
Export.matrix_to_csv(
|
||||
fr"Zwischenergebnisse\{iterationsnummer}_dl.csv",
|
||||
[""],
|
||||
liste_beobachtungsvektor_symbolisch,
|
||||
dl.reshape(-1, 1),
|
||||
"dl"
|
||||
)
|
||||
|
||||
return dl
|
||||
|
||||
def dict_substitutionen_uebergeordnetes_system(self, unbekanntenvektor_aus_iteration = None):
|
||||
@@ -661,8 +719,18 @@ class FunktionalesModell:
|
||||
dict_koordinaten_xyz_kopie = {pn: [v[0], v[1], v[2]] for pn, v in dict_koordinaten.items()}
|
||||
dict_koordinaten_B_L = berechnungen.geometrische_breite_laenge(dict_koordinaten_xyz_kopie)
|
||||
|
||||
punktnummern_niv = set()
|
||||
for beobachtungenID, pn_sp, pn_zp, niv_dh, niv_strecke, niv_anz_standpkte in liste_beobachtungen_nivellemente:
|
||||
punktnummern_niv.add(str(pn_sp).strip())
|
||||
punktnummern_niv.add(str(pn_zp).strip())
|
||||
|
||||
dict_koordinaten_niv = {}
|
||||
for pn in punktnummern_niv:
|
||||
if pn in dict_koordinaten:
|
||||
dict_koordinaten_niv[pn] = dict_koordinaten[pn]
|
||||
|
||||
dict_koordinaten_utm = self.trafos.ecef_to_utm(
|
||||
dict_koordinaten,
|
||||
dict_koordinaten_niv,
|
||||
self.pfad_tif_quasigeoidundolation)
|
||||
|
||||
substitutionen = {}
|
||||
|
||||
Reference in New Issue
Block a user