我正在尝试求解类似d2(phi)/dt = -(g/R) *sin(phi)的钟摆式微分方程(这是泰勒经典力学中的滑板问题)。我是scipy和odeint等的新手,所以我这样做是为了将来为更复杂的数值解决方案做准备。

我使用了here中的代码来尝试浏览代码,但是我想出的只是phi(t)的一条平线。我认为这是因为我试图将一个二阶微分方程分解为两个一阶,其中一个不依赖于另一个(因为d(phi)/ dt出现)。但我不确定该如何解决。

有人知道这是怎么回事吗?

    # integrate skateboard problem, plot result
    from numpy import *
    from scipy.integrate import odeint
    import matplotlib.pyplot as plt

    def skate(y, t, params):
        phi, omega = y
        g, R = params
        derivs = [omega, -(g/R)*np.sin(phi)]
        return derivs

   # Parameters
   g = 9.81
   R = 5
   params = [g, R]

   #Initial values
   phi0 = 20
   omega0 = 0
   y0 = [phi0, omega0]

   t = linspace(0, 20, 5000)

   solution = odeint(skate, y0, t, args=(params,))

   plt.plot(t, solution[:,0])
   plt.xlabel('time [s]')
   plt.ylabel('angle [rad]')
   plt.show()

最佳答案

我怀疑这里有一个错误:-(g / R)* np.sin(phi)。也许您忘记为numpy lib import定义别名(例如:import numpy as np)。相反,您只是做了(从numpy import *)。尝试这个:

def skate(y, t, params):
    phi, omega = y
    g, R = params
    derivs = [omega, -(g/R)*sin(phi)]
    return derivs

关于python - 钟摆式积分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33249327/

10-10 14:13