Matlab求解理论力学问题系列(三)单摆和椭圆摆的运动及周期
清华大学航天航空学院, 北京100084
Received: 2020-06-1
作者简介 About authors
本文引用格式
高云峰.
一般来说,在理论力学的动力学教学中,绝大部分问题都只需要学生会受力分析、列写动力学方程,并不要求进一步求出具体的运动[1]。原因之一是绝大部分问题没有解析解,用传统数学方法不好解;原因之二是学时限制,没有更多时间教学生如何求解。
随着计算软件的发展,目前已经可以很轻松地求出动力学方程的解,包括运动和力随时间的变化关系,也可以很容易在屏幕上进行动画演示。
本篇先从动力学中最简单的单摆问题开始介绍:单摆的动力学方程如何求解?数值解的精度如何?大角度情况下周期如何变化?然后介绍椭圆摆的相关问题。
1 单摆的相关问题[2]
案例1:假设单摆中小球$A$质量为$m$,尺寸不计,绳子$OA$长度为$l$,不计质量(图1)。试比较不同初始角度对运动的影响,以及如何证明计算的结果可靠?
图1
单摆运动时,根据其受力图(图2),可以在切向方向列写系统的动力学方程,为
图2
虽然方程(1)在线性化时有解析解,但是大角度时比较复杂。但在Matlab中,可以直接调用ode45函数统一求解这类常微分方程,其格式是[3]
其中黑体是固定的格式,斜体是变量或自己命名的函数。其中options是积分的选项,可以控制积分的精度,$'$RelTol$'$表示积分中的相对误差,$'$AbsTol$'$是积分中的绝对误差。在Matlab数值积分计算中,通常$number1$和$number2$可以选为$10^{-8}\sim 10^{-10}$ (精度太高会花费更多计算时间,也没有必要),如果省略则默认为$10^{-3}$。ode45函数则是求解常微分方程的一种常用函数,其中[$t,y$]是积分的时间和结果;动力学方程在子程序$file\_name$中描述; $y0$是初始条件;[$start\_time: step\_time: end\_time$]表示积分时按等步长$step\_time$从开始积分到结束(等步长积分是为了动画演示时每一帧时长相同)。
注意ode45求解标准的一阶常微分方程组,因此要把动力学中的二阶微分方程转换为一阶微分方程组。把方程(1)这样处理:设$y_{1} =\theta$, $y_{2} =\dot{{\theta}}$,得到一阶微分方程组
初始条件为 $y_{1} (0)=\theta (0)$, $y_{2} (0)=\dot{{\theta }}(0)$。
图3
图4
主程序源代码中global是表示全局变量,在主程序中赋值后在其他子程序中可以直接调用;plot是画线段的函数,如果很密集,各段微小的线段就构成了曲线;$y(:,1)$表示$y$数组中的第1列,实际上就是每一步计算得到的单摆角度;xlabel和ylabel是给图中坐标轴加上标注,科学论文中一般需要知道坐标是什么含义,什么单位。
子程序用function开头,注意在Matlab中子程序文件名与函数名相同;zeros(2,1)表示生成一个$2\times1$的列阵,里面元素都是0;子程序中的动力学方程直接按照式(3)写出。
数值计算中初始角度可以变化,其他参数不变,如下所示
图5
图6
2 数值计算的可靠性
数值计算通常是有误差的,包括数值的截断误差、算法本身的误差等。不过随着计算技术的发展,可显示的最小值越来越小,例如在Matlab中输入realmin($'$single$'$),显示出单精度最小正浮点数为$1.175\,494\,4\times10^{-38}$,所以普通计算精度完全满足要求。
那么方程(1)的数值积分精度如何呢?这首先取决于options中的精度控制,在前面所说的$10^{-8}\sim10^{-10}$情况下,积分计算精度也基本是这一数量级。怎么证明这一点呢?可以通过方程的守恒量来判断。
不考虑空气阻力时,方程(1)有守恒量(机械能)
守恒量理论上是一个常数,因此可以用于检测数值计算的可靠性。在数值计算中,可以先把每一步的角度、角速度等量计算出来,然后计算每一步的$E$。考虑到计算有误差,这个“守恒量”应该在极小范围内变化才合理。图7是不同初始条件下方程的积分结果,看起来很平坦,从而证明积分的结果很可靠。
图7
如果想了解积分常数变化的细节,利用能量之差是有效的方法。能量之差定义为
如果没有事先指定等比例(用axis equal命令表示$x$和$y$轴等比例),Matlab在画图时坐标轴会自动根据数据范围进行缩放,因此能量之差的细节变化就可以反映出来(图8),根据能量之差,可以看出系统机械能的变化范围与积分的允许误差范围同阶,初始角度小时计算误差更小。
图8
图9
图10
3 椭圆摆的相关问题
椭圆摆是动力学中的一个典型问题,我们想了解一下:椭圆摆的运动是周期的吗?其周期是多少?
案例2:椭圆摆(图11)由质量为$m_{A}$的滑块$A$和质量为$m_{B}$的单摆$B$构成。滑块可沿光滑水平面滑动,$AB$杆长为$l$,质量不计。试建立系统的运动微分方程,并求水平面对滑块$A$的约束力。
图11
系统有2个自由度,建立$Oxy$坐标系,取$A$点位移$x$和$AB$杆的相对转角$\varphi$为广义坐标(图12),传统分析可得到系统的运动微分方程以及压力的表达式(过程略)为
图12
通常理论力学教材或教学到了这一步就算结束了。椭圆摆在运动过程中$A$滑块和$AB$杆是否为周期运动?是否为正弦运动?压力是如何变化的?类似这样的问题传统方法都不好回答。
系统的运动是周期的吗?在式(7)中消去$\ddot{{x}}$,有
可以看出,摆角的方程(9)在小角度、线性化后是周期的;类比单摆,大角度情况下摆动周期与初始条件有关。下面的计算只改变椭圆摆的 初始角度$\varphi_{0} $,其他参数均不变。
图13
图14
图15
图16
另外还有一个现象,系统的位移、摆角、压力虽然都是周期函数,但是周期并不相同。虽然椭圆摆的摆角看上去像余弦曲线(图13),但是否为标准的余弦曲线?这可以使用快速傅里叶变换来分析。在Matlab中,可以直接调用 fft($data\_name$)函数求出数据$data\_name$的频率。
在处理椭圆摆之前,先看看 fft 的效果,设测试函数为
图17
图18
图19
图20
(1)可以看到各条曲线都有一个明显的峰值,但其他位置还有连续的不全为0的值,且大角度时高倍频处还会有小峰值,这说明椭圆摆的摆角不再是标 准的余弦函数;
(2)由于峰值相对明显,所以在时域图中看起来很像余弦曲线;
(3)各曲线最大峰值对应的主频率不同:频率随初始角度增加而减少,或周期随初始角度增加而增加,符合图14的结论,这反映了非线性函数的周期或频率与初始条件有关。
4 小结
现代科学的发展,使得计算的重要性大为提升,它和理论分析、试验验证同为科学研究的三大重要手段。例如,1963年MIT的气象学家Lorenz在计算大气对流问题时发现了混沌现象、现代飞机的设计涉及大量动力学软件的计算,等等。
在这种背景下,在动力学中引入Matlab,除了会列写动力学方程,还能计算和演示系统整个运动过程,便于发现系统丰富的动力学现象。
本篇着重介绍了动力学中运动微分方程的求解,首先把二阶微分方程转换为一阶微分方程组,然后采用荣格库塔法进行求解。涉及到的Matlab核 心函数是 odeset (设置积分精度)和 ode45 (求微分方程);plot和hold on命令可以实现多个图叠在一起。另外介绍了 fft 函数(把时域数据转换到频域),可以分析复杂曲线的频率或周期。
可以看出,借助Matlab可以更加深入地研究动力学问题,解决传统分析方法无法处理的问题。
参考文献
/
〈 | 〉 |