我正在尝试制作一个动画来展示简谐振子的行为,我希望这个动画是下面两个图的组合,也就是说,我希望红色的方块上下移动,而在同一个图上,我希望蓝色的线逐渐显示。
Red squareLine
这就是我遇到的问题。我不能让我的代码同时为它们制作动画
这是我用来让方块上下移动的代码
%matplotlib notebook
import itertools
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
plt.rcParams["figure.figsize"] = 9,6
x_0, v_0, k, m = 1,2,1,2
omega = np.sqrt(k/m)
def HA(t):
xt = x_0*np.cos(omega*t) + (v_0/omega)*np.sin(omega*t)
return np.array([t, xt])
# create a figure with an axes
fig, ax = plt.subplots()
# set the axes limits
ax.axis([0.0,50,-4,4])
# create a point in the axes
point, = ax.plot(0,x_0, marker="s", color = 'red', markersize=20)
t_vector = np.linspace(0,50, 100)
xt_vector = x_0*np.cos(omega*t_vector) + (v_0/omega)*np.sin(omega*t_vector)
# Updating function, to be repeatedly called by the animation
def update(t):
#Point coordinates
t,xt = HA(t)
point.set_data([0],[xt])
return point
ani = animation.FuncAnimation(fig, update, interval=500, blit=True, repeat=True,frames=t_vector.size)
plt.axhline(y=0.0, color='black', linestyle='--', label = "Equilibrium")
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r"$x(t)$", fontsize=16)
plt.legend()
#ani.save('Square.mp4', writer = 'ffmpeg', fps = 10)
plt.show()
这是我用来写这行代码的
plt.rcParams["figure.figsize"] = 9,6
x_0, v_0, k, m = 1,2,1,2
omega = np.sqrt(k/m)
def HA(t):
xt = x_0*np.cos(omega*t) + (v_0/omega)*np.sin(omega*t)
return np.array([t, xt])
# create a figure with an axes
fig, ax = plt.subplots()
# set the axes limits
ax.axis([0.0,50,-4,4])
line, = ax.plot([], [], color="blue")
t_vector = np.linspace(0,50, 100)
xt_vector = x_0*np.cos(omega*t_vector) + (v_0/omega)*np.sin(omega*t_vector)
# Updating function, to be repeatedly called by the animation
def update(t):
line.set_data(t_vector[:t], xt_vector[:t])
return line
ani = animation.FuncAnimation(fig, update, interval=500, blit=True, repeat=True,frames=t_vector.size)
plt.axhline(y=0.0, color='black', linestyle='--', label = "Equilibrium")
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r"$x(t)$", fontsize=16)
plt.legend()
#ani.save('Line.mp4', writer = 'ffmpeg', fps = 10)
plt.show()
我试着把它们结合起来,但是虽然这不会给予任何错误,但得到的图不会移动。我是一个新手,当谈到动画与matplotlib,我检查了类似的问题,我可以找到,但没有帮助我。我不能扩展他们的答案,以获得对我有用的东西。
plt.rcParams["figure.figsize"] = 9,6
x_0, v_0, k, m = 1,2,1,2
omega = np.sqrt(k/m)
def HA(t):
xt = x_0*np.cos(omega*t) + (v_0/omega)*np.sin(omega*t)
return np.array([t, xt])
# create a figure with an axes
fig, ax = plt.subplots()
ax.axis([0.0,50,-4,4])
# create a point in the axes
point, = ax.plot(0,x_0, marker="s", color = 'red', markersize=20)
line, = ax.plot([], [], color="blue")
t_vector = np.linspace(0,50, 100)
xt_vector = x_0*np.cos(omega*t_vector) + (v_0/omega)*np.sin(omega*t_vector)
# Updating function, to be repeatedly called by the animation
def update(t):
t,xt = HA(t)
line.set_data(t_vector[:t], xt_vector[:t])
point.set_data([0],[xt])
return line, point
ani = animation.FuncAnimation(fig, update, interval=500, blit=True, repeat=True,frames=t_vector.size)
plt.axhline(y=0.0, color='black', linestyle='--', label = "Equilibrium")
plt.xlabel(r'$t$', fontsize=18)
plt.ylabel(r"$x(t)$", fontsize=16)
plt.legend()
plt.show()
你能帮帮我吗?
1条答案
按热度按时间cld4siwp1#
我试着只把它们两者结合起来,但虽然这不会给予出任何错误,但由此产生的情节并没有移动。
在update函数中,在
t, xt = HA(t)
之后,t
是一个浮点数。要使t_vector[:t]
和xt_vector[:t]
工作,必须将其转换回整数值。请注意,
HA()
函数只返回xt
值而不是np.array([t, xt])
可能更有意义。通过执行此小编辑,我获得了一个工作动画:
然而,假设红色矩形应该沿着Y轴沿着蓝线的尖端,这看起来不太好。
这是因为直线是根据
xt_vector
绘制的,矩形是根据xt
值(由HA()
函数返回)绘制的。两个公式相同,但t
不同:在np.linspace(0, 50, 100)
中为t
计算xt_vector
,而在np.range(0, nb_frame)
中为t
计算xt
(这里nb_frame
= 100)。底线:按如下方式更改
update
函数应该有效