Files
Masterprojekt-Campusnetz/Funktionales_Modell.py

67 lines
2.8 KiB
Python

from Datenbank import *
import sympy as sp
import csv
class FunktionalesModell:
def __init__(self, pfad_datenbank):
self.pfad_datenbank = pfad_datenbank
def jacobi_matrix_symbolisch(self):
liste_beobachtungsarten = ["tachymeter_distanz"]
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
liste_beobachtungen = []
liste_beobachtungsgleichungen = []
liste_zeilenbeschriftungen = []
for beobachtungsart in liste_beobachtungsarten:
liste_id_standpunkt_zielpunkt = db_zugriff.get_beobachtungen_id_standpunkt_zielpunkt(beobachtungsart)
if beobachtungsart == "tachymeter_distanz":
for beobachtungenID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
X_sp, Y_sp, Z_sp = sp.symbols(f"X{standpunkt} Y{standpunkt} Z{standpunkt}")
X_zp, Y_zp, Z_zp = sp.symbols(f"X{zielpunkt} Y{zielpunkt} Z{zielpunkt}")
beobachtungsgleichung = sp.sqrt(
(X_zp - X_sp) ** 2
+ (Y_zp - Y_sp) ** 2
+ (Z_zp - Z_sp) ** 2
)
liste_beobachtungsgleichungen.append(beobachtungsgleichung)
liste_zeilenbeschriftungen.append(f"{standpunkt}-{zielpunkt}")
if standpunkt not in liste_beobachtungen:
liste_beobachtungen.append(standpunkt)
if zielpunkt not in liste_beobachtungen:
liste_beobachtungen.append(zielpunkt)
liste_unbekannte = []
for beobachtungen in liste_beobachtungen:
X, Y, Z = sp.symbols(f"X{beobachtungen} Y{beobachtungen} Z{beobachtungen}")
liste_unbekannte.append(X)
liste_unbekannte.append(Y)
liste_unbekannte.append(Z)
f_matrix = sp.Matrix(liste_beobachtungsgleichungen)
unbekanntenvektor = sp.Matrix(liste_unbekannte)
A = f_matrix.jacobian(unbekanntenvektor)
# --- Export der A-Matrix in eine CSV-Datei ---
dateiname_export = "Jacobi_Tachymeter_Distanz.csv"
with open(dateiname_export, "w", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile, delimiter=";")
# Kopfzeile: leere Ecke + Namen der Unbekannten
kopfzeile = ["Beobachtung"]
for unbekannte in liste_unbekannte:
kopfzeile.append(str(unbekannte))
writer.writerow(kopfzeile)
# Zeilen: Standpunkt-Zielpunkt + Jacobimatrix-Zeile
for zeilenbeschriftung, zeile in zip(liste_zeilenbeschriftungen, A.tolist()):
zeile_als_text = [zeilenbeschriftung] + [str(eintrag) for eintrag in zeile]
writer.writerow(zeile_als_text)
return A