使用越级法的简谐运动

计算科学 有限差分 Python
2021-12-23 05:50:33

我必须使用越级方法来解决简单的谐波振荡器,并且我在用代码编写它时遇到了麻烦。这是我们在课堂上得到的

vn+1/2vn1/2Δt=ω02xnxn+1xnΔt=vn+1/2

这是我为代码编写的

import numpy as np
import matplotlib.pyplot as plt
    
m = 1
k = 1
N = 1000  # steps
x0 = 1  # initial position
w=1
    
t = np.linspace(0,100,N) #timestep
dt = t[1]-t[0]

v = 0  # initial velocity
x = x0  # initial position
    
# integration: calculate  v, x for each step
x = np.zeros(N)
v = np.zeros(N)
for i in range(N-1):
    
    v[i+1] = 0.5*v[i]*dt + (-w^2)
    x[i+1] = v[i+1] * dt + x[i]
     
    
plt.figure()    
plt.plot(t, x)
    
plt.xlabel('time')
plt.ylabel('displacement')
plt.show()

从上面的代码中,这是我得到的图表,它与简单的谐波运动完全不同。

从上面的代码中,这是我得到的图表,它与简单的谐波运动完全不同。练习是使用越级法从顶部的图像中获得简谐振子的数值解。我是 python 新手,不知道我哪里出错了或者下一步要去哪里,所以任何帮助都将不胜感激

1个回答

您的代码有一些问题。首先,重铸你写的方程,你有以下关系:

vn+1/2=vn1/2ω02xnΔtxn+1=xn+vn+1/2Δt

不是您实施的。您向前迈出一步的两行应为:

v[i+1] = v[i] + (-w**2) * x[i] * dt
x[i+1] = v[i+1] * dt + x[i]

如果您现在运行代码,您将获得一条直线,因为您没有正确设置初始位置。实际上,当您将x和都设置v为零时,您会覆盖初始条件。初始化应该改为:

# integration: calculate  v, x for each step
x = np.zeros(N)
v = np.zeros(N)
x[0] = x0
v[0] = 0