Callister
Callister

Reputation: 21

Simulating the trajectory of a particle from rest under gravity

I hope you can help! I need to show the trajectory of a particle that is under gravity of g = -9.81 m/s2 and time step of dt = 0.05 sec, where the position and velocity of the particle are:

  1. x_1 = x_0 + v_x1 * dt
  2. y_1 = y_0 + v_y1 * dt
  3. v_x1 = v_x0
  4. v_y1 = v_y0 + g * dt

This is what I should achieve: enter image description here This is what I've done so far:

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1, figsize=(12,12))
ax = plt.subplot(111, aspect='equal')
ax.set_ylim(0,50)
ax.set_title('Boom --- Weeee! --- Ooof')

r = np.array([0.,0.,15.,30.])
g = -9.81
dt = 0.05
y = 0
x = 0
while y > 0:
    plt.plot(x_1,y_2,':', ms=2)
    x_1 = v_x1 * dt
    y_1 = v_y1 * dt
    v_x1 = v_x0
    v_y1 = v_y0 + g * dt

This doesn't produce an image only the plt.figure stated in the beginning, I've tried to integrate the r vector into the loop but I can't figure out how.

Thank you.

Upvotes: 1

Views: 659

Answers (1)

CryptoFool
CryptoFool

Reputation: 23089

Here's a modified version of your code that I believe gives you the result you desire (you may want to choose different initial velocity values):

import matplotlib.pyplot as plt

# Set up our plot surface
plt.figure(1, figsize=(12,12))
ax = plt.subplot()
# ax = plt.subplot(111, aspect='equal')
# ax.set_ylim(0,50)
ax.set_title('Boom --- Weeee! --- Ooof')

# Initial conditions
g = -9.81
dt = 0.05
y = 0
x = 0
v_x = 5
v_y = 5

# Create our lists that will store our data points
points_x = []
points_y = []

while True:

    # Add the current position of our projectile to our data
    points_x.append(x)
    points_y.append(y)

    # Move our projectile along
    x += v_x * dt
    y += v_y * dt

    # If our projectile falls below the X axis (y < 0), end the simulation
    if y < 0:
        break

    # Update our y velocity per gravity
    v_y = v_y + g * dt

# Plot our data
ax.plot(points_x, points_y)

# Show the plot on the screen
plt.show()

I'm sorry if I could have made fewer changes. Here are the substantive ones I can think of:

  • You weren't using the r value you computed, so got rid of it, along with the import of numpy that was then no longer needed.

  • I took out calls you made explicitly size your plot. You're better off letting the plot library decide upon the bounds of the plot for you

  • I don't know if there's another way to do it, but I've always supplied data to the plotting library as arrays of points rather than by providing the points one at a time. So here, I collect up all of the x and y coordinates into two lists while running the simulation, and then add those arrays to the plot at the end to plot the data.

  • The x_0 vs x_1, etc., got confusing for me. I didn't see any reason to keep track of multiple position and velocity values, so I reduced the code down to using just one set of positions and velocities, x, y, v_x and v_y.

  • See the comments for more info

Result: resulting plot

Upvotes: 2

Related Questions