Jakobimatrix Distanzmessung Tachymeter Symbolisch fertig und kontrolliert
This commit is contained in:
File diff suppressed because one or more lines are too long
10
Datenbank.py
10
Datenbank.py
@@ -123,4 +123,12 @@ class Datenbankzugriff:
|
|||||||
con.close()
|
con.close()
|
||||||
if liste_instrumente == []:
|
if liste_instrumente == []:
|
||||||
liste_instrumente = f"Kein Instrument vom Typ {typ} gefunden. Folgende Typen stehen aktuell zur Auswahl: {liste_typen}"
|
liste_instrumente = f"Kein Instrument vom Typ {typ} gefunden. Folgende Typen stehen aktuell zur Auswahl: {liste_typen}"
|
||||||
return liste_instrumente
|
return liste_instrumente
|
||||||
|
|
||||||
|
def get_beobachtungen_id_standpunkt_zielpunkt(self, beobachtungsart):
|
||||||
|
con = sqlite3.connect(self.pfad_datenbank)
|
||||||
|
cursor = con.cursor()
|
||||||
|
liste_beobachtungen = cursor.execute(f"SELECT beobachtungenID, punktnummer_sp, punktnummer_zp FROM Beobachtungen WHERE {beobachtungsart} IS NOT NULL").fetchall()
|
||||||
|
cursor.close()
|
||||||
|
con.close()
|
||||||
|
return liste_beobachtungen
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user