Projekt aufgeräumt, gha1 getestet, Runge-Kutta angepasst (gha2_num sollte jetzt deutlich schneller sein)

This commit is contained in:
2026-01-09 17:49:49 +01:00
parent cf756e3d9a
commit 797afdfd6f
23 changed files with 832 additions and 868 deletions

View File

@@ -1,7 +1,9 @@
import numpy as np
from ellipsoide import EllipsoidTriaxial
import Numerische_Integration.num_int_runge_kutta as rk
import ausgaben as aus
import runge_kutta as rk
import GHA_triaxial.numeric_examples_karney as ne_karney
import GHA_triaxial.numeric_examples_panou as ne_panou
import winkelumrechnungen as wu
# Panou 2013
def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, epsilon=10**-12, iter_max=30):
@@ -110,27 +112,45 @@ def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, ep
q_33, q_22, q_11, q_00)
if lamb_1 != lamb_2:
def functions():
def f_beta(lamb, beta, beta_p, X3, X4):
return beta_p
# def functions():
# def f_beta(lamb, beta, beta_p, X3, X4):
# return beta_p
#
# def f_beta_p(lamb, beta, beta_p, X3, X4):
# (BETA, LAMBDA, E, G,
# p_3, p_2, p_1, p_0,
# p_33, p_22, p_11, p_00) = p_coef(beta, lamb)
# return p_3 * beta_p ** 3 + p_2 * beta_p ** 2 + p_1 * beta_p + p_0
#
# def f_X3(lamb, beta, beta_p, X3, X4):
# return X4
#
# def f_X4(lamb, beta, beta_p, X3, X4):
# (BETA, LAMBDA, E, G,
# p_3, p_2, p_1, p_0,
# p_33, p_22, p_11, p_00) = p_coef(beta, lamb)
# return (p_33 * beta_p ** 3 + p_22 * beta_p ** 2 + p_11 * beta_p + p_00) * X3 + \
# (3 * p_3 * beta_p ** 2 + 2 * p_2 * beta_p + p_1) * X4
#
# return [f_beta, f_beta_p, f_X3, f_X4]
def buildODElamb():
def ODE(lamb, v):
beta, beta_p, X3, X4 = v
def f_beta_p(lamb, beta, beta_p, X3, X4):
(BETA, LAMBDA, E, G,
p_3, p_2, p_1, p_0,
p_33, p_22, p_11, p_00) = p_coef(beta, lamb)
return p_3 * beta_p ** 3 + p_2 * beta_p ** 2 + p_1 * beta_p + p_0
def f_X3(lamb, beta, beta_p, X3, X4):
return X4
def f_X4(lamb, beta, beta_p, X3, X4):
(BETA, LAMBDA, E, G,
p_3, p_2, p_1, p_0,
p_33, p_22, p_11, p_00) = p_coef(beta, lamb)
return (p_33 * beta_p ** 3 + p_22 * beta_p ** 2 + p_11 * beta_p + p_00) * X3 + \
dbeta = beta_p
dbeta_p = p_3 * beta_p ** 3 + p_2 * beta_p ** 2 + p_1 * beta_p + p_0
dX3 = X4
dX4 = (p_33 * beta_p ** 3 + p_22 * beta_p ** 2 + p_11 * beta_p + p_00) * X3 + \
(3 * p_3 * beta_p ** 2 + 2 * p_2 * beta_p + p_1) * X4
return [f_beta, f_beta_p, f_X3, f_X4]
return np.array([dbeta, dbeta_p, dX3, dX4])
return ODE
N = n
@@ -144,15 +164,20 @@ def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, ep
converged = False
iterations = 0
funcs = functions()
# funcs = functions()
ode_lamb = buildODElamb()
for i in range(iter_max):
iterations = i + 1
startwerte = [lamb_1, beta_1, beta_0, 0.0, 1.0]
# startwerte = [lamb_1, beta_1, beta_0, 0.0, 1.0]
startwerte = np.array([beta_1, beta_0, 0.0, 1.0])
werte = rk.verfahren(funcs, startwerte, dlamb, N)
lamb_end, beta_end, beta_p_end, X3_end, X4_end = werte[-1]
# werte = rk.verfahren(funcs, startwerte, dlamb, N)
lamb_list, werte = rk.rk4(ode_lamb, lamb_1, startwerte, dlamb, N, False)
# lamb_end, beta_end, beta_p_end, X3_end, X4_end = werte[-1]
lamb_end = lamb_list[-1]
beta_end, beta_p_end, X3_end, X4_end = werte[-1]
d_beta_end_d_beta0 = X3_end
delta = beta_end - beta_2
@@ -174,16 +199,20 @@ def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, ep
raise RuntimeError("konvergiert nicht.")
# Z
werte = rk.verfahren(funcs, [lamb_1, beta_1, beta_0, 0.0, 1.0], dlamb, N)
# werte = rk.verfahren(funcs, [lamb_1, beta_1, beta_0, 0.0, 1.0], dlamb, N, False)
lamb_list, werte = rk.rk4(ode_lamb, lamb_1, np.array([beta_1, beta_0, 0.0, 1.0]), dlamb, N, False)
beta_arr = np.zeros(N + 1)
lamb_arr = np.zeros(N + 1)
# lamb_arr = np.zeros(N + 1)
lamb_arr = np.array(lamb_list)
beta_p_arr = np.zeros(N + 1)
for i, state in enumerate(werte):
lamb_arr[i] = state[0]
beta_arr[i] = state[1]
beta_p_arr[i] = state[2]
# lamb_arr[i] = state[0]
# beta_arr[i] = state[1]
# beta_p_arr[i] = state[2]
beta_arr[i] = state[0]
beta_p_arr[i] = state[1]
(_, _, E1, G1,
*_) = BETA_LAMBDA(beta_arr[0], lamb_arr[0])
@@ -230,37 +259,59 @@ def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, ep
converged = False
iterations = 0
def functions_beta():
def g_lamb(beta, lamb, lamb_p, Y3, Y4):
return lamb_p
# def functions_beta():
# def g_lamb(beta, lamb, lamb_p, Y3, Y4):
# return lamb_p
#
# def g_lamb_p(beta, lamb, lamb_p, Y3, Y4):
# (BETA, LAMBDA, E, G,
# q_3, q_2, q_1, q_0,
# q_33, q_22, q_11, q_00) = q_coef(beta, lamb)
# return q_3 * lamb_p ** 3 + q_2 * lamb_p ** 2 + q_1 * lamb_p + q_0
#
# def g_Y3(beta, lamb, lamb_p, Y3, Y4):
# return Y4
#
# def g_Y4(beta, lamb, lamb_p, Y3, Y4):
# (BETA, LAMBDA, E, G,
# q_3, q_2, q_1, q_0,
# q_33, q_22, q_11, q_00) = q_coef(beta, lamb)
# return (q_33 * lamb_p ** 3 + q_22 * lamb_p ** 2 + q_11 * lamb_p + q_00) * Y3 + \
# (3 * q_3 * lamb_p ** 2 + 2 * q_2 * lamb_p + q_1) * Y4
#
# return [g_lamb, g_lamb_p, g_Y3, g_Y4]
def buildODEbeta():
def ODE(beta, v):
lamb, lamb_p, Y3, Y4 = v
def g_lamb_p(beta, lamb, lamb_p, Y3, Y4):
(BETA, LAMBDA, E, G,
q_3, q_2, q_1, q_0,
q_33, q_22, q_11, q_00) = q_coef(beta, lamb)
return q_3 * lamb_p ** 3 + q_2 * lamb_p ** 2 + q_1 * lamb_p + q_0
def g_Y3(beta, lamb, lamb_p, Y3, Y4):
return Y4
def g_Y4(beta, lamb, lamb_p, Y3, Y4):
(BETA, LAMBDA, E, G,
q_3, q_2, q_1, q_0,
q_33, q_22, q_11, q_00) = q_coef(beta, lamb)
return (q_33 * lamb_p ** 3 + q_22 * lamb_p ** 2 + q_11 * lamb_p + q_00) * Y3 + \
dlamb = lamb_p
dlamb_p = q_3 * lamb_p ** 3 + q_2 * lamb_p ** 2 + q_1 * lamb_p + q_0
dY3 = Y4
dY4 = (q_33 * lamb_p ** 3 + q_22 * lamb_p ** 2 + q_11 * lamb_p + q_00) * Y3 + \
(3 * q_3 * lamb_p ** 2 + 2 * q_2 * lamb_p + q_1) * Y4
return [g_lamb, g_lamb_p, g_Y3, g_Y4]
return np.array([dlamb, dlamb_p, dY3, dY4])
return ODE
funcs_beta = functions_beta()
# funcs_beta = functions_beta()
ode_beta = buildODEbeta()
for i in range(iter_max):
iterations = i + 1
startwerte = [beta_1, lamb_1, lamb_0, 0.0, 1.0]
startwerte = [lamb_1, lamb_0, 0.0, 1.0]
werte = rk.verfahren(funcs_beta, startwerte, dbeta, N)
beta_end, lamb_end, lamb_p_end, Y3_end, Y4_end = werte[-1]
# werte = rk.verfahren(funcs_beta, startwerte, dbeta, N, False)
beta_list, werte = rk.rk4(ode_beta, beta_1, startwerte, dbeta, N, False)
beta_end = beta_list[-1]
# beta_end, lamb_end, lamb_p_end, Y3_end, Y4_end = werte[-1]
lamb_end, lamb_p_end, Y3_end, Y4_end = werte[-1]
d_lamb_end_d_lambda0 = Y3_end
delta = lamb_end - lamb_2
@@ -279,16 +330,20 @@ def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, ep
lamb_0 = lamb_0 - step
werte = rk.verfahren(funcs_beta, [beta_1, lamb_1, lamb_0, 0.0, 1.0], dbeta, N)
# werte = rk.verfahren(funcs_beta, [beta_1, lamb_1, lamb_0, 0.0, 1.0], dbeta, N, False)
beta_list, werte = rk.rk4(ode_beta, beta_1, np.array([lamb_1, lamb_0, 0.0, 1.0]), dbeta, N, False)
beta_arr = np.zeros(N + 1)
# beta_arr = np.zeros(N + 1)
beta_arr = np.array(beta_list)
lamb_arr = np.zeros(N + 1)
lambda_p_arr = np.zeros(N + 1)
for i, state in enumerate(werte):
beta_arr[i] = state[0]
lamb_arr[i] = state[1]
lambda_p_arr[i] = state[2]
# beta_arr[i] = state[0]
# lamb_arr[i] = state[1]
# lambda_p_arr[i] = state[2]
lamb_arr[i] = state[0]
lambda_p_arr[i] = state[1]
# Azimute
(BETA1, LAMBDA1, E1, G1,
@@ -318,22 +373,54 @@ def gha2_num(ell: EllipsoidTriaxial, beta_1, lamb_1, beta_2, lamb_2, n=16000, ep
if __name__ == "__main__":
ell = EllipsoidTriaxial.init_name("BursaSima1980round")
# beta1 = np.deg2rad(75)
# lamb1 = np.deg2rad(-90)
# beta2 = np.deg2rad(75)
# lamb2 = np.deg2rad(66)
# a1, a2, s = gha2_num(ell, beta1, lamb1, beta2, lamb2)
# print(aus.gms("a1", a1, 4))
# print(aus.gms("a2", a2, 4))
# ell = EllipsoidTriaxial.init_name("Fiction")
# # beta1 = np.deg2rad(75)
# # lamb1 = np.deg2rad(-90)
# # beta2 = np.deg2rad(75)
# # lamb2 = np.deg2rad(66)
# # a1, a2, s = gha2_num(ell, beta1, lamb1, beta2, lamb2)
# # print(aus.gms("a1", a1, 4))
# # print(aus.gms("a2", a2, 4))
# # print(s)
# cart1 = ell.para2cart(0, 0)
# cart2 = ell.para2cart(0.4, 1.4)
# beta1, lamb1 = ell.cart2ell(cart1)
# beta2, lamb2 = ell.cart2ell(cart2)
#
# a1, a2, s = gha2_num(ell, beta1, lamb1, beta2, lamb2, n=5000)
# print(s)
cart1 = ell.para2cart(0, 0)
cart2 = ell.para2cart(0.4, 0.4)
beta1, lamb1 = ell.cart2ell(cart1)
beta2, lamb2 = ell.cart2ell(cart2)
a1, a2, s = gha2_num(ell, beta1, lamb1, beta2, lamb2, n=2500)
print(s)
ell = EllipsoidTriaxial.init_name("BursaSima1980round")
diffs_panou = []
examples_panou = ne_panou.get_random_examples(4)
for example in examples_panou:
beta0, lamb0, beta1, lamb1, _, alpha0, alpha1, s = example
P0 = ell.ell2cart(beta0, lamb0)
try:
alpha0_num, alpha1_num, s_num = gha2_num(ell, beta0, lamb0, beta1, lamb1, n=4000, iter_max=10)
diffs_panou.append(
(wu.rad2deg(abs(alpha0 - alpha0_num)), wu.rad2deg(abs(alpha1 - alpha1_num)), abs(s - s_num)))
except:
print(f"Fehler für {beta0}, {lamb0}, {beta1}, {lamb1}")
diffs_panou = np.array(diffs_panou)
print(diffs_panou)
ell = EllipsoidTriaxial.init_name("KarneyTest2024")
diffs_karney = []
# examples_karney = ne_karney.get_examples((30500, 40500))
examples_karney = ne_karney.get_random_examples(2)
for example in examples_karney:
beta0, lamb0, alpha0, beta1, lamb1, alpha1, s = example
try:
alpha0_num, alpha1_num, s_num = gha2_num(ell, beta0, lamb0, beta1, lamb1, n=4000, iter_max=10)
diffs_karney.append((wu.rad2deg(abs(alpha0-alpha0_num)), wu.rad2deg(abs(alpha1-alpha1_num)), abs(s-s_num)))
except:
print(f"Fehler für {beta0}, {lamb0}, {beta1}, {lamb1}")
diffs_karney = np.array(diffs_karney)
print(diffs_karney)
pass