В предыдущий раз мы решили задачу о математическом маятнике, а именно систему дифференциальных уравнений с помощью встроенных в Python средств. Код ниже (копируется по клику в верхнем правом углу полотна с кодом или см. файл из тг) позволяет построить анимацию с маятником, для которого получена зависимость от времени угла отклонения от вертикали. Файл с кодом также можно скопировать из тг-канала. Видео с пояснениями кода с решением системы дифуров и кода ниже.
import numpy as np
import scipy
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def sys_x(z,t):
phi,omega = z
dphi_dt=omega
domega_dt=-g*np.sin(phi)/L-rd*omega
return [dphi_dt, domega_dt]
g=9.81
L=1
m=1
V0=0
w0=V0/L
gamma_=90
gamma=gamma_*np.pi/180
alpha=0.00
rd=alpha/m
z0x=[gamma,w0] #начальные условия
td=10 #длительность колебаний
t_eval=np.linspace(0,td,800)
sol_phi=scipy.integrate.odeint(sys_x,z0x,t_eval)
phi=sol_phi[:,0]
omega=sol_phi[:,1]
phi_acc=gamma*np.cos(np.power(g/L,0.5)*t_eval)
N=len(t_eval)
fig=plt.figure()
ax=plt.axes(xlim=(-3, 3), ylim=(-3,3))
line1,=plt.plot([],[],color='red',label='При точном решении',marker='*')
line2,=plt.plot([],[],color='blue',label=f'При приближённом решении',marker='o')
T_text = ax.text(0.05, 0.95, '', transform=ax.transAxes, fontsize=12, verticalalignment='top')
def line_func():
line1.set_data([],[])
line2.set_data([],[])
T_text.set_text('')
return line1,line2
def anim_line(frame):
t=phi[frame]
x=L*np.sin(t)
y=L*np.cos(t)
x0=[0,x]
x1=[0+2,-y]
t2=phi_acc[frame]
xx=L*np.sin(t2)
yy=L*np.cos(t2)
y0=[0,xx]
y1=[0+2,-yy]
line1.set_data(x0,x1)
line2.set_data(y0,y1)
T_text.set_text(f't={np.round(t_eval[frame],3)},\ngamma={gamma_}')
return line1,line2,T_text
anim=animation.FuncAnimation(fig,anim_line,frames=N,init_func=line_func,interval=5,blit=True,repeat=True)
plt.title('Движение математического маятника')
plt.grid(True)
plt.legend(loc=8)
plt.show()
#anim.save(r'c:\Users\User\Desktop\animation.gif', writer='pillow', fps=35)