Verlet 算法的简单示例(Matlab)

                     

贡献者: ACertainUser

  • 本文需要更多参考文献。

   Verlet 算法常用于数值计算一些经典动力学问题。一些论坛探讨可以参考 https://www.zhihu.com/question/22531466/answer/27695021 与 https://www.zhihu.com/question/22531466/answer/763079874。

   简而言之,Verlet 算法认为,某时刻粒子的位置可由前两时刻粒子的位置与受力递推得到。假定时间步长为 $\Delta t$.

\begin{equation} \begin{aligned} \boldsymbol{\mathbf{r}} (t) &= 2 \boldsymbol{\mathbf{r}} (t-\Delta t) - \boldsymbol{\mathbf{r}} (t-2\Delta t) + \frac{ \boldsymbol{\mathbf{f}} (t-\Delta t)}{m}(\Delta t)^2 \qquad t>0~,\\ \boldsymbol{\mathbf{r}} (0) &= \boldsymbol{\mathbf{r}} _0~,\\ \boldsymbol{\mathbf{r}} (- \Delta t) &= \boldsymbol{\mathbf{r}} _0 - \boldsymbol{\mathbf{v}} _0 \Delta t + \frac{ \boldsymbol{\mathbf{f}} (0)}{2m}(\Delta t)^2~.\\ \end{aligned} \end{equation}

   其中,$ \boldsymbol{\mathbf{r}} _0, \boldsymbol{\mathbf{v}} _0$ 分别为初始时刻 $t=0$ 粒子的位置与速度,是需要给定的已知量;$ \boldsymbol{\mathbf{f}} = \boldsymbol{\mathbf{f}} (t)$ 是 $t$ 时刻粒子的受力。

   以下是使用 Verlet 算法模拟单粒子圆周运动的 octave/matlab 代码。

clc
clear

function f = centriforce(r) %有心力,例如引力、点电荷的静电力
  mag = 1/(norm(r)^2);
  f = -mag*r/norm(r);
end

r0=[10;0]; %点粒子的初始位置
v0=[0;2]; %点粒子的初始速度。v0=[0;sqrt(10)]时为匀速率圆周运动
dt = 0.01;

R0 = r0 - v0*dt + 100*centriforce(r0)/2*dt^2;
R1 = r0;
R2 = [0;0];
i=0;

while 1
  R2 = 2*R1 - R0 + 100*centriforce(R1)*dt^2;
  if mod(i,5) == 0
    clf
    hold on
    scatter(0,0);
    scatter(R2(1),R2(2));
    axis equal
    axis([-10 10 -10 10])
    hold off
    pause(0.05);
    i = 0;
  endif

  R0 = R1;
  R1 = R2;
  R2 = [0;0];
  i=i+1;
end


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利