假定初始条件为x0p0),则它的哈密顿方程是对时间的一阶微分方程 dx aH P 中 d t (6.2.2) 计算在相空间中的运动轨迹(p():采用有限差分法,将微分方程变为有限差分方程,以便在计算 机上做数值求解,并得到空间坐标和动量随时间的演化关系。 首先,取差分计算的时间步长为h,采用一阶微分形式的向前差商表示,它是直接运用展开到h的一 阶泰勒展开公式 (+6)=/()+h4+0矿), 即得到 d、f(+h-f() (6.2.3
假定初始条件为 () () px 0,0 ,则它的哈密顿方程是对时间的一阶微分方程 m p p H dt dx = ∂ ∂ = , kx x H dt dp −= ∂ ∂ −= . (6.2.2) 计算在相空间中的运动轨迹( ( ), (tptx )):采用有限差分法,将微分方程变为有限差分方程,以便在计算 机上做数值求解,并得到空间坐标和动量随时间的演化关系。 首先,取差分计算的时间步长为 ,采用一阶微分形式的向前差商表示,它是直接运用展开到 的一 阶泰勒展开公式 h h ( ) () )( 2 hO dt df htfhtf ++=+ , 即得到 ( ) () h tfhtf dt df −+ ≈ , (6.2.3)
则微分方程6.2.2)可以被改写为差分形式 dx x(+h)-x( p() d t h (6.2.4) 中_p+)p2=-6 (6.2.5 将上面两个公式整理后,我们得到解微分方程(6.2.2)的欧拉( Euler)算法(参见附录C) x(t+h)=x(t (6.2.6) +h hkx (6.2.7) 这是x()p)的一组递推公式。有了初始条件x()p(0),就可以一步一步地使用前一时刻的坐标、动量 值确定下一时刻的坐标、动量值。这个方法是一步法的典型例子
则微分方程(6.2.2)可以被改写为差分形式 ( ) ( ) ( ) m tp h txhtx dt dx = −+ = . (6.2.4) ( ) ( ) ( )tkx h tphtp dt dp −= −+ = . (6.2.5) 将上面两个公式整理后, 我们得到解微分方程(6.2.2)的欧拉(Euler)算法(参见附录 C): ( ) () ( ) m thp txhtx +=+ . (6.2.6) ( ) =+ ( ) − (thkxtphtp ) . (6.2.7) 这是 ( ), (tptx )的一组递推公式。有了初始条件 ( ) px (0,0 ),就可以一步一步地使用前一时刻的坐标、动量 值确定下一时刻的坐标、动量值。这个方法是一步法的典型例子
由于在实际数值计算时h的大小是有限的,因而在上述算法中微分被离散化为差分形式来计算时 总是有误差的。可以证明一步法的局部离散化误差与总体误差是相等的,都为OH)的量级。在实际应 用中,适当地选择h的大小是十分重要的。h取得太大,得到的结果偏离也大,甚至于连能量都不守 恒;h取得太小,有可能结果仍然不够好。这就要求我们改进计算方法,进一步考虑二步法。 差分计算的二步法 实际上泰勒展开式的一般形式为 +)=10+∑r0)+- 6.2.8) 其中O")表示误差的数量级。前面叙述的欧拉算法就是取n=1
由于在实际数值计算时 的大小是有限的,因而在上述算法中微分被离散化为差分形式来计算时 总是有误差的。可以证明一步法的局部离散化误差与总体误差是相等的,都为 的量级。在实际应 用中,适当地选择 的大小是十分重要的。 取得太大,得到的结果偏离也大,甚至于连能量都不守 恒; 取得太小,有可能结果仍然不够好。这就要求我们改进计算方法,进一步考虑二步法。 h )( 2 hO h h h 差分计算的二步法: 实际上泰勒展开式的一般形式为 ( ) () ( ) ( ) 1 1 )( ! + = +=+ ∑ + i n n i i hOtf ih tfhtf . (6.2.8) 其中 ( ) n+1 hO 表示误差的数量级。前面叙述的欧拉算法就是取n = 1
现在考虑公式(6.2.8)中直到含h的二次项的展开(即取n=2),则得到 f(+h)=f( (6.2.9 f(t-h)=f()-h,+ (6.2.10) 将上面两式相加、减得到含二阶和一阶导数的公式 2=1[/(+b)-2()+y(- (6.2.11) df f(t+h)-f(t-h) d t 2h 6.2
现在考虑公式(6.2.8)中直到含 的二次项的展开(即取 h n = 2 ),则得到 ( ) () ( ) 3 2 22 2 hO dx fdh dt df htfhtf +++=+ . (6.2.9) ( ) () ( ) 3 2 22 2 hO dx fdh dt df htfhtf ++−=− . (6.2.10) 将上面两式相加、减得到含二阶和一阶导数的公式 [ () ()])(2 122 2 htftfhtf hdx fd −+−+= . (6.2.11) ( ) ( ) h htfhtf dt df 2 + − − = . (6.2.12)
令/()=x),利用牛顿第二定律公式F()=mx,公式6.2.1)写为坐标的递推公式 x(+b)=2()-x-b)+h2 (6.2.13) 公式(6.2.12)写为计算动量的公式得到 p()=m()=m()=[x(+b)-x-h) (6.2.14) 这样我们就推导出了一个比(6.2.6)和(6.2.⑦)更精确的递推公式。这是二步法的一种,称为 Verlet 方法。 当然我们还可以建立更高阶的多步算法,然而大部分更高阶的方法所需要的内存比一步法和二步 法所需要的大得多,并且有些更高阶的方法还需要用迭代来解出隐式给定的变量,内存的需求量就更 大。并且当今的计算机都仅仅只有有限的内存,因而并不是所有的高阶算法都适用于物理系统的计算 机计算。 Verlet算法是分子动力学模拟中求解常微分方程最通用的方法
令 ( ) = (txtf ),利用牛顿第二定律公式 ( ) 2 2 dt xd = mtF ,公式(6.2.11)写为坐标的递推公式 ( ) () ( ) ( ) m tF hhtxtxhtx 2 2 +−−=+ . (6.2.13) 公式(6.2.12)写为计算动量的公式得到 () () () [ ] ( )( ) htxhtx hm tmvtxmtp −−+=== 2 & . (6.2.14) 这样我们就推导出了一个比(6.2.6)和(6.2.7)更精确的递推公式。这是二步法的一种, 称为 Verlet 方法。 当然我们还可以建立更高阶的多步算法,然而大部分更高阶的方法所需要的内存比一步法和二步 法所需要的大得多,并且有些更高阶的方法还需要用迭代来解出隐式给定的变量,内存的需求量就更 大。并且当今的计算机都仅仅只有有限的内存,因而并不是所有的高阶算法都适用于物理系统的计算 机计算。Verlet 算法是分子动力学模拟中求解常微分方程最通用的方法