fertig
This commit is contained in:
@@ -124,7 +124,7 @@ class Datumsfestlegung:
|
||||
return Q_ext, P
|
||||
|
||||
@staticmethod
|
||||
def indizes_beobachtungsvektor_nach_beobachtungsgruppe(Jacobimatrix_symbolisch_liste_beobachtungsvektor):
|
||||
def indizes_beobachtungsvektor_nach_beobachtungsgruppe(Jacobimatrix_symbolisch_liste_beobachtungsvektor: list[str]) -> dict[str, tuple[int, int]]:
|
||||
"""
|
||||
Ermittelt Indexbereiche des Beobachtungsvektors getrennt nach Beobachtungsgruppen.
|
||||
|
||||
@@ -189,113 +189,4 @@ class Datumsfestlegung:
|
||||
dict_beobachtungsgruppen_indizes["niv"] = min(liste_nivellement_indizes), max(liste_nivellement_indizes)
|
||||
dict_beobachtungsgruppen_indizes["lA"] = min(liste_anschlusspunkte_indizes), max(liste_anschlusspunkte_indizes)
|
||||
|
||||
return dict_beobachtungsgruppen_indizes
|
||||
|
||||
|
||||
@staticmethod
|
||||
def make_index(unbekannten_liste):
|
||||
names = [str(s).strip() for s in unbekannten_liste]
|
||||
return names, {n: i for i, n in enumerate(names)}
|
||||
|
||||
@staticmethod
|
||||
def erstelle_G(x0, unbekannten_liste, liste_punktnummern=None, mit_massstab=True):
|
||||
"""
|
||||
Baut G (u x d) in den vollen Unbekanntenraum.
|
||||
Wenn liste_punktnummern=None, werden alle Punkt-IDs aus unbekannten_liste
|
||||
über X*/Y*/Z* automatisch bestimmt.
|
||||
"""
|
||||
x0 = np.asarray(x0, float).reshape(-1)
|
||||
names, idx = Datumsfestlegung.make_index(unbekannten_liste)
|
||||
|
||||
u = len(names)
|
||||
d = 7 if mit_massstab else 6
|
||||
G = np.zeros((u, d), dtype=float)
|
||||
|
||||
# --- Punktliste automatisch, falls nicht gegeben ---
|
||||
if liste_punktnummern is None:
|
||||
pids = set()
|
||||
for n in names:
|
||||
if len(n) >= 2 and n[0].upper() in ("X", "Y", "Z"):
|
||||
pids.add(n[1:]) # alles nach X/Y/Z
|
||||
liste_punktnummern = sorted(pids)
|
||||
|
||||
for pid in liste_punktnummern:
|
||||
sx, sy, sz = f"X{pid}", f"Y{pid}", f"Z{pid}"
|
||||
if sx not in idx or sy not in idx or sz not in idx:
|
||||
continue # Punkt nicht vollständig als XYZ-Unbekannte vorhanden
|
||||
|
||||
ix, iy, iz = idx[sx], idx[sy], idx[sz]
|
||||
xi, yi, zi = x0[ix], x0[iy], x0[iz]
|
||||
|
||||
# Translationen
|
||||
G[ix, 0] = 1.0
|
||||
G[iy, 1] = 1.0
|
||||
G[iz, 2] = 1.0
|
||||
|
||||
# Rotationen (δr = ω × r)
|
||||
# Rx: δY=-Z, δZ=+Y
|
||||
G[iy, 3] = -zi
|
||||
G[iz, 3] = yi
|
||||
# Ry: δX=+Z, δZ=-X
|
||||
G[ix, 4] = zi
|
||||
G[iz, 4] = -xi
|
||||
# Rz: δX=-Y, δY=+X
|
||||
G[ix, 5] = -yi
|
||||
G[iy, 5] = xi
|
||||
|
||||
# Maßstab
|
||||
if mit_massstab:
|
||||
G[ix, 6] = xi
|
||||
G[iy, 6] = yi
|
||||
G[iz, 6] = zi
|
||||
|
||||
return G
|
||||
|
||||
|
||||
def aktive_indices_from_selection(auswahl, unbekannten_liste):
|
||||
names, idx = Datumsfestlegung.make_index(unbekannten_liste)
|
||||
aktive = []
|
||||
for pid, comp in auswahl:
|
||||
key = f"{comp.upper()}{str(pid)}"
|
||||
if key not in idx:
|
||||
raise KeyError(f"{key} nicht im Unbekanntenvektor.")
|
||||
aktive.append(idx[key])
|
||||
# unique
|
||||
out = []
|
||||
seen = set()
|
||||
for i in aktive:
|
||||
if i not in seen:
|
||||
seen.add(i)
|
||||
out.append(i)
|
||||
return out
|
||||
|
||||
|
||||
def auswahlmatrix_E(u, aktive_indices):
|
||||
E = np.zeros((u, u), dtype=float)
|
||||
for i in aktive_indices:
|
||||
E[int(i), int(i)] = 1.0
|
||||
return E
|
||||
|
||||
|
||||
def berechne_dx(N, n, G):
|
||||
|
||||
N = np.asarray(N, float)
|
||||
n = np.asarray(n, float).reshape(-1, 1)
|
||||
G = np.asarray(G, float)
|
||||
|
||||
u = N.shape[0]
|
||||
d = G.shape[1]
|
||||
|
||||
K = np.block([
|
||||
[N, G],
|
||||
[G.T, np.zeros((d, d))]
|
||||
])
|
||||
rhs = np.vstack([n, np.zeros((d, 1))])
|
||||
|
||||
K_inv = np.linalg.inv(K)
|
||||
sol = K_inv @ rhs
|
||||
|
||||
dx = sol[:u]
|
||||
k = sol[u:]
|
||||
Q_xx = K_inv[:u, :u]
|
||||
return dx, k, Q_xx
|
||||
return dict_beobachtungsgruppen_indizes
|
||||
Reference in New Issue
Block a user