diverse Änderungen, Versuch der Lösung der zweiten GHA mit Louville

This commit is contained in:
2025-11-25 14:49:06 +01:00
parent 2ff4cff2be
commit 9031a12312
5 changed files with 308 additions and 121 deletions

View File

@@ -0,0 +1,108 @@
import numpy as np
from numpy import sin, cos, arcsin, arccos, arctan2
from ellipsoide import EllipsoidTriaxial
import matplotlib.pyplot as plt
dbeta_dc = lambda ell, beta, lamb, alpha: -2 * ell.Ey**2 * sin(alpha)**2 * cos(beta) * sin(beta)
dlamb_dc = lambda ell, beta, lamb, alpha: -2 * ell.Ee**2 * cos(alpha)**2 * sin(lamb) * cos(lamb)
dalpha_dc = lambda ell, beta, lamb, alpha: (2 * sin(alpha) * cos(alpha) *
(ell.Ey**2 * cos(beta)**2 + ell.Ee**2 * sin(lamb)**2))
lamb2_sphere = lambda r, phi1, lamb1, a12, s: lamb1 + arctan2(sin(s/r) * sin(a12),
cos(phi1) * cos(s/r) - sin(s/r) * cos(a12))
phi2_sphere = lambda r, phi1, lamb1, a12, s: arcsin(sin(phi1) * cos(s/r) + cos(phi1) * sin(s/r) * cos(a12))
a12_sphere = lambda phi1, lamb1, phi2, lamb2: arctan2(cos(phi2) * sin(lamb2 - lamb1),
cos(phi1) * cos(phi2) -
sin(phi1) * cos(phi2) * cos(lamb2 - lamb1))
s_sphere = lambda r, phi1, lamb1, phi2, lamb2: r * arccos(sin(phi1) * sin(phi2) +
cos(phi1) * cos(phi2) * cos(lamb2 - lamb1))
louville = lambda beta, lamb, alpha: (ell.Ey**2 * cos(beta)**2 * sin(alpha)**2 -
ell.Ee**2 * sin(lamb)**2 * cos(alpha)**2)
def points_approx_gha2(r: float, phi1: np.ndarray, lamb1: np.ndarray, phi2: np.ndarray, lamb2: np.ndarray, num: int = None, step_size: float = 10000):
s_approx = s_sphere(r, phi1, lamb1, phi2, lamb2)
if num is not None:
step_size = s_approx / (num+1)
a_approx = a12_sphere(phi1, lamb1, phi2, lamb2)
points = [np.array([phi1, lamb1, a_approx])]
current_s = step_size
while current_s < s_approx:
phi_n = phi2_sphere(r, phi1, lamb1, a_approx, current_s)
lamb_n = lamb2_sphere(r, phi1, lamb1, a_approx, current_s)
points.append(np.array([phi_n, lamb_n, a_approx]))
current_s += step_size
points.append(np.array([phi2, lamb2, a_approx]))
return points
def num_update(ell: EllipsoidTriaxial, points, diffs):
for i, (beta, lamb, alpha) in enumerate(points):
dalpha = dalpha_dc(ell, beta, lamb, alpha)
if i == 0 or i == len(points) - 1:
grad = np.array([0, 0, dalpha])
else:
dbeta = dbeta_dc(ell, beta, lamb, alpha)
dlamb = dlamb_dc(ell, beta, lamb, alpha)
grad = np.array([dbeta, dlamb, dalpha])
delta = -diffs[i] * grad / np.dot(grad, grad)
points[i] += delta
return points
def gha2(ell: EllipsoidTriaxial, p1: np.ndarray, p2: np.ndarray, maxI: int):
beta1, lamb1 = ell.cart2ell2(p1)
beta2, lamb2 = ell.cart2ell2(p2)
points = points_approx_gha2(ell.ax, beta1, lamb1, beta2, lamb2, 5)
for j in range(maxI):
constants = [louville(point[0], point[1], point[2]) for point in points]
mean_constant = np.mean(constants)
diffs = constants - mean_constant
if np.mean(np.abs(diffs)) > 10:
points = num_update(ell, points, diffs)
else:
break
for k in range(maxI):
last_diff_alpha = points[-2][-1] - points[-3][-1]
alpha_extrap = points[-2][-1] + last_diff_alpha
if abs(alpha_extrap - points[-1][-1]) > 0.0005:
pass
else:
break
pass
pass
return points
def show_points(ell: EllipsoidTriaxial, points):
points_cart = []
for point in points:
points_cart.append(ell.ell2cart2(point[0], point[1]))
points_cart = np.array(points_cart)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(points_cart[:, 0], points_cart[:, 1], points_cart[:, 2])
ax.scatter(points_cart[:, 0], points_cart[:, 1], points_cart[:, 2])
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
if __name__ == "__main__":
ell = EllipsoidTriaxial.init_name("Eitschberger1978")
p1 = np.array([4189000, 812000, 4735000])
p2 = np.array([4090000, 868000, 4808000])
p1, phi1, lamb1, h1 = ell.cartonell(p1)
p2, phi2, lamb2, h2 = ell.cartonell(p2)
points = gha2(ell, p1, p2, 10)
show_points(ell, points)

View File

@@ -10,7 +10,9 @@ from math import comb
# Panou, Korakitits 2019
def gha1_num(ell: ellipsoide.EllipsoidTriaxial, x, y, z, alpha0, s, num):
def gha1_num(ell: ellipsoide.EllipsoidTriaxial, point, alpha0, s, num):
phi, lamb, h = ell.cart2geod("ligas3", point)
x, y, z = ell.geod2cart(phi, lamb, 0)
values = ell.p_q(x, y, z)
H = values["H"]
p = values["p"]
@@ -57,7 +59,7 @@ def checkLiouville(ell: ellipsoide.EllipsoidTriaxial, points):
pass
def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, x, y, z, alpha0, s, maxM):
def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, point, alpha0, s, maxM):
"""
Panou, Korakitits 2020, 5ff.
:param ell:
@@ -69,6 +71,7 @@ def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, x, y, z, alpha0, s, maxM):
:param maxM:
:return:
"""
x, y, z = point
x_m = [x]
y_m = [y]
z_m = [z]
@@ -78,7 +81,7 @@ def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, x, y, z, alpha0, s, maxM):
n = np.array([x / sqrtH,
y / ((1-ell.ee**2) * sqrtH),
z / ((1-ell.ex**2) * sqrtH)])
u, v = ell.cart2para(x, y, z)
u, v = ell.cart2para(np.array([x, y, z]))
G = np.sqrt(1 - ell.ex**2 * np.cos(u)**2 - ell.ee**2 * np.sin(u)**2 * np.sin(v)**2)
q = np.array([-1/G * np.sin(u) * np.cos(v),
-1/G * np.sqrt(1-ell.ee**2) * np.sin(u) * np.sin(v),
@@ -139,23 +142,33 @@ def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, x, y, z, alpha0, s, maxM):
if __name__ == "__main__":
ell = ellipsoide.EllipsoidTriaxial.init_name("Eitschberger1978")
# ell = ellipsoide.EllipsoidTriaxial.init_name("Eitschberger1978")
ell = ellipsoide.EllipsoidTriaxial.init_name("BursaSima1980")
ellbi = ellipsoide.EllipsoidTriaxial.init_name("Bessel-biaxial")
re = ellipsoide.EllipsoidBiaxial.init_name("Bessel")
x0 = 5672455.1954766
y0 = 2698193.7242382686
z0 = 1103177.6450055107
alpha0 = wu.gms2rad([20, 0, 0])
s = 500000
num = 100
werteTri = gha1_num(ellbi, x0, y0, z0, alpha0, s, num)
print(aus.xyz(werteTri[-1][1], werteTri[-1][3], werteTri[-1][5], 8))
print("Distanz Triaxial Numerisch", np.sqrt((x0-werteTri[-1][1])**2+(y0-werteTri[-1][3])**2+(z0-werteTri[-1][5])**2))
# checkLiouville(ell, werteTri)
werteBi = ghark.gha1(re, x0, y0, z0, alpha0, s, num)
print(aus.xyz(werteBi[0], werteBi[1], werteBi[2], 8))
print("Distanz Biaxial", np.sqrt((x0-werteBi[0])**2+(y0-werteBi[1])**2+(z0-werteBi[2])**2))
werteAna = gha1_ana(ell, x0, y0, z0, alpha0, s, 7)
print(aus.xyz(werteAna[0], werteAna[1], werteAna[2], 8))
print("Distanz Triaxial Analytisch", np.sqrt((x0-werteAna[0])**2+(y0-werteAna[1])**2+(z0-werteAna[2])**2))
# Panou 2013, 7, Table 1, beta0=60°
beta1 = wu.deg2rad(60)
lamb1 = wu.deg2rad(0)
beta2 = wu.deg2rad(60)
lamb2 = wu.deg2rad(175)
P1 = ell.ell2cart2(wu.deg2rad(60), wu.deg2rad(0))
P2 = ell.ell2cart2(wu.deg2rad(60), wu.deg2rad(175))
para1 = ell.cart2para(P1)
para2 = ell.cart2para(P2)
cart1 = ell.para2cart(para1[0], para1[1])
cart2 = ell.para2cart(para2[0], para2[1])
ell11 = ell.cart2ell2(P1)
ell21 = ell.cart2ell2(P2)
ell1 = ell.cart2ell2(cart1)
ell2 = ell.cart2ell2(cart2)
c = 0.06207487624
alpha0 = wu.gms2rad([2, 52, 26.2393])
alpha1 = wu.gms2rad([177, 4, 13.6373])
s = 6705715.1610
pass
P2_num = gha1_num(ell, P1, alpha0, s, 1000)
P2_ana = gha1_ana(ell, P1, alpha0, s, 70)
pass