{
  "aliases": null,
  "backlinks": null,
  "body": "\n## Statement\n\nLet $a \\colon \\R^d \\to \\R^d$ be continuous, and consider the equation $x'' = a(x)$.\nFix a step size $h \u003e 0$ and write $a_n = a(x_n)$.\nBeeman's algorithm computes, from $x_n$, $v_n$, $a_n$ and $a_{n-1}$,\n$$x_{n+1} = x_n + h v_n + \\frac{h^2}{6} (4 a_n - a_{n-1}),$$\n$$v_{n+1} = v_n + \\frac{h}{6} (2 a_{n+1} + 5 a_n - a_{n-1}).$$\nThen for all $n \\ge 2$ for which the sequences are defined,\n$$x_{n+1} = 2 x_n - x_{n-1} + h^2 a_n.$$\nSo Beeman's algorithm produces the same positions as the [[Störmer–Verlet method|ESWE8Y3JD4]], once both start from the same $x_1$ and $x_2$.\n\n## Remarks\n\nSubtract the position formula at step $n - 1$ from the one at step $n$:\n$$x_{n+1} - 2x_n + x_{n-1} = h (v_n - v_{n-1}) + \\frac{h^2}{6} (4 a_n - 5 a_{n-1} + a_{n-2}).$$\nThe velocity formula gives $h (v_n - v_{n-1}) = \\frac{h^2}{6}(2 a_n + 5 a_{n-1} - a_{n-2})$, and the sum is $h^2 a_n$.\nThe difference from Verlet lies only in the velocities, which Beeman's formula computes more accurately than the central difference $(x_{n+1} - x_{n-1})/(2h)$; this improves the computed kinetic energy.\nThe velocity formula above is the implicit form; a common explicit variant predicts $v_{n+1}$ first when the force depends on the velocity.\n\n## Explanations\n\n### L1 human\n\nBeeman's method is a molecular dynamics integrator that uses the forces at the current and previous steps.\nIts positions turn out to be exactly those of the simpler Verlet method.\nWhat it adds is a more accurate formula for the velocities, so that the energy is measured more accurately.\n\n### L2 human\n\nThe identity shows that Beeman's method inherits the stability and the long-time behaviour of Verlet's positions.\nIt is a multistep method, so it needs a starting procedure to produce $a_{-1}$ or $x_1$.\nIn practice velocity Verlet is more common, because it gives similar accuracy with less storage.\n",
  "commit": "ff8a40749dc16545e3d2fc637f6b0196e81d0bfa",
  "front": {
    "about": [
      "ESWE8Y3JD4"
    ],
    "kind": "statement",
    "msc": [
      "65L06",
      "70-08"
    ],
    "name": "Beeman's algorithm",
    "role": "proposition",
    "sources": [
      {
        "url": "https://en.wikipedia.org/wiki/Beeman%27s_algorithm"
      }
    ],
    "tag": "RHQ88QD2BE",
    "uses": [
      "0FXDW992DS",
      "ESWE8Y3JD4"
    ]
  },
  "kind": "statement",
  "link": "https://tamnd.github.io/math2/node/RHQ88QD2BE/",
  "links": [
    {
      "field": "about",
      "target": "ESWE8Y3JD4"
    },
    {
      "field": "uses",
      "target": "0FXDW992DS"
    },
    {
      "field": "uses",
      "target": "ESWE8Y3JD4"
    }
  ],
  "markdown": "https://tamnd.github.io/math2/node/RHQ88QD2BE.md",
  "msc": [
    "65L06",
    "70-08"
  ],
  "name": "Beeman's algorithm",
  "prov": null,
  "role": "proposition",
  "source": "https://github.com/tamnd/math2/blob/main/nodes/RHQ/RHQ88QD2BE.md",
  "status": null,
  "tag": "RHQ88QD2BE",
  "uri": "m2://RHQ88QD2BE",
  "url": "https://tamnd.github.io/math2/wiki/beemans-algorithm/",
  "writing": {
    "tag": "RHQ88QD2BE",
    "kind": "statement",
    "level": "W0",
    "next": [
      {
        "what": "an inventory row",
        "note": "the row of the inventory that the node accounts for",
        "have": 0,
        "want": 1
      },
      {
        "what": "a source with a locator",
        "have": 0,
        "want": 1
      }
    ]
  }
}
