第一篇:Bazinga:大角度单摆的运动近似(1):小角度近似
第二篇:Bazinga:大角度单摆的运动近似(2):周期的解与椭圆积分
上次我们已经成功解决了周期的表达式以及周期近似,接下来我们把注意力集中到微分方程 的解 上来.此时我们不使用小角度近似,并试图求该微分方程的数值解.在往后的几篇文章中我会把自己的级数解法更新上来.在本文会先用一种我临时受到启发的解法来解决该问题.灵感出自《费曼物理讲义》.
首先对该物理问题所需要的数学基础做一个铺垫.
本文的核心数学思想是线性近似.对于一个已知函数 ,由自变数在 处增加引起的增量 ,此增量可以表示为
在 时高阶无穷小量 ,这时可以定义微分了.不过这里我们采用近似的记法,即当 很小时,
这个近似模型可以很好的运用在运动学中,比如在本文的情况下 ,
所以可以近似的说,当我们的步长 足够小的时候,
注意在这里我们定义 ,这说明了对于任意时刻的角度位移,只要知道它上一刻的角度位移和此刻的角速度就可以得到;而此刻的角速度又由上一刻的角速度和上一刻的角加速度给出.此时牛顿第二定律的微分方程给了我们便利,因为它成功的把角加速度和角度位移联系了起来:
这也就是说
故只要我们知道了前一时刻的角加速度和角度位移,就可以表示出这一时刻的角度位移.此时我们为了化简计算,令常数 .同时为了获得较高的精确度,我们让 .
我们还需要给出初始条件.考虑到我们研究的是单摆在大角度情况下的运动,那么我们令 时 ,而角速度自然是 .
为了画出角度位移随时间变化的图像,我让我同学 @天琴心弦 (编程大佬)帮我写了一段Python代码,从而帮助我画出这个函数:
import numpy as np import matplotlib.pyplot as plt
telement = list() telement.append(np.pi/2) for i in range(1000): telement.append(0) oelement = list() oelement.append(0) for i in range(1000): oelement.append(0)
def theta(n): if n == 0: return telement[n] else: print("This is "+ str(n)) if telement[n] == 0: telement[n] = telement[n - 1] + 0.01 * omega(n)
return telement[n]
def omega(n): if n == 0: return oelement[n] else: if oelement[n] == 0: oelement[n] = oelement[n - 1] - np.sin(telement[n - 1]) * 0.01
return oelement[n]
x = list() for i in range(1000): x.append(i*0.01) y = list() for i in range(1000): y.append(theta(i))
plt.plot(x, y) plt.show()
运行之后大概是这个样子:
我让时间t以0.01的步长运行了1000次,所以得出来的应该是在前10s内角度的变化,图像如下:
看上去,该函数是一个三角函数,所以当摆角很小的时候,单摆运动可以近似的看作简谐运动.那么当摆角逐渐变大时,会发生什么情况?
当释放角度刚好为 时程序会出现问题,这是因为 ,这就导致角速度一直不会有变化,故角度就不会有变化.所以在最后的图象上角度总是一个常量 .
从上面几张图片可以找到一些规律:
1.随著释放角度的增大周期也会跟著增大
2.角度的变化始终是周期性的
3.当释放角度越来越大时,简谐运动的近似会越来越不精确.
通过上面的程序我们已经初步知道了如何用数值表示这个函数.下次我会讲讲如何求这个函数的解析解.
参考
[1] 《费恩曼物理学讲义》 第一卷 第9章 牛顿的运动学方程