Projekt aufgeräumt, gha1 getestet, Runge-Kutta angepasst (gha2_num sollte jetzt deutlich schneller sein)
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user