MTECBS / utils /midpoint.py
yan123yan
update midpoint function
cc9df09
raw
history blame
10.1 kB
import numpy as np
class MidPoint():
def __init__(self, j):
self.j = j
def initial(self):
j = self.j
#init parameters
h, b, n, u = 0.1, None, None, None
x, y, z, px, py, pz = None, 0.1, 0.001, 0.01, None, 0.0001
xa, ya, za, pxa, pya, pza = None, None, None, None, None, None
if j == 1:
b = 5.0 / 4
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 10.0
py = 0.5
elif j == 2:
b = 3.0 / 4
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 8.3
py = 0.6
elif j == 3:
b = 3.0 / 2
x = 12.0
py = 0.4
elif j == 4:
b = 7.0 / 4
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 15.0
py = 0.35
elif j == 5:
b = 1.0
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 18.0
py = 0.3
elif j == 6:
b = 3.0 / 5
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 20.0
py = 0.25
elif j == 7:
b = 5.0 / 7
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 22.0
py = 0.22
elif j == 8:
b = 2.0
x = 26.0
py = 0.2
elif j == 9:
b = 0.5
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 30.0
y = 0.5
z = 0.1
pz = 0.01
elif j == 10:
b = 5.0
n = b / (1 + b) ** 2
u = 1.0 / (1.0 / b + b + 2.0)
x = 35.0
y = 2.0
z = 0.1
pz = 0.03
py = 0.15
xa, ya, za, pxa, pya, pza = x, y, z, px, py, pz
return j, h, b, n, x, y, z, xa, ya, za, px, py, pz, pxa, pya, pza
def f(self, x, y, z, px, py, pz, b):
n = b / (1 + b) ** 2
u = 1 / (1 / b + b + 2)
ht = px ** 2 / 2 + py ** 2 / 2 + pz ** 2 / 2
hv = -1 / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
h1pn = 1 / (2 * x ** 2 + 2 * y ** 2 + 2 * z ** 2) - (((u + 3) * (px ** 2 + py ** 2 + pz ** 2)) / 2 + (u * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) ** 2) / 2) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + ((3 * u) / 8 - 1 / 8) * (
px ** 2 + py ** 2 + pz ** 2) ** 2
e = ht + hv + h1pn
vnpx = px
v1pnpx = 4 * px * ((3 * n) / 8 - 1 / 8) * (px ** 2 + py ** 2 + pz ** 2) - (px * (n + 3) + (n * x * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2))) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2)) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
vpx = vnpx + v1pnpx
vnpy = py
v1pnpy = 4 * py * ((3 * n) / 8 - 1 / 8) * (px ** 2 + py ** 2 + pz ** 2) - (py * (n + 3) + (n * y * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2))) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2)) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
vpy = vnpy + v1pnpy
vnpz = pz
v1pnpz = 4 * pz * ((3 * n) / 8 - 1 / 8) * (px ** 2 + py ** 2 + pz ** 2) - (pz * (n + 3) + (n * z * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2))) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2)) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
vpz = vnpz + v1pnpz
vnx = x / (x ** 2 + y ** 2 + z ** 2) ** (3 / 2)
v1pnx = (x * ((n * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) ** 2) / 2 + (
(n + 3) * (px ** 2 + py ** 2 + pz ** 2)) / 2)) / (x ** 2 + y ** 2 + z ** 2) ** (
3 / 2) - (4 * x) / (2 * x ** 2 + 2 * y ** 2 + 2 * z ** 2) ** 2 + (n * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) * ((px * x ** 2) / (
x ** 2 + y ** 2 + z ** 2) ** (3 / 2) - px / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * x * y) / (
x ** 2 + y ** 2 + z ** 2) ** (
3 / 2) + (
pz * x * z) / (
x ** 2 + y ** 2 + z ** 2) ** (
3 / 2))) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
vx = vnx + v1pnx
vny = y / (x ** 2 + y ** 2 + z ** 2) ** (3 / 2)
v1pny = (y * ((n * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) ** 2) / 2 + (
(n + 3) * (px ** 2 + py ** 2 + pz ** 2)) / 2)) / (x ** 2 + y ** 2 + z ** 2) ** (
3 / 2) - (4 * y) / (2 * x ** 2 + 2 * y ** 2 + 2 * z ** 2) ** 2 + (n * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) * ((py * y ** 2) / (
x ** 2 + y ** 2 + z ** 2) ** (3 / 2) - py / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (px * x * y) / (
x ** 2 + y ** 2 + z ** 2) ** (
3 / 2) + (
pz * y * z) / (
x ** 2 + y ** 2 + z ** 2) ** (
3 / 2))) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
vy = vny + v1pny
vnz = z / (x ** 2 + y ** 2 + z ** 2) ** (3 / 2)
v1pnz = (z * ((n * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) ** 2) / 2 + (
(n + 3) * (px ** 2 + py ** 2 + pz ** 2)) / 2)) / (x ** 2 + y ** 2 + z ** 2) ** (
3 / 2) - (4 * z) / (2 * x ** 2 + 2 * y ** 2 + 2 * z ** 2) ** 2 + (n * (
(px * x) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (py * y) / (x ** 2 + y ** 2 + z ** 2) ** (
1 / 2) + (pz * z) / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2)) * ((pz * z ** 2) / (
x ** 2 + y ** 2 + z ** 2) ** (3 / 2) - pz / (x ** 2 + y ** 2 + z ** 2) ** (1 / 2) + (px * x * z) / (
x ** 2 + y ** 2 + z ** 2) ** (
3 / 2) + (
py * y * z) / (
x ** 2 + y ** 2 + z ** 2) ** (
3 / 2))) / (
x ** 2 + y ** 2 + z ** 2) ** (1 / 2)
vz = vnz + v1pnz
return vx, vy, vz, vpx, vpy, vpz, e
def implecitsymplectic(self, h, x, y, z, px, py, pz, b):
x1 = x
y1 = y
z1 = z
px1 = px
py1 = py
pz1 = pz
num = 0
d = 1.1
while (d > 1e-16 and num < 1000):
px2 = px
py2 = py
pz2 = pz
x2 = x
y2 = y
z2 = z
x = (x1 + x) / 2
y = (y1 + y) / 2
z = (z1 + z) / 2
px = (px1 + px) / 2
py = (py1 + py) / 2
pz = (pz1 + pz) / 2
vx, vy, vz, vpx, vpy, vpz, e = self.f(x, y, z, px, py, pz, b)
x = x1 + h * vpx
y = y1 + h * vpy
z = z1 + h * vpz
px = px1 - h * vx
py = py1 - h * vy
pz = pz1 - h * vz
d = np.sqrt(np.abs(x - x2) + np.abs(y - y2) + np.abs(z - z2) + np.abs(px - px2) + np.abs(py - py2) + np.abs(
pz - pz2))
num += 1
#print(num, d)
return x, y, z, px, py, pz