GHA1 num und ana richtig. Tests nach Beispielen aus Panou 2013
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import numpy as np
|
||||
from numpy import sin, cos, sqrt, arctan2
|
||||
import ellipsoide
|
||||
import Numerische_Integration.num_int_runge_kutta as rk
|
||||
import winkelumrechnungen as wu
|
||||
@@ -6,33 +7,66 @@ import ausgaben as aus
|
||||
import GHA.rk as ghark
|
||||
from scipy.special import factorial as fact
|
||||
from math import comb
|
||||
import GHA_triaxial.numeric_examples_panou as nep
|
||||
|
||||
# Panou, Korakitits 2019
|
||||
|
||||
|
||||
def gha1_num(ell: ellipsoide.EllipsoidTriaxial, point, alpha0, s, num):
|
||||
def gha1_num_old(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"]
|
||||
q = values["q"]
|
||||
p, q = ell.p_q(x, y, z)
|
||||
|
||||
dxds0 = p[0] * np.sin(alpha0) + q[0] * np.cos(alpha0)
|
||||
dyds0 = p[1] * np.sin(alpha0) + q[1] * np.cos(alpha0)
|
||||
dzds0 = p[2] * np.sin(alpha0) + q[2] * np.cos(alpha0)
|
||||
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)
|
||||
|
||||
h = lambda dxds, dyds, dzds: dxds**2 + 1/(1-ell.ee**2)*dyds**2 + 1/(1-ell.ex**2)*dzds**2
|
||||
|
||||
f1 = lambda s, x, dxds, y, dyds, z, dzds: dxds
|
||||
f2 = lambda s, x, dxds, y, dyds, z, dzds: -h(dxds, dyds, dzds) / H * x
|
||||
f3 = lambda s, x, dxds, y, dyds, z, dzds: dyds
|
||||
f4 = lambda s, x, dxds, y, dyds, z, dzds: -h(dxds, dyds, dzds) / H * y/(1-ell.ee**2)
|
||||
f5 = lambda s, x, dxds, y, dyds, z, dzds: dzds
|
||||
f6 = lambda s, x, dxds, y, dyds, z, dzds: -h(dxds, dyds, dzds) / H * z/(1-ell.ex**2)
|
||||
f1 = lambda x, dxds, y, dyds, z, dzds: dxds
|
||||
f2 = lambda x, dxds, y, dyds, z, dzds: -h(dxds, dyds, dzds) / ell.func_H(x, y, z) * x
|
||||
f3 = lambda x, dxds, y, dyds, z, dzds: dyds
|
||||
f4 = lambda x, dxds, y, dyds, z, dzds: -h(dxds, dyds, dzds) / ell.func_H(x, y, z) * y/(1-ell.ee**2)
|
||||
f5 = lambda x, dxds, y, dyds, z, dzds: dzds
|
||||
f6 = lambda x, dxds, y, dyds, z, dzds: -h(dxds, dyds, dzds) / ell.func_H(x, y, z) * z/(1-ell.ex**2)
|
||||
|
||||
funktionswerte = rk.verfahren([f1, f2, f3, f4, f5, f6], [x, dxds0, y, dyds0, z, dzds0], s, num, fein=False)
|
||||
P2 = funktionswerte[-1]
|
||||
P2 = (P2[0], P2[2], P2[4])
|
||||
return P2
|
||||
|
||||
def buildODE(ell):
|
||||
def ODE(v):
|
||||
x, dxds, y, dyds, z, dzds = v
|
||||
|
||||
H = ell.func_H(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 [dxds, ddx, dyds, ddy, dzds, ddz]
|
||||
return ODE
|
||||
|
||||
def gha1_num(ell, point, alpha0, s, num):
|
||||
phi, lam, _ = ell.cart2geod("ligas3", point)
|
||||
x0, y0, z0 = ell.geod2cart(phi, lam, 0)
|
||||
|
||||
p, q = ell.p_q(x0, y0, z0)
|
||||
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 = [x0, dxds0, y0, dyds0, z0, dzds0]
|
||||
|
||||
F = buildODE(ell)
|
||||
|
||||
werte = rk.rk_chat(F, v_init, s, num)
|
||||
x1, _, y1, _, z1, _ = werte[-1]
|
||||
|
||||
return x1, y1, z1
|
||||
|
||||
funktionswerte = rk.verfahren([f1, f2, f3, f4, f5, f6], [0, x, dxds0, y, dyds0, z, dzds0], s, num)
|
||||
return funktionswerte
|
||||
|
||||
def checkLiouville(ell: ellipsoide.EllipsoidTriaxial, points):
|
||||
constantValues = []
|
||||
@@ -52,9 +86,9 @@ def checkLiouville(ell: ellipsoide.EllipsoidTriaxial, points):
|
||||
|
||||
P = p[0]*dxds + p[1]*dyds + p[2]*dzds
|
||||
Q = q[0]*dxds + q[1]*dyds + q[2]*dzds
|
||||
alpha = np.arctan(P/Q)
|
||||
alpha = arctan2(P, Q)
|
||||
|
||||
c = ell.ay**2 - (t1 * np.sin(alpha)**2 + t2 * np.cos(alpha)**2)
|
||||
c = ell.ay**2 - (t1 * sin(alpha)**2 + t2 * cos(alpha)**2)
|
||||
constantValues.append(c)
|
||||
pass
|
||||
|
||||
@@ -63,9 +97,7 @@ def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, point, alpha0, s, maxM):
|
||||
"""
|
||||
Panou, Korakitits 2020, 5ff.
|
||||
:param ell:
|
||||
:param x:
|
||||
:param y:
|
||||
:param z:
|
||||
:param point:
|
||||
:param alpha0:
|
||||
:param s:
|
||||
:param maxM:
|
||||
@@ -77,21 +109,22 @@ def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, point, alpha0, s, maxM):
|
||||
z_m = [z]
|
||||
|
||||
# erste Ableitungen (7-8)
|
||||
sqrtH = np.sqrt(ell.p_q(x, y, z)["H"])
|
||||
H = x ** 2 + y ** 2 / (1 - ell.ee ** 2) ** 2 + z ** 2 / (1 - ell.ex ** 2) ** 2
|
||||
sqrtH = sqrt(H)
|
||||
n = np.array([x / sqrtH,
|
||||
y / ((1-ell.ee**2) * sqrtH),
|
||||
z / ((1-ell.ex**2) * sqrtH)])
|
||||
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),
|
||||
1/G * np.sqrt(1-ell.ex**2) * np.cos(u)])
|
||||
G = sqrt(1 - ell.ex**2 * cos(u)**2 - ell.ee**2 * sin(u)**2 * sin(v)**2)
|
||||
q = np.array([-1/G * sin(u) * cos(v),
|
||||
-1/G * sqrt(1-ell.ee**2) * sin(u) * sin(v),
|
||||
1/G * sqrt(1-ell.ex**2) * cos(u)])
|
||||
p = np.array([q[1]*n[2] - q[2]*n[1],
|
||||
q[2]*n[0] - q[0]*n[2],
|
||||
q[0]*n[1] - q[1]*n[0]])
|
||||
x_m.append(p[0] * np.sin(alpha0) + q[0] * np.cos(alpha0))
|
||||
y_m.append(p[1] * np.sin(alpha0) + q[1] * np.cos(alpha0))
|
||||
z_m.append(p[2] * np.sin(alpha0) + q[2] * np.cos(alpha0))
|
||||
x_m.append(p[0] * sin(alpha0) + q[0] * cos(alpha0))
|
||||
y_m.append(p[1] * sin(alpha0) + q[1] * cos(alpha0))
|
||||
z_m.append(p[2] * sin(alpha0) + q[2] * cos(alpha0))
|
||||
|
||||
# H Ableitungen (7)
|
||||
H_ = lambda p: np.sum([comb(p, i) * (x_m[p - i] * x_m[i] +
|
||||
@@ -143,32 +176,16 @@ def gha1_ana(ell: ellipsoide.EllipsoidTriaxial, point, alpha0, s, maxM):
|
||||
|
||||
if __name__ == "__main__":
|
||||
# ell = ellipsoide.EllipsoidTriaxial.init_name("Eitschberger1978")
|
||||
ell = ellipsoide.EllipsoidTriaxial.init_name("BursaSima1980")
|
||||
ellbi = ellipsoide.EllipsoidTriaxial.init_name("Bessel-biaxial")
|
||||
ell = ellipsoide.EllipsoidTriaxial.init_name("BursaSima1980round")
|
||||
# ellbi = ellipsoide.EllipsoidTriaxial.init_name("Bessel-biaxial")
|
||||
re = ellipsoide.EllipsoidBiaxial.init_name("Bessel")
|
||||
|
||||
# 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.ell2cart(wu.deg2rad(60), wu.deg2rad(0))
|
||||
P2 = ell.ell2cart(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.cart2ell(P1)
|
||||
ell21 = ell.cart2ell(P2)
|
||||
ell1 = ell.cart2ell(cart1)
|
||||
ell2 = ell.cart2ell(cart2)
|
||||
beta0, lamb0, beta1, lamb1, c, alpha0, alpha1, s = nep.get_example(table=1, example=5)
|
||||
P0 = ell.ell2cart(beta0, lamb0)
|
||||
P1 = ell.ell2cart(beta1, lamb1)
|
||||
|
||||
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)
|
||||
# P1_num = gha1_num(ell, P0, alpha0, s, 1000)
|
||||
P1_num = gha1_num(ell, P0, alpha0, s, 10000)
|
||||
P1_ana = gha1_ana(ell, P0, alpha0, s, 30)
|
||||
pass
|
||||
Reference in New Issue
Block a user