蟒蛇摆

时间:2015-06-12 13:09:12

标签: python physics equation angle

我试图从Verlet算法中推导出钟摆方程。这就是我使用r作为钟摆的角度,w作为速度,a作为角加速度。 h是时间的增加,我的主要问题是如果我引入低于2的h,程序会一次又一次地向我显示相同的数字。

from math import sin, cos, pi
from pylab import plot,show
h=int(input("h: "))
q=int(input("Angle: "))
l=int(input("Pendulum lenght: "))
r=q*pi/180 #Change the angle from degrees to rad
w=0
g=9.81
a=(-g/l)*sin(r)
y=0
xx=[]
yy=[]
while y>=0:
    r= r+h*w+ (h**2)/2*a
    x= cos(r) #Cartesians
    y= sin(r)
    w= w+ ((h/2)*a)
    a=(-g/l)*sin(r)
    w= w+((h/2)*a)
    xx.append(x)
    yy.append(y)
plot (xx,yy)
show()

2 个答案:

答案 0 :(得分:3)

对于任何物理上合理的摆锤,您的h应小于1(秒)才能正确建模。但是你向int施放了向下舍入,所以得到h=0(没有时间步)。相反,请使用float

h=float(input("h: "))
q=float(input("Angle: "))
l=float(input("Pendulum length: "))

答案 1 :(得分:1)

我不知道物理学的第一件事 - xnx可能有你的答案。

但是,我可以建议您采用功能性方法进行编程吗?

让我们首先封装一个公式:

from math import sin, cos, pi
from pylab import plot,show

def getA(pLen, r):
    g = 9.81
    return (-g / pLen) * sin(r)

然后我们需要让你的程序的其余部分成为一个函数,这样我们就可以在一瞬间做一些非常有用的事情。

def main():
    h=int(input("h: "))
    q=int(input("Angle: "))
    l=int(input("Pendulum lenght: "))
    r=q*pi/180 #Change the angle from degrees to rad
    w=0
    a=getA(l, r)
    y=0
    xx=[]
    yy=[]
    while y>=0:
        r= r+h*w+ (h**2)/2*a
        x= cos(r) #Cartesians
        y= sin(r)
        w= w+ ((h/2)*a)
        a=getA(l, r)
        w= w+((h/2)*a)
        xx.append(x)
        yy.append(y)
    plot (xx,yy)
    show()

# call your main function only when running directly
if __name__ == '__main__':
    main()

现在,假设您的文件名为pendulum.py,请跳转到您的控制台并打开python shell:

>python
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pendulum
>>> pendulum.getA(5, 50)
0.5147794629671083
>>>

您现在可以检查您的getA()函数,以确保它为给定的输入返回正确的输出。

对程序中的所有其他操作重复,您将能够进一步隔离问题,这是解决问题的重要步骤。