美文网首页
小插曲:积分法

小插曲:积分法

作者: 大龙10 | 来源:发表于2022-06-13 07:02 被阅读0次

    书名:代码本色:用编程模拟自然系统
    作者:Daniel Shiffman
    译者:周晗彬
    ISBN:978-7-115-36947-5
    目录

    5.14 小插曲:积分法

    一、微积分原理

    • “积分”是微积分学中的两个重要运算之一,另一个运算是“微分”。
    • 微积分原理,它关系到某些物理库(像Box2D和后面的toxiclibs)的实现方法。
    • 积分和物体的位置、速度以及加速度有什么关系?

    1、微分的概念

    • 微分就是求“导数”。
    • 求函数的导数就是找到函数随时间变化的规律。
    • 请思考位置和位置的导数,位置是空间中的一个点,而速度就是位置随时间的变化,因此,速度可以描述为位置的“导数”。
    • 什么是加速度呢?加速度就是速度随时间的变化——也就是速度的“导数”。

    2、积分的概念

    • 求积是求导的逆运算。
    • 换句话说,计算速度对时间的积分,就能得到对象在相应时间点的位置。
    • 位置是速度的积分,速度是加速度的积分。
    • 由于前面的物理模拟是建立在加速度基础上的,加速度是由力计算得到的,所以我们需要用积分法求解物体在某个时间点(如同动画的某一帧)所在的位置。
    • 因此,我们之前一直在做积分运算!它具体看起来是这样的:
    velocity.add(acceleration);
    location.add(velocity);
    
    • 上面的方法称作欧拉积分或欧拉方法(以著名的数学家莱昂哈德•欧拉命名)。

    3、积分方法

    • 欧拉积分是最简单的积分方法,很容易用代码实现(见上面两行代码!)。然而,它并不是最有效、最准确的积分法。

    • 为什么欧拉积分不准确?
      试想,你驾驶着一辆汽车沿着道行驶路,你踩下油门加速,汽车是否会在某一秒位于某个位置,在下一秒突然跳到新的位置?在第3秒、第4秒、第5秒也做同样的运动?事实并非如此,汽车的运动应该是连续的。
      但在Sketch程序中,一个圆在零帧处在某个位置,在第1帧处在新的位置,在第2帧又在不同的位置。如果帧速是每秒30帧,我们就能看到圆移动的动画。在程序中,我们每隔N个时间单位计算一次位置,而现实世界的运动却是完全连续的。这样一来,我们的计算结果并不准确,如下图所示:


      图5-13
    • 现实世界中的轨迹是一条曲线,而用欧拉积分模拟的结果是一条折线。

    4、辛-欧拉法

    • 有一种做法可以提高欧拉积分的准确性,那就是缩短位置计算的单位时间——除了每一帧计算一次,我们还可以在一帧中进行30次位置计算,但这不具有可行性,因为Sketch的运行速度会变慢。
    • 我仍然认为,欧拉方法是学习基础知识的最佳方法,而且它也完全适用于我们大多数的Processing项目。任何在效率和准确性上的损失,都能在易用性和可理解性上得到弥补。
    • 为了得到更好的精度,Box2D使用了辛-欧拉法,它又称为半显式欧拉法,是欧拉法的修改版。
    辛-欧拉法(http://en.wikipedia.org/wiki/Symplectic_Euler_method)
    
    • 此外,还有一种龙格-库塔法(Runge-Kutta,以德国数学家C. Runge和M. W. Kutta命名),它也被用在某些物理引擎上。

    5、韦尔莱积分法

    • 我们下一个物理库使用的是著名的“韦尔莱积分法”(Verlet integration)。
    • 理解韦尔莱积分法的一种简单方式是:脱离速度思考某个运动算法。
      我们不一定需要存储速度变量,只要知道物体在某个时间点的位置和现在的位置,我们就可以由此推断速度。
    • 韦尔莱积分法就是这样做的,尽管没有速度变量,它还是可以在运行过程中计算速度。
    • 韦尔莱积分法特别适合粒子系统,尤其是由弹簧连接的粒子系统。
    • 在模拟过程中,我们不需要关心任何细节,因为toxiclibs会替我们接管所有事情。
    如果你对它的实现感兴趣,这里有一份有关Verlet物理库的论文,
    几乎所有的Verlet计算机图形模拟都源自于此,
    这篇论文是“Advanced Character Physics”
    (http://www.gamasutra.com/resource_guide/20030121/jacobson_pfv.htm)。
    你还可以在维基百科中找到更多关于韦尔莱积分法的知识
    (http://en.wikipedia.org/wiki/Verlet_integration)。
    

    欧拉方法

    • 是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解。
      它是一种解决数值常微分方程的最基本的一类显型方法(Explicit method)
    • 欧拉方法通过记录物体位置和速度,然后在每帧循环期间把速度累加到位置上,从而模拟物体的物理运动
    • 根据此刻速度和加速度,可计算出下一刻的速度和位移差。
      v_{n+1}=v_n+a_ndt
      p_{n+1}=p_n+v_ndt

    半隐式欧拉

    • 上述对运动的计算并不够准确——加速度的变化是持续的,而这里通过微分时间将加速度这一持续变化的量看作该微分时间短内的常量,除非微分时间段足够短,但这样又会导致效率太低。
    • 改进的欧拉法,即使用上一刻的加速度计算下一刻的速度,并使用下一刻的速度计算出下一刻的位移。
      v_{n+1}=v_n+a_ndt
      p_{n+1}=p_n+v_{n+1}dt
    • 改进后的欧拉方法开销和原方法一样大,但却准确得多。

    韦尔莱积分法

    • 韦尔莱算法是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中。
    • 韦尔莱算法的优点在于:数值稳定性比简单的欧拉方法高很多,并保持了物理系统中的时间可逆性与相空间体积元体积守恒的性质。
    • 韦尔莱积分法记录了分子当前的位置和之前的位置,要获得分子的速度,只要用当前位置减去之前的位置就行了。
      p_{n+1}=p_n+(p_n−p_{n−1})+a_ndt^2
    • p_n−p_{n−1} 即隐含的速度。这一方法的好处便是不需要单独储存速度,分子的速度和加速度都是隐式处理,稳定且高效。

    龙格-库塔法

    • 在各种Runge-Kutta法当中有一个方法十分常用,以至于经常被称为“RK4”或者就是“Runge-Kutta法”。该方法主要是在已知方程导数和初值信息,利用计算机仿真时应用,省去求解微分方程的复杂过程。

    相关文章

      网友评论

          本文标题:小插曲:积分法

          本文链接:https://www.haomeiwen.com/subject/gwrrmrtx.html