我试图从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()
答案 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()函数,以确保它为给定的输入返回正确的输出。
对程序中的所有其他操作重复,您将能够进一步隔离问题,这是解决问题的重要步骤。