Various body price for python animation
Hello so I am looking to animate a 3 frame gravity downside factor. I were given it to kinda paintings however since I used adaptive step dimension, every time the our bodies get nearer in combination, they decelerate. I am not too positive tips on how to repair this. I regarded into visible bundle however I do not truly comprehend it. Does any person have any concept?
The next is my code
#~~~IMPORTS~~~#
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from IPython.show import set_matplotlib_formats
from IPython.show import HTML
set_matplotlib_formats(‘svg’, high quality=50)
plt.determine(facecolor=’white’)
#thers’s six equation dr/dt = v and dv/dt = gm~~~~~~
​
#—-CREATE FUNCTION BASED ON FIRST-ORDER EQUATION—-#
def f(r,t): #SIX INPUTS
x1o = r[0]
y1o = r[1]
vx1o = r[2]
vy1o = r[3]
​
x2o = r[4]
y2o = r[5]
vx2o = r[6]
vy2o = r[7]
​
x3o = r[8]
y3o = r[9]
vx3o = r[10]
vy3o = r[11]
​
x11 = vx1o
y11 = vy1o
x21 = vx2o
y21 = vy2o
x31 = vx3o
y31 = vy3o
​
ihatethis1 = np.sqrt((x2o-x1o)**2+(y2o-y1o)**2)
ihatethis2 = np.sqrt((x3o-x1o)**2+(y3o-y1o)**2)
ihatethis4 = np.sqrt((x2o-x3o)**2+(y2o-y3o)**2)
​
vx11 = G*m2*((x2o-x1o)/ihatethis1**3) + G*m3*((x3o-x1o)/ihatethis2**3)
vy11 = G*m2*((y2o-y1o)/ihatethis1**3) + G*m3*((y3o-y1o)/ihatethis2**3)
​
vx21 = G*m1*((x1o-x2o)/ihatethis1**3) + G*m3*((x3o-x2o)/ihatethis4**3)
vy21 = G*m1*((y1o-y2o)/ihatethis1**3) + G*m3*((y3o-y2o)/ihatethis4**3)
​
vx31 = G*m1*((x1o-x3o)/ihatethis2**3) + G*m2*((x2o-x3o)/ihatethis4**3)
vy31 = G*m1*((y1o-y3o)/ihatethis2**3) + G*m2*((y2o-y3o)/ihatethis4**3)
​
go back np.array([x11,y11,vx11,vy11,x21,y21,vx21,vy21,x31,y31,vx31,vy31])
def RKstep(r0,t0,dt):
k1 = dt*f(r0,t0)
k2 = dt*f(r0 + 0.5*k1,t0+0.5*dt)
k3 = dt*f(r0 + 0.5*k2,t0+0.5*dt)
k4 = dt*f(r0 + k3,t0+dt)
r1 = r0 + (k1+ 2*k2 + 2*k3 + k4)/6
go back r1
​
def adaptivestep(r0,t0,dt):
r_half = RKstep(r0,t0,0.5*dt)
r_1 = RKstep(r_half,t0+0.5*dt,0.5*dt)
r_2 = RKstep(r0,t0,dt)
epsilon = 1.0e-5
trytofindmax = np.array ( [ abs(r_1[0]-r_2[0]), abs(r_1[1]-r_2[1]),abs(r_1[4]-r_2[4]),abs(r_1[5]-r_2[5]),abs(r_1[8]-r_2[8]),abs(r_1[9]-r_2[9])] )
rho = 30*epsilon*dt/trytofindmax.max() #exchange r to x and y np.max array of the every plant x and y variations
dt_ideal = dt*rho**0.25
​
is_acc = 1
if rho < 1:
is_acc = 0
# We will additionally test that our step dimension is not expanding via greater than double
if dt_ideal > 2.0*dt:
dt_ideal = 2.0*dt
# And test that our step dimension is not more than our max allowed price
if dt_ideal > dtmax:
dt_ideal = dtmax
# in spite of everything we will be able to make a listing containing the brand new state (r_1) and step dimension
# dt_ideal
state_dt = [r_1, dt_ideal, is_acc]
go back state_dt
​
#~~~CONSTANT~~~#
G = 1;
m1 = 150;
m2 = 200;
m3 = 250;
​
#~~~INITIAL POSITION IN X AND Y FOR EACH MASS~~~#
#r1o = (3,1);
#r2o = (-1,-2);
#r3o = (-1, 1);
x1o = 3;
y1o = 1;
vy1o = 0;
vx1o = 0;
​
x2o = -1;
y2o = -2;
vy2o = 0;
vx2o = 0;
x3o = -1;
y3o = 1;
vy3o = 0;
vx3o = 0;
r0 = np.array([x1o,y1o,vx1o,vy1o,x2o,y2o,vx2o,vy2o,x3o,y3o,vx3o,vy3o])
#~~~TIME STUF~~~#
”’to = 0.0;
tmax = 2;
nstep = 100;
dt = (tmax – to)/nstep;
t = np.linspace(to, tmax, nstep);”’
t0 = 0.0
nstep = 1000
dtmax = .06
dt = 0.03
dt_noa = dtmax/10.0
t_current = t0
t = []
# we additionally need instances for the fundamental Runge-Kutta approach
# (noa as in no adaptive step dimension)
t_current_noa = t0
t_noa = []
r_rk_noa = np.empty([12,nstep])
r_rk = np.empty([12,nstep]);
is_acc = 0
for ok in vary(nstep):
if ok == 0:
# Assign preliminary values
r_rk[:,k] = r0
r_rk_noa[:,k] = r0
else:
# carry out the fundamental Runge-Kutta
r_rk_noa[:,k] = RKstep(r_rk_noa[:,k-1],t_current_noa,dt_noa)
# carry out the adaptive step dimension
is_acc = 0
whilst is_acc == 0:
# repeat the method if the step dimension was once too huge and the outcome
# didn’t meet the accuracy threshold
next_step = adaptivestep(r_rk[:,k-1],t_current,dt)
r_rk[:,k] = next_step[0]
dt = next_step[1]
is_acc = next_step[2]
# replace the present instances and upload the ones instances to the time lists
t.append(t_current)
t_current += dt
t_noa.append(t_current_noa)
t_current_noa += dt_noa
”’for ok in vary(nstep):
if ok == 0:
r_rk[k] = r0
else:
r_rk[k] = RKstep(r_rk[k-1],t[k],dt)”’
x_11_rk = r_rk[0]
y_11_rk = r_rk[1]
vx_11_rk = r_rk[2]
vy_11_rk = r_rk[3]
​
x_21_rk = r_rk[4]
y_21_rk = r_rk[5]
vx_21_rk = r_rk[6]
vy_21_rk = r_rk[7]
​
x_31_rk = r_rk[8]
y_31_rk = r_rk[9]
vx_31_rk = r_rk[10]
vy_31_rk = r_rk[11]
”’
x_11_rk_noa = r_rk_noa[0]
y_11_rk_noa = r_rk_noa[1]
vx_11_rk_noa = r_rk_noa[2]
vy_11_rk_noa = r_rk_noa[3]
​
x_21_rk_noa = r_rk_noa[4]
y_21_rk_noa = r_rk_noa[5]
vx_21_rk_noa = r_rk_noa[6]
vy_21_rk_noa = r_rk_noa[7]
​
x_31_rk_noa = r_rk_noa[8]
y_31_rk_noa = r_rk_noa[9]
vx_31_rk_noa = r_rk_noa[10]
vy_31_rk_noa = r_rk_noa[11]
t = np.array(t)
t_noa = np.array(t_noa)”’
#====ANIMATION====#
fig, ax = plt.subplots()
# Set the boundaries of our plot.
ax.set_xlim(( -20, 20))
ax.set_ylim((-20, 20))
#ax.set_aspect(1)
# Create a marker. That is the purpose we’re going to transfer round
line1, = ax.plot([], [], ‘r.’,ms=10)
line2, = ax.plot([], [], ‘b.’,ms=12)
line3, = ax.plot([], [], ‘g.’,ms=14)
def init():
line1.set_data([], [])
line2.set_data([], [])
line3.set_data([], [])
go back (line1,line2,line3,)
def animate(n):
x11 = x_11_rk[n]
y11 = y_11_rk[n]
​
x21 = x_21_rk[n]
y21 = y_21_rk[n]
​
x31 = x_31_rk[n]
y31 = y_31_rk[n]
​
line1.set_data(x11,y11)
line2.set_data(x21,y21)
line3.set_data(x31,y31)
go back (line1,line2,line3,)
#loop via time
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=len(t), period=40,
blit=True)
HTML(anim.to_jshtml())
View Reddit via TheDoldrumArea – View Supply