@cyy652415049
2016-04-19T09:57:40.000000Z
字数 7799
阅读 4179
作者:陈洋遥
学号2013301020169
更新时间:20160408
本次作业研究振动问题。振动是自然界最常见的物理现象之一,无论是平静水面上偶然荡起的微微涟漪,还是清风拂过后绿叶的轻轻飘摇,抑或早起目见的第一缕阳光,都是波动现象的真实写照。在所有振动现象中,简谐振动(simple harmonic motion)是最简单的一类,然而,对简谐运动的研究,有利于我们深入了解各种算法的稳定性和局限性;另外,对简谐振子适当增加非线性效应、阻尼、驱动力,则其可能出现混沌(chaos)现象。因此,有必要深入研究简谐运动。本次作业的目的是:
(1) 完成课后习题CH3 3.4,3.5;
(2) 讨论各种算法(包括Euler,Euler-Cromer,Verlet以及Runge-Kutta法等)的稳定性、计算精度、计算耗时,从而了解各种算法在不同条件下的适用性。
简谐运动的一个重要的例子就是单摆(simple pendulum)运动,单摆是一小球由不可伸缩的长轻绳紧密悬挂在一固定悬点后,小球所呈现的往复运动形式。在小摆角下,单摆的运动方程即为一振动方程
先来看看Euler Method和稍好一点的Euler-Cromer Method对于单摆问题会分别给出怎样的结果,程序见ch3_simple_pendulum_20160415.py。我们展示计算结果如下图由图所示,图1左图(a)给出了用两种方法分别计算单摆和理论值的比较,这里取了步长,远小于摆的周期,可以发现Euler Method的计算相对真实值产生了较大的偏离,而Euler-Cromer计算则好得多。
图1 单摆运动的模拟
先考虑一下短时间的单摆,利用Euler、Euler-Cromer、Verlet、二阶Runge-Kutta、四阶Runge-Kutta Method分别计算单摆的能量相对于理论守恒值的偏差,相应的程序见ch3_pendulum_diff_method.py。从图2左图(a)可以发现,即便对于如此短时间的单摆,Euler Method也基本无能为力,其计算出的能量急剧增大,严重偏离事实,而其他的四个方法计算出的能量曲线都还比较平坦,几乎是守恒的。图2右图(b)给出了不同方法的计算精度的比较,可见五种方法计算精度依次上升,但是计算耗时的相应增加。计算精度最高的是四阶Runge-Kutta Method,其精度非常高,而耗时不显著增加,因此还算是比较有效的方法。
图2 3周期内各种算法的稳定性
我们也给出五种计算方法的精度、消耗时间的具体数据,计算偏差减小时,大致可以发现计算耗时增加,见下表1:
表1 3周期内五种算法的精度、消耗时间
算法 | 能量偏差(焦耳) | 计算耗时(秒) |
---|---|---|
Euler | ||
Euler-Cromer | ||
Verlet | ||
2nd-order Runge-Kutta | ||
4th-order Runge-Kutta |
再考虑振动时间略长的单摆,考虑到Euler法必然已经严重不稳定,遂利用Euler-Cromer、Verlet、二阶Runge-Kutta、四阶Runge-Kutta Method分别计算单摆的能量相对于理论守恒值的偏差,相应的程序也见ch3_pendulum_diff_method.py。从图3左图(a)可以发现,当计算时间增加到300个周期时,二阶Runge-Kutta法计算的单摆运动的能量曲线已经严重偏离守恒值,因此,此时二阶Runge-Kutta法已经不再稳定,无能为力了。而其他3种方法都还比较不错,能量也大致守恒。图3右图(b)给出了不同方法的计算精度的比较,可见四种方法计算精度各有千秋,但是二阶Runge-Kutta法的精度已经被Euler-Cromer和Verlet方法超越,且其耗时较长。
图3 300周期内各种算法的稳定性
我们也给出4种计算方法的精度、消耗时间的具体数据,可以发现,二阶Runge-Kutta法精度已经被另两种方法超越,耗时也长,因而不具有优势,四阶的Runge-Kutta法精度仍然最高,但耗时也最长,且相比3周期情况,Euler-Cromer法的能量偏差增加并不明显,而四阶Runge-Kutta法计算能量偏差显著增大,可以预期,若计算时间继续增加,Runge-Kutta法最终会完蛋。见下表2:
表2 300周期内4种算法的精度、消耗时间
算法 | 能量偏差(焦耳) | 计算耗时(秒) |
---|---|---|
Euler-Cromer | ||
Verlet | ||
2nd-order Runge-Kutta | ||
4th-order Runge-Kutta |
再考虑振动时间更长的单摆,考虑到二阶Runge-Kutta法必然已经严重不稳定,遂利用Euler-Cromer、Verlet、四阶Runge-Kutta Method分别计算单摆的能量相对于理论守恒值的偏差,相应的程序也见ch3_pendulum_diff_method.py。从图4左图(a)可以发现,当计算时间增加到20000个周期时,四阶Runge-Kutta法计算的单摆运动的能量曲线已经略有偏离守恒值,因此,此时四阶Runge-Kutta法已经不再稳定,而其他2种方法都仍保持不错的计算精度。图4右图(b)给出了不同方法的计算精度的比较,可见3种方法计算精度各有千秋,但是四阶Runge-Kutta法的精度已经被Verlet方法超越,也可预见将会被Euler-Cromer方法超越,且四阶Runge-Kutta法耗时相比于其他方法太长,几乎是他们的3倍,这对于更大型的计算是无法忍受的。
图4 20000周期内各种算法的稳定性
我们也给出3种计算方法的精度、消耗时间的具体数据,可以发现,四阶Runge-Kutta法精度已经被另Verlet法超越,耗时也长,因而不具有优势,且相比300周期情况,Euler-Cromer法和Verlet的能量偏差增加并不明显,而四阶Runge-Kutta法计算能量偏差显著增大,可以预期,若计算时间继续增加,Euler-Cromer法和Verlet法还是能很大程度地保持稳定,且计算时间短,具有很大优势。见下表3:
表3 20000周期内3种算法的精度、消耗时间
算法 | 能量偏差(焦耳) | 计算耗时(秒) |
---|---|---|
Euler-Cromer | ||
Verlet | ||
4th-order Runge-Kutta |
下面简单讨论以下非简谐摆,与简谐摆不同的是,其恢复力幂次一般不是1次的。一般来说,非简谐摆的运动方程由下式给出
这里采用四阶Runge-Kutta法计算简谐摆和非简谐摆的振动情况,并给出非简谐摆振动频率对于振幅的依赖。程序见ch3_anharmonic_oscillator.py。从图5左图(a)可以看出,非简谐摆的周期很明显和简谐摆不同(相同振幅时),而图5(b)则显示了简谐摆的周期不依赖于振幅,而非简谐摆的周期是依赖振幅的,且数值计算的结果和理论曲线吻合得很好。另外这里只去了恢复力幂次的两种情况,后面将看到,只有这两种情况的摆才比较稳定,而取其他值时,摆对于计算误差极其敏感,将很难以计算。
图5 非简谐摆,稳定情况
这里仍采用稳定性较好的四阶Runge-Kutta法计算简谐摆和非简谐摆的振动情况。程序见ch3_chaos_nonlinear.py。与之前不同的是,这里取了恢复力幂次的情况,可以发现,此时的摆极其的不稳定,其行为严重依赖于计算的误差,采用四阶Runge-Kutta法并将步长取到周期的附近仍然得到发散的结果。此时非线性效应十分显著,用数值计算方法给出的解对计算精度要求十分之高。
图6 非简谐摆,非稳定情况
本次作业讨论了各种算法(包括Euler,Euler-Cromer,Verlet以及Runge-Kutta法等)的稳定性、计算精度、计算耗时,从而了解各种算法在不同条件下的适用性。通过比较可以发现,尽管Runge-Kutta法对于解决大部分问题具有很高的稳定性,但是对于解决振动问题,Euler-Cromer法和Verlet法才是真神,不仅算得快,而且在相当长的时间内能算得很准,这可进一步说明不同系统的最优算法可能不同,应该想办法寻找既简单有高效、精确的方法。
另外,本次作业还讨论了非简谐摆的振动问题,可以发现恢复力幂次取值不为1或3时,振动呈现高度的非线性状态,对计算误差十分敏感,对数值求解提出了很大的难题。
[1] 计算物理;Nicholas J. Giordano, Hisao Nakanishi
[2] 常用数学符号的LaTex表示方法;http://www.mohu.org/info/symbols/symbols.htm
[3] matplotlib-绘制精美的图表;http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html
[4] 继续参考了刘星辰大神的3d作图方法,这里继续表示分感谢,继续顺祝好人一生平安