---
# System prepended metadata

title: Planar Gravitational 3-body problem

---


# Planar Gravitational 3-body problem
In this problem we can separate into four ODE which is 
\begin{equation}
	\begin{split}
		\dfrac{dx}{dt} &= v_x \\
		\dfrac{dy}{dt} &= v_y \\
		\dfrac{dv_x}{dt} &= 2\omega v_y + \omega^2x 
		- \dfrac{GM_1(x+a_1)}{[(x+a_1)^2+y^2]^{3/2}}
		- \dfrac{GM_2(x-a_2)}{[(x-a_2)^2+y^2]^{3/2}} \\
		\dfrac{dv_y}{dt} &= -2\omega v_x + \omega^2y 
		- \dfrac{GM_1y}{[(x+a_1)^2+y^2]^{3/2}}
		- \dfrac{GM_2y}{[(x-a_2)^2+y^2]^{3/2}}
	\end{split}
    \tag{1}
\end{equation}
Using normalize unit ($[t]=1/\omega$ and $[v]=a_1\omega$) we can reduce above four equation into a set of equation that only  contain 3 parameter.
\begin{equation}
	\begin{split}
		\dfrac{dx}{d\tau} &= v_x \\
		\dfrac{dy}{d\tau} &= v_y \\
		\dfrac{dv_x}{d\tau} &= 2 v_y + x 
		- \dfrac{GM_1(x+1)}{[(x+1)^2+y^2]^{3/2}}
		- \dfrac{GM_2(x-a_2)}{[(x-a_2)^2+y^2]^{3/2}} \\
		\dfrac{dv_y}{d\tau} &= -2 v_x + y 
		- \dfrac{GM_1y}{[(x+1)^2+y^2]^{3/2}}
		- \dfrac{GM_2y}{[(x-a_2)^2+y^2]^{3/2}}
	\end{split}
    \tag{2}
\end{equation}

## Energy Conservation
Before begin analysis we need to make sure some of the basic physical quantity is conserved, in this case we use energy as a reference for what time step are appropriate in this simulation.


![](https://i.imgur.com/qPD4Fgn.png)

First we randomly place the third mass, and we find out that their asymptotic behavior are very identical.
![](https://i.imgur.com/9SG7jgF.jpg)


We then vary the initial energy, again their asymptotic are very similar. 
![](https://i.imgur.com/V9dcHBr.jpg)


Then we vary the parameter of $a_2$, since we found out that their asymptotic behavior are very similar, we focus on the early dynamics. We find out that with different value of $a_2$, the result can be quite different. But there is still a problem of singularity.

![](https://i.imgur.com/7AtRsyP.jpg)


Same in if we vary the ratio of two stationary mass, we fond out that the early stage of the dynamics are very sensitive to parameter as well as initial condition.
![](https://i.imgur.com/QHLpo5F.jpg)



But in the end what is the reason that almost every system have very similar asymptotic dynamics. I think the reason can be quite clear if we plot the potential of this restricted 3-body problem. 
## Potential
The potential of this system is given by
\begin{equation}
	V=-\dfrac{\omega^2}{2}(x^2+y^2)-\dfrac{GM_1}{r_1}
	-\dfrac{GM_2}{r_2}.
    \tag{3}
\end{equation}
Below I plot different potential for some parameter. If we only consider the effect of the potential, discard the first term in
(2) last two equation, we know that a particle tends to move to the lowest point of potential curve. With that in mind, we found out that the potential in y direction are concave down which means that the particle try to move further away in y direction. Furthermore, potential in x direction also concave down apart from the vicinity of the singularity, so their behavior are very similar to the behavior in y direction.
![](https://i.imgur.com/7bHBoye.png)
![](https://i.imgur.com/fzH4xeb.png)

![](https://i.imgur.com/ssslo8c.png)
![](https://i.imgur.com/gmboNjL.png)

![](https://i.imgur.com/iQqQgpW.png)
![](https://i.imgur.com/nUgWUNo.png)



## Code

```fortran=

program sysrk4
!========================================================
!   purpose: solve system of ode
!
!   methods: rk4
!
!   input: M1, M2, a2
!
!   output: x, y, vx, vy
!
!       date        programer       description of change
!       ====        =========       =====================
!     11/17/20       morrish        original code
!========================================================
    implicit none
    double precision, external :: f1, f2, f3, f4, potential, kinetic
    double precision :: w(4, 4), h, para(3)
    double precision, dimension(:), allocatable :: x, y, vx, vy, t, U, K
    integer :: i, n
    character(len=30) :: filename

    ! read input
    write(*, *) 'M1, M2, a2:'
    read(*, *) para(1), para(2), para(3)
    write(*, *) 'filename'
    read(*, *) filename

    ! time step
    h = 1.d-5
    n = nint(10/h)
    allocate(t(n))
    allocate(x(n))
    allocate(y(n))
    allocate(vx(n))
    allocate(vy(n))
    allocate(U(n))
    allocate(K(n))
    ! parameter
    ! para(1) = 50.d0
    ! para(2) = 30.d0
    ! para(3) = 1.d0
    ! inital value
    t(1) = 0.d0
    x(1) = 0.d0
    y(1) = 5.d0
    vx(1) = 5.d0
    vy(1) = 0.d0
    U(1) = potential(x(1), y(1), para)
    K(1) = kinetic(vx(1), vy(2))

    do i = 1, n-1
        w(1, 1) = h * f1(vx(i))
        w(1, 2) = h * f2(vy(i))
        w(1, 3) = h * f3(x(i), y(i), vy(i), para)
        w(1, 4) = h * f4(x(i), y(i), vx(i), para)

        w(2, 1) = h * f1(vx(i)+.5d0*w(1, 3))
        w(2, 2) = h * f2(vy(i)+.5d0*w(1, 4))
        w(2, 3) = h * f3(x(i)+.5d0*w(1, 1), &
                         y(i)+.5d0*w(1, 2), &
                         vy(i)+.5d0*w(1, 4), &
                         para)
        w(2, 4) = h * f4(x(i)+.5d0*w(1, 1), &
                         y(i)+.5d0*w(1, 2), &
                         vx(i)+.5d0*w(1, 3), &
                         para)

        w(3, 1) = h * f1(vx(i)+.5d0*w(2, 3))
        w(3, 2) = h * f2(vy(i)+.5d0*w(2, 4))
        w(3, 3) = h * f3(x(i)+.5d0*w(2, 1), &
                         y(i)+.5d0*w(2, 2), &
                         vy(i)+.5d0*w(2, 4), &
                         para)
        w(3, 4) = h * f4(x(i)+.5d0*w(2, 1), &
                         y(i)+.5d0*w(2, 2), &
                         vx(i)+.5d0*w(2, 3), &
                         para)

        w(4, 1) = h * f1(vx(i)+w(3, 3))
        w(4, 2) = h * f2(vy(i)+w(3, 4))
        w(4, 3) = h * f3(x(i)+w(3, 1), &
                         y(i)+w(3, 2), &
                         vy(i)+w(3, 4), &
                         para)
        w(4, 4) = h * f4(x(i)+w(3, 1), &
                         y(i)+w(3, 2), &
                         vx(i)+w(3, 3), &
                         para)

        x(i+1) = x(i) + (w(1, 1) + 2.d0 * w(2, 1) + &
                         2.d0 * w(3, 1) + w(4, 1)) / 6.d0
        y(i+1) = y(i) + (w(1, 2) + 2.d0 * w(2, 2) + &
                         2.d0 * w(3, 2) + w(4, 2)) / 6.d0
        vx(i+1) = vx(i) + (w(1, 3) + 2.d0 * w(2, 3) + &
                           2.d0 * w(3, 3) + w(4, 3)) / 6.d0
        vy(i+1) = vy(i) + (w(1, 4) + 2.d0 * w(2, 4) + &
                           2.d0 * w(3, 4) + w(4, 4)) / 6.d0
        U(i+1) = potential(x(i+1), y(i+1), para)
        K(i+1) = kinetic(vx(i+1), vy(i+1))
        t(i+1) = t(i) + h
        ! write(*, '(1a5, 1f5.1)') 'left:', dble(i)/dble(n) * 100
    end do

    open(66, file=trim(filename)//'.dat', status='unknown')
    do i = 1, n
        write(66, *) t(i), x(i), y(i), vx(i), vy(i), U(i), K(i), U(i)+K(i)
    end do
    close(66)
end program sysrk4

function f1(vx)
    implicit none
    double precision :: f1, vx
    f1 = vx
end function

function f2(vy)
    implicit none
    double precision :: f2, vy
    f2 = vy
end function

function f3(x, y, vy, para)
    implicit none
    double precision :: f3, para(3), m1, m2, a2
    double precision :: x, y, vy, G=1.d0
    m1 = para(1)
    m2 = para(2)
    a2 = para(3)
    f3 = 2.d0 * vy + x - G * m1 * (x + 1.d0) / dsqrt(((x + 1.d0)**2 + y**2)**3) - &
         - G * m2 * (x - a2) / dsqrt(((x - a2)**2 + y**2)**3)
end function

function f4(x, y, vx, para)
    implicit none
    double precision :: f4, para(3), m1, m2, a2
    double precision :: x, y, vx, G=1.d0
    m1 = para(1)
    m2 = para(2)
    a2 = para(3)
    f4 = - 2.d0 * vx + y - G * m1 * y / dsqrt(((x + 1.d0)**2 + y**2)**3) - &
         - G * m2 * y / dsqrt(((x - a2)**2 + y**2)**3)
 end function

function potential(x, y, para)
    implicit none
    double precision :: potential, x, y, r1, r2, para(3), m1, m2, a2, G=1.d0
    m1 = para(1)
    m2 = para(2)
    a2 = para(3)
    r1 = dsqrt((x + 1.d0)**2 + y**2)
    r2 = dsqrt((x - a2)**2 + y**2)
    potential = - (x**2 + y**2) / 2.d0 - G * m1 / r1 - G * m2 / r2
end function

function kinetic(vx, vy)
    implicit none
    double precision :: kinetic, vx, vy
    kinetic = .5d0 * (vx**2 + vy**2)
end function
```
