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