Umbenennung, Umstrukturierung, Doc-Strings
This commit is contained in:
129
GHA_triaxial/gha1_num.py
Normal file
129
GHA_triaxial/gha1_num.py
Normal file
@@ -0,0 +1,129 @@
|
||||
import numpy as np
|
||||
from numpy import sin, cos, arctan2
|
||||
import ellipsoide
|
||||
import runge_kutta as rk
|
||||
import winkelumrechnungen as wu
|
||||
import GHA_triaxial.numeric_examples_karney as ne_karney
|
||||
from GHA_triaxial.gha1_ana import gha1_ana
|
||||
from ellipsoide import EllipsoidTriaxial
|
||||
from typing import Callable, Tuple, List
|
||||
from numpy.typing import NDArray
|
||||
|
||||
from GHA_triaxial.utils import alpha_ell2para, pq_ell
|
||||
|
||||
|
||||
def gha1_num(ell: EllipsoidTriaxial, point: NDArray, alpha0: float, s: float, num: int, all_points: bool = False) -> Tuple[NDArray, float] | Tuple[NDArray, float, List]:
|
||||
"""
|
||||
Panou, Korakitits 2019
|
||||
:param ell: Ellipsoid
|
||||
:param point: Punkt in kartesischen Koordinaten
|
||||
:param alpha0: Azimut im Startpunkt
|
||||
:param s: Strecke
|
||||
:param num: Anzahl Zwischenpunkte
|
||||
:param all_points: Ausgabe aller Punkte?
|
||||
:return: Zielpunkt, Azimut im Zielpunkt (, alle Punkte)
|
||||
"""
|
||||
phi, lam, _ = ell.cart2geod(point, "ligas3")
|
||||
p0 = ell.geod2cart(phi, lam, 0)
|
||||
x0, y0, z0 = p0
|
||||
|
||||
p, q = pq_ell(ell, p0)
|
||||
dxds0 = p[0] * sin(alpha0) + q[0] * cos(alpha0)
|
||||
dyds0 = p[1] * sin(alpha0) + q[1] * cos(alpha0)
|
||||
dzds0 = p[2] * sin(alpha0) + q[2] * cos(alpha0)
|
||||
|
||||
v_init = np.array([x0, dxds0, y0, dyds0, z0, dzds0])
|
||||
|
||||
def buildODE(ell: EllipsoidTriaxial) -> Callable:
|
||||
"""
|
||||
Aufbau des DGL-Systems
|
||||
:param ell: Ellipsoid
|
||||
:return: DGL-System
|
||||
"""
|
||||
|
||||
def ODE(s: float, v: NDArray) -> NDArray:
|
||||
"""
|
||||
DGL-System
|
||||
:param s: unabhängige Variable
|
||||
:param v: abhängige Variablen
|
||||
:return: Ableitungen der abhängigen Variablen
|
||||
"""
|
||||
x, dxds, y, dyds, z, dzds = v
|
||||
|
||||
H = ell.func_H(np.array([x, y, z]))
|
||||
h = dxds ** 2 + 1 / (1 - ell.ee ** 2) * dyds ** 2 + 1 / (1 - ell.ex ** 2) * dzds ** 2
|
||||
|
||||
ddx = -(h / H) * x
|
||||
ddy = -(h / H) * y / (1 - ell.ee ** 2)
|
||||
ddz = -(h / H) * z / (1 - ell.ex ** 2)
|
||||
|
||||
return np.array([dxds, ddx, dyds, ddy, dzds, ddz])
|
||||
|
||||
return ODE
|
||||
|
||||
ode = buildODE(ell)
|
||||
|
||||
_, werte = rk.rk4(ode, 0, v_init, s, num)
|
||||
x1, dx1ds, y1, dy1ds, z1, dz1ds = werte[-1]
|
||||
|
||||
point1 = np.array([x1, y1, z1])
|
||||
|
||||
p1, q1 = pq_ell(ell, point1)
|
||||
sigma = np.array([dx1ds, dy1ds, dz1ds])
|
||||
P = float(p1 @ sigma)
|
||||
Q = float(q1 @ sigma)
|
||||
|
||||
alpha1 = arctan2(P, Q)
|
||||
|
||||
if alpha1 < 0:
|
||||
alpha1 += 2 * np.pi
|
||||
|
||||
if all_points:
|
||||
return point1, alpha1, werte
|
||||
else:
|
||||
return point1, alpha1
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# ell = ellipsoide.EllipsoidTriaxial.init_name("BursaSima1980round")
|
||||
# diffs_panou = []
|
||||
# examples_panou = ne_panou.get_random_examples(5)
|
||||
# for example in examples_panou:
|
||||
# beta0, lamb0, beta1, lamb1, _, alpha0_ell, alpha1_ell, s = example
|
||||
# P0 = ell.ell2cart(beta0, lamb0)
|
||||
#
|
||||
# P1_num, alpha1_num = gha1_num(ell, P0, alpha0_ell, s, 100)
|
||||
# beta1_num, lamb1_num = ell.cart2ell(P1_num)
|
||||
#
|
||||
# _, _, alpha0_para = alpha_ell2para(ell, beta0, lamb0, alpha0_ell)
|
||||
# P1_ana, alpha1_ana = gha1_ana(ell, P0, alpha0_para, s, 60)
|
||||
# beta1_ana, lamb1_ana = ell.cart2ell(P1_ana)
|
||||
# diffs_panou.append((abs(beta1-beta1_num), abs(lamb1-lamb1_num), abs(beta1-beta1_ana), abs(lamb1-lamb1_ana)))
|
||||
# diffs_panou = np.array(diffs_panou)
|
||||
# mask_360 = (diffs_panou > 359) & (diffs_panou < 361)
|
||||
# diffs_panou[mask_360] = np.abs(diffs_panou[mask_360] - 360)
|
||||
# print(diffs_panou)
|
||||
|
||||
ell: EllipsoidTriaxial = ellipsoide.EllipsoidTriaxial.init_name("KarneyTest2024")
|
||||
diffs_karney = []
|
||||
# examples_karney = ne_karney.get_examples((30499, 30500, 40500))
|
||||
examples_karney = ne_karney.get_random_examples(20)
|
||||
for example in examples_karney:
|
||||
beta0, lamb0, alpha0_ell, beta1, lamb1, alpha1_ell, s = example
|
||||
P0 = ell.ell2cart(beta0, lamb0)
|
||||
|
||||
P1_num, alpha1_num = gha1_num(ell, P0, alpha0_ell, s, 10000)
|
||||
beta1_num, lamb1_num = ell.cart2ell(P1_num)
|
||||
|
||||
try:
|
||||
_, _, alpha0_para = alpha_ell2para(ell, beta0, lamb0, alpha0_ell)
|
||||
P1_ana, alpha1_ana = gha1_ana(ell, P0, alpha0_para, s, 45, maxPartCircum=32)
|
||||
beta1_ana, lamb1_ana = ell.cart2ell(P1_ana)
|
||||
except:
|
||||
beta1_ana, lamb1_ana = np.inf, np.inf
|
||||
|
||||
diffs_karney.append((wu.rad2deg(abs(beta1-beta1_num)), wu.rad2deg(abs(lamb1-lamb1_num)), wu.rad2deg(abs(beta1-beta1_ana)), wu.rad2deg(abs(lamb1-lamb1_ana))))
|
||||
diffs_karney = np.array(diffs_karney)
|
||||
mask_360 = (diffs_karney > 359) & (diffs_karney < 361)
|
||||
diffs_karney[mask_360] = np.abs(diffs_karney[mask_360] - 360)
|
||||
print(diffs_karney)
|
||||
Reference in New Issue
Block a user