我在youtube上观看了3Blue1Brown的频道(微分方程概述|第1章)。 该视频正在谈论模拟摆,我尝试编写代码,但出现奇怪的结果。 我基本上从视频中复制了代码,并添加了更多内容。
====
我正在尝试模拟这个微分方程:
这是数学符号而不是编程:)
theta_double_dot = -mu * theta_dot-(g / L)* sin(theta)
意思:
theta:=角度,theta_dot:=角速度,theta_double dot:=角加速度,mu:=空气摩擦常数,g:=重力常数,L:=摆的长度
delta_t:=是时间步长
====
初始条件: theta:= 60度,theta_dot:= 0速度
问题1:
test1的值:
g = 9.8,L = 2,mu = 0.09,delta_t = 0.01
结果:加速永久运动自由能4每个人:)
test2的值:
g = 9.8,L = 2,mu = 0.01(空气摩擦力小于上述测试),delta_t = 0.01
结果:这是更现实的
更多的空气阻力,更多的系统倾向于永动机和自由能?!
问题2:
无论我选择用于调用theta(..some value here..)
的任何值,模拟总是以相同的值结束。
问题3 :(还有一些其他问题):如何使代码更快? 我认为append的操作确实很昂贵,因为每次数组都要复制。
import numpy as np
import matplotlib.pyplot as plt
# Physical constants
g = 9.8
L = 2
mu = 0.1
# Initial conditions
THETA_0 = np.pi / 3 # 60 degrees
THETA_DOT_0 = 0 # No initial angual velocity
theta_values = np.array([])
theta_dot_values = np.array([])
theta_double_dot_values = np.array([])
# Definition of ODE
def get_theta_double_dot(theta, theta_dot):
return -mu * theta_dot - (g / L) * np.sin(theta)
def print_graph(t, delta_t):
plt.plot(np.arange(0, t, delta_t), theta_values, label='theta')
plt.plot(np.arange(0, t, delta_t), theta_dot_values, label='theta_dot')
plt.plot(np.arange(0, t, delta_t), theta_double_dot_values, label='theta_double_dot')
plt.legend()
plt.show()
# Solution to the differential equation
def theta(t):
# Initialize changing values
global theta_values
global theta_dot_values
global theta_double_dot_values
theta = THETA_0
theta_dot = THETA_DOT_0
delta_t = 0.001 # Some time step
for time in np.arange(0, t, delta_t):
theta_double_dot = get_theta_double_dot(theta, theta_dot)
# saving values into arrays, this is for printing results
theta_values = np.append(theta, theta_values)
theta_dot_values = np.append(theta_dot, theta_dot_values)
theta_double_dot_values = np.append(theta_double_dot, theta_double_dot_values)
# updating thetas values
theta += theta_dot * delta_t
theta_dot += theta_double_dot * delta_t
print_graph(t, delta_t)
return theta
theta(15)