diverse Änderungen, Versuch der Lösung der zweiten GHA mit Louville
This commit is contained in:
108
GHA_triaxial/approx_louville.py
Normal file
108
GHA_triaxial/approx_louville.py
Normal 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)
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user