287 lines
14 KiB
Python
287 lines
14 KiB
Python
from Datenbank import *
|
|
import sympy as sp
|
|
from Export import Export
|
|
from Berechnungen import Berechnungen
|
|
|
|
|
|
class FunktionalesModell:
|
|
def __init__(self, pfad_datenbank, a, b):
|
|
self.pfad_datenbank = pfad_datenbank
|
|
self.berechnungen = Berechnungen(a, b)
|
|
self.substitutionen_dict = self.dict_substitutionen_naeherungen_us()
|
|
self.dict_punkt_symbole = {}
|
|
|
|
def jacobi_matrix_symbolisch(self):
|
|
#liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel"]
|
|
liste_beobachtungsarten = ["tachymeter_distanz"]
|
|
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
|
|
|
|
liste_beobachtungen_rohdaten = []
|
|
liste_punktnummern =[]
|
|
|
|
liste_orientierungsunbekannte = []
|
|
|
|
for beobachtungsart in liste_beobachtungsarten:
|
|
liste_id_standpunkt_zielpunkt = db_zugriff.get_beobachtungen_id_beobachtungsgruppe_standpunkt_zielpunkt(beobachtungsart)
|
|
|
|
for beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
|
|
liste_beobachtungen_rohdaten.append(
|
|
(beobachtungsart, beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt)
|
|
)
|
|
|
|
if standpunkt not in liste_punktnummern:
|
|
liste_punktnummern.append(standpunkt)
|
|
if zielpunkt not in liste_punktnummern:
|
|
liste_punktnummern.append(zielpunkt)
|
|
|
|
if beobachtungsart == "tachymeter_richtung":
|
|
if beobachtungsgruppeID not in liste_orientierungsunbekannte:
|
|
liste_orientierungsunbekannte.append(beobachtungsgruppeID)
|
|
if liste_beobachtungen_rohdaten == []:
|
|
return None
|
|
|
|
#dict_punkt_symbole = {}
|
|
liste_unbekannte = []
|
|
|
|
for punkt in liste_punktnummern:
|
|
X, Y, Z = sp.symbols(f"X{punkt} Y{punkt} Z{punkt}")
|
|
self.dict_punkt_symbole[punkt] = (X, Y, Z)
|
|
liste_unbekannte.append(X)
|
|
liste_unbekannte.append(Y)
|
|
liste_unbekannte.append(Z)
|
|
|
|
dict_orientierung_symbole = {}
|
|
for orientierungsunbekannte in liste_orientierungsunbekannte:
|
|
O = sp.symbols(f"O{orientierungsunbekannte}")
|
|
dict_orientierung_symbole[orientierungsunbekannte] = O
|
|
liste_unbekannte.append(O)
|
|
|
|
liste_beobachtungsgleichungen_distanz =[]
|
|
liste_zeilenbeschriftungen_distanz = []
|
|
|
|
liste_A_richtung_zeilen = []
|
|
liste_zeilenbeschriftungen_richtung = []
|
|
|
|
for beobachtungsart, beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt in liste_beobachtungen_rohdaten:
|
|
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
|
|
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
|
|
B_sp, L_sp = sp.symbols(f"B{standpunkt} L{standpunkt}")
|
|
alpha = sp.symbols(f"{beobachtungenID}_R_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
zw = sp.symbols(f"{beobachtungenID}_ZW_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
s = sp.symbols(f"{beobachtungenID}_SD_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
|
|
if beobachtungsart == "tachymeter_distanz":
|
|
beobachtungsgleichung = sp.sqrt(
|
|
(X_zp - X_sp) ** 2
|
|
+ (Y_zp - Y_sp) ** 2
|
|
+ (Z_zp - Z_sp) ** 2
|
|
)
|
|
liste_beobachtungsgleichungen_distanz.append(beobachtungsgleichung)
|
|
liste_zeilenbeschriftungen_distanz.append(f"{beobachtungenID}_SD_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
|
|
if beobachtungsart == "tachymeter_richtung":
|
|
#for beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
|
|
d_r_dX_zp = ((sp.sin(B_sp)*sp.cos(L_sp)*sp.sin(alpha) - sp.sin(L_sp)*sp.cos(alpha)) / (s * sp.sin(zw)))
|
|
d_r_dX_sp = - d_r_dX_zp
|
|
d_r_dY_zp = ((sp.sin(B_sp)*sp.sin(L_sp)*sp.sin(alpha) + sp.cos(L_sp)*sp.cos(alpha)) / (s * sp.sin(zw)))
|
|
d_r_dY_sp = - d_r_dY_zp
|
|
d_r_dZ_zp = ((-sp.cos(B_sp) * sp.sin(alpha) / (s * sp.sin(zw))))
|
|
d_r_dZ_sp = - d_r_dZ_zp
|
|
d_r_dO_sp = -1
|
|
|
|
zeile_A_Matrix = []
|
|
for punkt in liste_punktnummern:
|
|
if punkt == standpunkt:
|
|
zeile_A_Matrix.extend([d_r_dX_sp, d_r_dY_sp, d_r_dZ_sp])
|
|
elif punkt == zielpunkt:
|
|
zeile_A_Matrix.extend([d_r_dX_zp, d_r_dY_zp, d_r_dZ_zp])
|
|
else:
|
|
zeile_A_Matrix.extend([0, 0, 0])
|
|
|
|
for orientierung in liste_orientierungsunbekannte:
|
|
if orientierung == beobachtungsgruppeID:
|
|
zeile_A_Matrix.append(d_r_dO_sp)
|
|
else:
|
|
zeile_A_Matrix.append(0)
|
|
|
|
liste_A_richtung_zeilen.append(zeile_A_Matrix)
|
|
liste_zeilenbeschriftungen_richtung.append(
|
|
f"{beobachtungenID}_R_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}"
|
|
)
|
|
|
|
if beobachtungsart == "tachymeter_zenitwinkel":
|
|
d_r_dX_zp = ((X_zp - X_sp) * sp.cos(zw) - s * sp.cos(B_sp) * sp.cos(L_sp)) / (s ** 2 * sp.sin(zw))
|
|
d_r_dX_sp = - d_r_dX_zp
|
|
d_r_dY_zp = ((Y_zp - Y_sp) * sp.cos(zw) - s * sp.cos(B_sp) * sp.sin(L_sp)) / (s ** 2 * sp.sin(zw))
|
|
d_r_dY_sp = - d_r_dY_zp
|
|
d_r_dZ_zp = ((Z_zp - Z_sp) * sp.cos(zw) - s * sp.sin(B_sp)) / (s ** 2 * sp.sin(zw))
|
|
d_r_dZ_sp = - d_r_dZ_zp
|
|
|
|
zeile_A_Matrix = []
|
|
for punkt in liste_punktnummern:
|
|
if punkt == standpunkt:
|
|
zeile_A_Matrix.extend([d_r_dX_sp, d_r_dY_sp, d_r_dZ_sp])
|
|
elif punkt == zielpunkt:
|
|
zeile_A_Matrix.extend([d_r_dX_zp, d_r_dY_zp, d_r_dZ_zp])
|
|
else:
|
|
zeile_A_Matrix.extend([0, 0, 0])
|
|
|
|
for orientierung in liste_orientierungsunbekannte:
|
|
zeile_A_Matrix.append(0)
|
|
|
|
liste_A_richtung_zeilen.append(zeile_A_Matrix)
|
|
liste_zeilenbeschriftungen_richtung.append(
|
|
f"{beobachtungenID}_ZW_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}"
|
|
)
|
|
|
|
if liste_beobachtungsgleichungen_distanz:
|
|
f_matrix_dist = sp.Matrix(liste_beobachtungsgleichungen_distanz)
|
|
unbekanntenvektor = sp.Matrix(liste_unbekannte)
|
|
A_dist = f_matrix_dist.jacobian(unbekanntenvektor)
|
|
else:
|
|
A_dist = None
|
|
|
|
if liste_A_richtung_zeilen:
|
|
A_richtung = sp.Matrix(liste_A_richtung_zeilen)
|
|
else:
|
|
A_richtung = None
|
|
|
|
if A_dist is not None and A_richtung is not None:
|
|
A_gesamt = A_dist.col_join(A_richtung)
|
|
liste_zeilenbeschriftungen_gesamt = (
|
|
liste_zeilenbeschriftungen_distanz + liste_zeilenbeschriftungen_richtung
|
|
)
|
|
elif A_dist is not None:
|
|
A_gesamt = A_dist
|
|
liste_zeilenbeschriftungen_gesamt = liste_zeilenbeschriftungen_distanz
|
|
elif A_richtung is not None:
|
|
A_gesamt = A_richtung
|
|
liste_zeilenbeschriftungen_gesamt = liste_zeilenbeschriftungen_richtung
|
|
else:
|
|
return None
|
|
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Jacobi_Matrix_Symbolisch.csv", liste_unbekannte,
|
|
liste_zeilenbeschriftungen_gesamt, A_gesamt, "Beobachtung")
|
|
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):
|
|
|
|
if koordinatenart == "naeherung_us":
|
|
A_numerisch = A_symbolisch.xreplace(self.substitutionen_dict)
|
|
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Jacobi_Matrix_Numerisch_Iteration0.csv", liste_unbekannte,
|
|
liste_zeilenbeschriftungen_gesamt, A_numerisch, "Beobachtung")
|
|
|
|
return A_numerisch
|
|
else:
|
|
print("Koordinaten noch nicht implementiert!")
|
|
|
|
def beobachtungsvektor_numerisch(self, liste_beobachtungsvektor_symbolisch):
|
|
liste_beobachtungsvektor_numerisch = []
|
|
for beobachtung_symbolisch in liste_beobachtungsvektor_symbolisch:
|
|
liste_beobachtungsvektor_numerisch.append(self.substitutionen_dict[sp.Symbol(beobachtung_symbolisch)])
|
|
|
|
beobachtungsvektor_numerisch = sp.Matrix(liste_beobachtungsvektor_numerisch)
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Numerisch.csv", [""], liste_beobachtungsvektor_symbolisch, beobachtungsvektor_numerisch, "Beobachtungsvektor")
|
|
return beobachtungsvektor_numerisch
|
|
|
|
def beobachtungsvektor_naeherung_symbolisch(self, liste_beobachtungsvektor_symbolisch):
|
|
liste_beobachtungsgleichungen = []
|
|
self.dict_punkt_symbole = {}
|
|
liste_punktnummern = []
|
|
|
|
for beobachtung_symbolisch in liste_beobachtungsvektor_symbolisch:
|
|
aufgeteilt = beobachtung_symbolisch.split("_")
|
|
standpunkt = str(aufgeteilt[3])
|
|
zielpunkt = str(aufgeteilt[4])
|
|
|
|
if standpunkt not in liste_punktnummern:
|
|
liste_punktnummern.append(standpunkt)
|
|
if zielpunkt not in liste_punktnummern:
|
|
liste_punktnummern.append(zielpunkt)
|
|
|
|
for punkt in liste_punktnummern:
|
|
X, Y, Z = sp.symbols(f"X{punkt} Y{punkt} Z{punkt}")
|
|
self.dict_punkt_symbole[str(punkt)] = (X, Y, Z)
|
|
|
|
for beobachtung_symbolisch in liste_beobachtungsvektor_symbolisch:
|
|
aufgeteilt = beobachtung_symbolisch.split("_")
|
|
#beobachtungen_ID = aufgeteilt[0]
|
|
beobachtungsart = aufgeteilt[1] # "SD", "R", "ZW"
|
|
#beobachtungsgruppeID = aufgeteilt[2]
|
|
standpunkt = str(aufgeteilt[3])
|
|
zielpunkt = str(aufgeteilt[4])
|
|
|
|
if beobachtungsart == "SD":
|
|
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
|
|
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
|
|
|
|
beobachtungsgleichung = sp.sqrt(
|
|
(X_zp - X_sp) ** 2
|
|
+ (Y_zp - Y_sp) ** 2
|
|
+ (Z_zp - Z_sp) ** 2
|
|
)
|
|
liste_beobachtungsgleichungen.append(beobachtungsgleichung)
|
|
|
|
beobachtungsvektor_naeherung_symbolisch = sp.Matrix(liste_beobachtungsgleichungen)
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Näherung_Symbolisch.csv", [""],
|
|
liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_symbolisch, "Beobachtungsvektor")
|
|
|
|
return beobachtungsvektor_naeherung_symbolisch
|
|
|
|
def beobachtungsvektor_naeherung_numerisch_iteration0(self, liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_symbolisch):
|
|
beobachtungsvektor_naeherung_numerisch_iteration0 = beobachtungsvektor_naeherung_symbolisch.xreplace(self.substitutionen_dict)
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Näherung_Numerisch_Iteration0.csv", [""],
|
|
liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_numerisch_iteration0,
|
|
"Beobachtungsvektor")
|
|
|
|
return beobachtungsvektor_naeherung_numerisch_iteration0
|
|
|
|
def unbekanntenvektor_symbolisch(self, liste_unbekannte):
|
|
unbekanntenvektor_symbolisch = sp.Matrix(liste_unbekannte)
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Unbekanntenvektor_Symbolisch.csv", [""], liste_unbekannte, unbekanntenvektor_symbolisch,
|
|
"Unbekanntenvektor")
|
|
return(unbekanntenvektor_symbolisch)
|
|
|
|
def unbekanntenvektor_numerisch(self, liste_unbekanntenvektor_symbolisch, unbekanntenvektor_symbolisch, dX_Vektor = None, unbekanntenvektor_neumerisch_vorherige_Iteration = None):
|
|
if dX_Vektor is None and unbekanntenvektor_neumerisch_vorherige_Iteration is None:
|
|
unbekanntenvektor_numerisch = unbekanntenvektor_symbolisch.xreplace(self.substitutionen_dict)
|
|
else:
|
|
unbekanntenvektor_numerisch = unbekanntenvektor_neumerisch_vorherige_Iteration + dX_Vektor
|
|
|
|
Export.matrix_to_csv(r"Zwischenergebnisse\Unbekanntenvektor_Numerisch_Iteration0.csv", [""],
|
|
liste_unbekanntenvektor_symbolisch, unbekanntenvektor_numerisch,
|
|
"Unbekanntenvektor")
|
|
return unbekanntenvektor_numerisch
|
|
|
|
|
|
def berechnung_dl(self, beobachtungsvektor_numerisch, beobachtungsvektor_naeherung_numerisch):
|
|
dl = beobachtungsvektor_numerisch - beobachtungsvektor_naeherung_numerisch
|
|
return dl
|
|
|
|
def dict_substitutionen_naeherungen_us(self):
|
|
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
|
|
dict_koordinaten_B_L = self.berechnungen.geometrische_breite_laenge(db_zugriff.get_koordinaten("naeherung_us"))
|
|
liste_beobachtungen = db_zugriff.get_beobachtungen_from_beobachtungenid()
|
|
substitutionen = {}
|
|
|
|
for punktnummer, vektor in dict_koordinaten_B_L.items():
|
|
X_sym, Y_sym, Z_sym, B_sym, L_Sym = sp.symbols(
|
|
f"X{punktnummer} Y{punktnummer} Z{punktnummer} B{punktnummer} L{punktnummer}")
|
|
|
|
substitutionen[X_sym] = vektor[0][0]
|
|
substitutionen[Y_sym] = vektor[0][1]
|
|
substitutionen[Z_sym] = vektor[0][2]
|
|
substitutionen[B_sym] = vektor[1]
|
|
substitutionen[L_Sym] = vektor[2]
|
|
|
|
for standpunkt, zielpunkt, beobachtungenID, beobachtungsgruppeID, tachymeter_richtung, tachymeter_zenitwinkel, tachymeter_distanz in liste_beobachtungen:
|
|
alpha = sp.symbols(f"{beobachtungenID}_R_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
zw = sp.symbols(f"{beobachtungenID}_ZW_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
s = sp.symbols(f"{beobachtungenID}_SD_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
|
|
|
|
substitutionen[alpha] = tachymeter_richtung
|
|
substitutionen[zw] = tachymeter_zenitwinkel
|
|
substitutionen[s] = tachymeter_distanz
|
|
|
|
return substitutionen |