Files
Masterprojekt-Campusnetz/Funktionales_Modell.py

187 lines
8.5 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)
def jacobi_matrix_symbolisch(self):
liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel"]
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}")
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 = dict_punkt_symbole[standpunkt]
X_zp, Y_zp, Z_zp = dict_punkt_symbole[zielpunkt]
B_sp, L_sp = sp.symbols(f"B{standpunkt} L{standpunkt}")
alpha = sp.symbols(f"alpha{standpunkt}_{zielpunkt}")
zw = sp.symbols(f"zw{standpunkt}_{zielpunkt}")
s = sp.symbols(f"s{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"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"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"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":
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
dict_koordinaten_B_L = self.berechnungen.geometrische_breite_laenge(db_zugriff.get_koordinaten(koordinatenart))
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]
A_numerisch = A_symbolisch.xreplace(substitutionen)
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!")