Numerische MAtrizen auf numpy umgestellt

This commit is contained in:
2025-12-31 16:03:38 +01:00
parent 59b7f33cf1
commit 01df1d55bf
11 changed files with 14361 additions and 5467 deletions

View File

@@ -2,6 +2,8 @@ from Datenbank import *
import sympy as sp
from Export import Export
from Berechnungen import Berechnungen
import numpy as np
class FunktionalesModell:
@@ -10,6 +12,11 @@ class FunktionalesModell:
self.berechnungen = Berechnungen(a, b)
self.substitutionen_dict = self.dict_substitutionen_uebergeordnetes_system()
self.dict_punkt_symbole = {}
self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
self.func_beob0 = None
self.func_A0 = None
self.func_u0 = None
self.liste_beobachtungsvektor_symbolisch = None
def jacobi_matrix_symbolisch(self):
liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel"]
@@ -417,9 +424,22 @@ class FunktionalesModell:
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):
self.liste_beobachtungsvektor_symbolisch = [str(x) for x in liste_zeilenbeschriftungen_gesamt]
if koordinatenart == "naeherung_us":
A_numerisch = A_symbolisch.xreplace(self.substitutionen_dict)
#A_numerisch = A_symbolisch.xreplace(self.substitutionen_dict)
if self.func_A0 is None:
#self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
self.func_A0 = sp.lambdify(
self.liste_symbole_lambdify,
A_symbolisch,
modules="numpy",
cse=True
)
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
#A_numerisch = sp.Matrix(self.func_A0(*liste_werte))
A_numerisch = np.asarray(self.func_A0(*liste_werte), dtype=float)
Export.matrix_to_csv(r"Zwischenergebnisse\Jacobi_Matrix_Numerisch_Iteration0.csv", liste_unbekannte,
liste_zeilenbeschriftungen_gesamt, A_numerisch, "Beobachtung")
@@ -581,7 +601,21 @@ class FunktionalesModell:
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)
#beobachtungsvektor_naeherung_numerisch_iteration0 = beobachtungsvektor_naeherung_symbolisch.xreplace(self.substitutionen_dict)
if self.func_beob0 is None:
#self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
self.func_beob0 = sp.lambdify(
self.liste_symbole_lambdify,
beobachtungsvektor_naeherung_symbolisch,
modules="numpy",
cse=True
)
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
#beobachtungsvektor_naeherung_numerisch_iteration0 = sp.Matrix(self.func_beob0(*liste_werte))
beobachtungsvektor_naeherung_numerisch_iteration0 = np.asarray(self.func_beob0(*liste_werte),
dtype=float).reshape(-1, 1)
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Näherung_Numerisch_Iteration0.csv", [""],
liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_numerisch_iteration0,
"Beobachtungsvektor")
@@ -599,8 +633,25 @@ class FunktionalesModell:
self.liste_unbekanntenvektor_symbolisch = liste_unbekanntenvektor_symbolisch
if dX_Vektor is None and unbekanntenvektor_neumerisch_vorherige_Iteration is None:
unbekanntenvektor_numerisch = unbekanntenvektor_symbolisch.xreplace(self.substitutionen_dict)
#unbekanntenvektor_numerisch = unbekanntenvektor_symbolisch.xreplace(self.substitutionen_dict)
if self.func_u0 is None:
self.func_u0 = sp.lambdify(
self.liste_symbole_lambdify,
unbekanntenvektor_symbolisch,
modules="numpy",
cse=True
)
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
#unbekanntenvektor_numerisch = sp.Matrix(self.func_u0(*liste_werte))
unbekanntenvektor_numerisch = np.asarray(self.func_u0(*liste_werte), dtype=float).reshape(-1, 1)
else:
#unbekanntenvektor_numerisch = unbekanntenvektor_neumerisch_vorherige_Iteration + dX_Vektor
unbekanntenvektor_neumerisch_vorherige_Iteration = np.asarray(
unbekanntenvektor_neumerisch_vorherige_Iteration, dtype=float).reshape(-1, 1)
dX_Vektor = np.asarray(dX_Vektor, dtype=float).reshape(-1, 1)
unbekanntenvektor_numerisch = unbekanntenvektor_neumerisch_vorherige_Iteration + dX_Vektor
self.substitutionen_dict = self.dict_substitutionen_uebergeordnetes_system(unbekanntenvektor_numerisch)
@@ -622,20 +673,24 @@ class FunktionalesModell:
punktnummer = str(name[1:])
dict_unbekanntenvektor_numerisch[punktnummer] = sp.Matrix([
unbekanntenvektor_numerisch[index],
unbekanntenvektor_numerisch[index + 1],
unbekanntenvektor_numerisch[index + 2]
float(unbekanntenvektor_numerisch[index]),
float(unbekanntenvektor_numerisch[index + 1]),
float(unbekanntenvektor_numerisch[index + 2])
])
index += 3
return dict_unbekanntenvektor_numerisch
def berechnung_dl(self, beobachtungsvektor_numerisch, beobachtungsvektor_naeherung_numerisch):
def berechnung_dl(self, beobachtungsvektor_numerisch, beobachtungsvektor_naeherung_numerisch,
liste_beobachtungsvektor_symbolisch=None):
dl = beobachtungsvektor_numerisch - beobachtungsvektor_naeherung_numerisch
dl = np.asarray(dl, dtype=float)
if liste_beobachtungsvektor_symbolisch is None:
liste_beobachtungsvektor_symbolisch = self.liste_beobachtungsvektor_symbolisch
for i, name in enumerate(liste_beobachtungsvektor_symbolisch):
if "_R_" in name:
dl[i] = sp.atan2(sp.sin(dl[i]), sp.cos(dl[i])) # wrap auf (-pi, pi]
if "_R_" in str(name):
dl[i] = np.arctan2(np.sin(dl[i]), np.cos(dl[i]))
return dl
@@ -657,20 +712,24 @@ class FunktionalesModell:
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]
substitutionen[X_sym] = float(vektor[0][0])
substitutionen[Y_sym] = float(vektor[0][1])
substitutionen[Z_sym] = float(vektor[0][2])
substitutionen[B_sym] = float(vektor[1])
substitutionen[L_Sym] = float(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
if tachymeter_richtung is None and tachymeter_zenitwinkel is None and tachymeter_distanz is None:
continue
substitutionen[alpha] = float(tachymeter_richtung)
substitutionen[zw] = float(tachymeter_zenitwinkel)
substitutionen[s] = float(tachymeter_distanz)
substitutionen[sp.Symbol(f"O{beobachtungsgruppeID}")] = 0.0
if unbekanntenvektor_aus_iteration is not None:
dict_O = self.unbekanntenvektor_numerisch_to_dict_orientierungen(
@@ -678,7 +737,7 @@ class FunktionalesModell:
unbekanntenvektor_aus_iteration
)
for orientierungs_id, wert in dict_O.items():
substitutionen[sp.Symbol(f"O{orientierungs_id}")] = wert
substitutionen[sp.Symbol(f"O{orientierungs_id}")] = float(wert)
else:
for standpunkt, zielpunkt, beobachtungenID, beobachtungsgruppeID, *_ in liste_beobachtungen:
O_sym = sp.Symbol(f"O{beobachtungsgruppeID}")
@@ -695,6 +754,6 @@ class FunktionalesModell:
name = str(symbol)
if name.startswith("O"):
orientierungs_id = name[1:]
dict_O[orientierungs_id] = unbekanntenvektor_numerisch[i]
dict_O[orientierungs_id] = float(unbekanntenvektor_numerisch[i])
return dict_O