python - Runge Kutta 4 和 python 中的钟摆模拟
问题描述
我正在尝试制作一个 python 程序,该程序使用 runge kutta 4 绘制钟摆摆动。我的方程式是 angular accelartion = -(m*g*r/I) * np.sin(y)
。
请找到我的代码。我对python很陌生。
import numpy as np
import matplotlib.pyplot as plt
m = 3.0
g = 9.8
r = 2.0
I = 12.0
h = 0.0025
l=2.0
cycle = 10.0
t = np.arange(0, cycle, h)
n = (int)((cycle)/h)
initial_angle = 90.0
y=np.zeros(n)
v=np.zeros(n)
def accel(theta):
return -(m*g*r/I)*np.sin(theta)
y[0] = np.radians(initial_angle)
v[0] = np.radians(0.0)
for i in range(0, n-1):
k1y = h*v[i]
k1v = h*accel(y[i])
k2y = h*(v[i]+0.5*k1v)
k2v = h*accel(y[i]+0.5*k1y)
k3y = h*(v[i]+0.5*k2v)
k3v = h*accel(y[i]+0.5*k2y)
k4y = h*(v[i]+k3v)
k4v = h*accel(y[i]+k3y)
y[i+1] = y[i] + (k1y + 2 * k2y + 2 * k3y + k4y) / 6.0
v[i+1] = v[i] + (k1v + 2 * k2v + 2 * k3v + k4v) / 6.0
plt.plot(t, y)
plt.title('Pendulum Motion:')
plt.xlabel('time (s)')
plt.ylabel('angle (rad)')
plt.grid(True)
plt.show()
我现在已经更新了代码。我越来越正弦了。谢谢..
解决方案
您已经应用了 RK4 步骤,就好像您在求解一阶方程一样。您需要将二阶方程转换为一阶系统,然后求解该耦合系统。
v = dy/dt
acceleration = dv/dt
这样RK4中的每一步都有两个组件
k1y = h*v
k1v = h*accel(y)
k2y = h*(v+0.5*k1v)
k2v = h*accel(y+0.5*k1y)
等等
完整的代码给出了一个很好的正弦波
import numpy as np
import matplotlib.pyplot as plt
m = 3.0
g = 9.8
r = 2.0
I = 12.0
h = 0.0025
l=2.0
cycle = 10.0
t = np.arange(0, cycle, h)
# step height h
n = len(t)
initial_angle = 90.0
y=np.zeros(n)
v=np.zeros(n)
def accel(theta): return -(m*g*r/I)*np.sin(theta)
y[0] = np.radians(initial_angle)
v[0] = np.radians(0.0)
for i in range(0, n-1):
k1y = h*v[i]
k1v = h*accel(y[i])
k2y = h*(v[i]+0.5*k1v)
k2v = h*accel(y[i]+0.5*k1y)
k3y = h*(v[i]+0.5*k2v)
k3v = h*accel(y[i]+0.5*k2y)
k4y = h*(v[i]+k3v)
k4v = h*accel(y[i]+k3y)
# Update next value of y
y[i+1] = y[i] + (k1y + 2 * k2y + 2 * k3y + k4y) / 6.0
v[i+1] = v[i] + (k1v + 2 * k2v + 2 * k3v + k4v) / 6.0
plt.plot(t, y)
plt.title('Pendulum Motion:')
plt.xlabel('time (s)')
plt.ylabel('angle (rad)')
plt.grid(True)
plt.show()
推荐阅读
- ruby - 使用 Open3.popen3 等待 Process::Waiter 的 Ruby 死锁
- mysql - 根据上方和下方的值更新字段
- c++ - c++17 parallel algorithms and CMake
- javascript - 无法读取数组中未定义的属性“0”
- python - 按特定键值对python字典中的数组进行排序
- python - 断言包含具有特定长度的字符串的列表
- angular - “AuthGuardService”类型中的属性“canActivate”不能分配给基类型“CanActivate”中的相同属性
- vba - VBA 调用模块 - 如果模块失败则中止进程
- php - 如何使用 sqlsrv_next_result() 检索多条记录?
- python - 即使在 python 中关闭 tkinter 窗口,是否可以运行某些代码?