模拟粒子在重力作用下静止的轨迹
Simulating the trajectory of a particle from rest under gravity
希望对您有所帮助!我需要显示在 g = -9.81
m/s2 重力和 dt = 0.05
秒的时间步长下的粒子轨迹,其中位置和粒子的速度是:
x_1 = x_0 + v_x1 * dt
y_1 = y_0 + v_y1 * dt
v_x1 = v_x0
v_y1 = v_y0 + g * dt
这是我应该实现的:
这是我到目前为止所做的:
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
这不会只生成开头所述的 plt.figure
图像,我尝试将 r
矢量整合到循环中,但我不知道如何做。
谢谢。
这是您的代码的修改版本,我相信它可以为您提供所需的结果(您可能希望选择不同的初始速度值):
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()
如果我可以做更少的更改,我很抱歉。以下是我能想到的实质性的:
你没有使用你计算的 r
值,所以去掉它,连同当时不再需要的 numpy 的导入。
我删除了您明确确定情节大小的电话。你最好让绘图库为你决定绘图的范围
我不知道是否有其他方法可以做到这一点,但我一直将数据作为点数组提供给绘图库,而不是一次提供一个点。所以在这里,我在 运行 模拟时将所有 x 和 y 坐标收集到两个列表中,然后将这些数组添加到最后的绘图中以绘制数据。
x_0
与 x_1
等让我感到困惑。我看不出有任何理由要跟踪多个位置和速度值,所以我将代码缩减为仅使用一组位置和速度,x
、y
、v_x
和 v_y
.
查看评论了解更多信息
结果:
希望对您有所帮助!我需要显示在 g = -9.81
m/s2 重力和 dt = 0.05
秒的时间步长下的粒子轨迹,其中位置和粒子的速度是:
x_1 = x_0 + v_x1 * dt
y_1 = y_0 + v_y1 * dt
v_x1 = v_x0
v_y1 = v_y0 + g * dt
这是我应该实现的:
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
这不会只生成开头所述的 plt.figure
图像,我尝试将 r
矢量整合到循环中,但我不知道如何做。
谢谢。
这是您的代码的修改版本,我相信它可以为您提供所需的结果(您可能希望选择不同的初始速度值):
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()
如果我可以做更少的更改,我很抱歉。以下是我能想到的实质性的:
你没有使用你计算的
r
值,所以去掉它,连同当时不再需要的 numpy 的导入。我删除了您明确确定情节大小的电话。你最好让绘图库为你决定绘图的范围
我不知道是否有其他方法可以做到这一点,但我一直将数据作为点数组提供给绘图库,而不是一次提供一个点。所以在这里,我在 运行 模拟时将所有 x 和 y 坐标收集到两个列表中,然后将这些数组添加到最后的绘图中以绘制数据。
x_0
与x_1
等让我感到困惑。我看不出有任何理由要跟踪多个位置和速度值,所以我将代码缩减为仅使用一组位置和速度,x
、y
、v_x
和v_y
.查看评论了解更多信息
结果: