简单的摆锤模拟,结果与实际不符,找不到错误

时间:2019-05-17 17:54:03

标签: python numpy simulation

我在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)

0 个答案:

没有答案