Numerische MAtrizen auf numpy umgestellt
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user