速度verlet算法简介及其程序实现

前面介绍的verlet算法存在的一个问题是不能同时获得当前时刻的位置和速度,那么也就不能获得当前状态下动能,温度等等。这在实际的积分过程中是有点纠结的。实际应用中,速度verlet(velocity-verlet)是更为实用的方法,大部分的分子动力学模拟软件实际采用的就是这种方法(lammps就是)。这种方法可以同时给出位置、速度和加速度,并且不牺牲精度

速度verlet算法的介绍可以参考维基百科:velocity-verlet

速度verlet算法简要介绍

位置表达式

displacement expression in velocity verlet algorithm

可以看出, 下一时刻的位置只依赖于当前时刻的位置、速度和加速度。

速度表达式

velocity expression in velocity verlet algorithm

可以看出,下一时刻的速度依赖于当前时刻的速度、加速度和下一时刻的加速度。

速度verlet算法积分过程

启动速度verlet算法需要知道最初t 时刻的位置、速度和加速度。具体积分过程如下:

1. 根据 t 时刻的位置,速度和加速度获得 t+Δt 时刻的位置。

2. 根据 t+Δt 时刻的位置,获得 t+Δt 时刻的加速度。

3. 根据 t 时刻的速度和加速度,t+Δt 时刻的加速度,获得 t+Δt 时刻的速度。

这样,就获得了t+Δt 时刻的位置、速度和加速度(其中,加速度先获得)。这样,通过一个积分步,就将状态向前推进了一个时间步(可以对比红色部分)。

下图反映了这样一个过程。

schematic sequence of velocity verlet algorithm

速度verlet算法程序实现

仍然使用 verlet积分算法简介及程序实现 中的例子进行介绍。

重复部分,不再赘述,直接给出MATLAB代码:velocity_verlet.m

function [r,v] = velocity_verlet(dt,totstep)
% This script calculate the displacement, velocity, force
% of harmonic ossication using velocity-verlet methods.
% Input:
%	dt: timestep  (recommend: 0.01 ~ 2.5)
% 	totstep: total steps.
% Powered By Xianbao Duan
% Email: xianbao.d@gmail.com
% Website: www.52souji.net

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% log:
% 2012-06-05: Complete
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% basic parameters
k = 1;
m = 1;
r0 = 2;
v0 = 2*sqrt(3);

% velocity verlet algorithm
r(1) = r0;	v(1) = v0;	F(1) = -k*r(1);

for i = 1:(totstep-1)
	r(i+1) = r(i)+dt*v(i)+0.5*F(i)*dt*dt/m;
	F(i+1) = -k*r(i+1);
	v(i+1) = v(i)+0.5*(F(i+1)+F(i))*dt/m;
end

可以使用以下命令调用以上函数:

>> [r,v]=velocity_verlet(0.01,3000);
>> plot(1:3000,r)
>> grid on
>> xlabel('steps')
>> ylabel('displacement')
>> title('velocity-verlet algorithm, dt=0.01, totstep=3000')
>> figure
>> plot(r,v)
>> grid on
>> xlabel('displacement');
>> ylabel('velocity')
>> title('velocity-verlet algorithm, dt=0.01, totstep=3000')

下图是绘制得到的位置随着时间步的变化

velocity-verlet algorithm: displacement vs steps

下图是绘制得到的速度随着时间的变化

velocity-verlet algorithm: velocity vs displacement

对比 verlet积分算法简介及程序实现 中给出的图片,两者几乎没有差别。

实际上,两个程序在给出结果上是完全等价的,这个是可以被严格证明的。

标签: matlab, 算法

相关文章推荐

添加新评论 (无需注册,可直接评论)