![](/img/trans.png)
[英]Using 4th order Runge Kutta to solve the 2nd order differential equation of a damped oscillator
[英]using a Python script w 2nd Order Runge Kutta method to solve the equation of a pendulum, how do I add a calculation of the KE, PE, and TE?
我无法弄清楚如何编写脚本来绘制KE,PE和TE。 我在感觉到问题所在的代码部分中包含多个############。
def pendulum_runge_kutta(theta0,omega0,g,tfinal,dt):
# initialize arrays
t = np.arange(0.,tfinal+dt,dt) # time array t
npoints = len(t)
theta = np.zeros(npoints) # position array theta
omega = np.zeros(npoints) # position array omega
Ke = np.zeros(npoints)
Pe = np.zeros(npoints)
L=4
g = 9.81
t2=np.linspace(0,tfinal,1000)
theta0=0.01
omega0=0
# exact solution for
thetaExact = theta0*np.cos((g/L)**(1/2)*t2)
# SECOND ORDER RUNGE_KUTTA SOLUTION
theta[0] = theta0
omega[0] = omega0
#Ke[0] = #######################################
#Pe[0] =######################################
m=1.0
for i in range(npoints-1):
# compute midpoint position (not used!) and velocity
thetamid = theta[i] + omega[i]*dt
omegamid = omega[i] - (g/L)*np.sin(theta[i])*dt/2
# use midpoint velocity to advance position
theta[i+1] = theta[i] + omegamid*dt
omega[i+1] = omega[i] -(g/L)*np.sin(thetamid)*dt/2
###########calculate Ke, Pe, Te############
Ke[i+1] = 0.5*m*(omega[i+1]*L)**2
Pe[i+1] = m*g*L*np.sin(theta[i+1])
Te = Ke+Pe
#plot result of Ke, Pe, Te
pl.figure(1)
pl.plot(t,Ke,'c-',label='kinetic energy')
pl.plot(t,Pe,'m-',label='potential energy')
pl.plot(t,Te,'g-',label='total energy')
pl.title('Ke, Pe, and Te')
pl.legend(loc='lower right')
pl.show()
#now plot the results
pl.figure(2)
pl.plot(t,theta,'ro',label='2oRK')
pl.plot(t2,thetaExact,'r',label='Exact')
pl.grid('on')
pl.legend()
pl.xlabel('Time (s)')
pl.ylabel('Theta')
pl.title('Theta vs Time')
pl.show()
#call function
pendulum_runge_kutta(0.01, 0, 9.8, 12, .1)
中点方法的公式统一应用于一阶系统的所有组件。 因此,中点值和全时间步长的全dt
均应为dt/2
。
势能应包含sin(x)
, C-cos(x)
的积分。 例如,
Pe[i+1] = m*g*L*(1-np.cos(theta[i+1]))
在时间点i+1
的能量公式也适用于时间点0
。 您必须向上移动质量声明,例如在长度L=4
行之后。
最后一点,指示的精确解是针对小角度近似的,对于一般的物理摆没有有限可表示的精确解。 对于给定的theta0=0.01
振幅,较小的角度近似值应该足够好,但是对于较大的摆动,请注意这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.