{
  "aliases": null,
  "backlinks": null,
  "body": "\n## Statement\n\nLet $a \\in \\R$, and consider the [[transport equation|PVD7VZJZ9B]] $u_t + a u_x = 0$.\nFix $\\Delta x, \\Delta t \u003e 0$ and put $\\nu = a \\Delta t / \\Delta x$.\nConsider a linear explicit scheme\n$$u_j^{n+1} = \\sum_{k=-K}^{K} c_k\\, u_{j+k}^n, \\qquad j \\in \\Z,$$\nwith real coefficients $c_k$ that depend only on $\\nu$.\nCall the scheme monotone if $c_k \\ge 0$ for all $k$, and of order at least $2$ if\n$$\\sum_k c_k\\, k^m = (-\\nu)^m \\qquad \\text{for } m = 0, 1, 2.$$\nIf the scheme is monotone and of order at least $2$, then $\\nu$ is an integer and the scheme is the exact shift $u_j^{n+1} = u_{j - \\nu}^n$.\nIn particular, for $\\nu \\notin \\Z$, a monotone linear scheme is at most first-order accurate.\n\n## Remarks\n\nThe conditions for $m = 0, 1, 2$ say that the scheme is exact on polynomials of degree at most $2$, which is the same as a local truncation error $O(\\Delta x^3)$ for smooth solutions.\nProof: the numbers $c_k \\ge 0$ sum to $1$, so they are the weights of a probability distribution on the integers $k$, with mean $-\\nu$ and second moment $\\nu^2$.\nSo its variance is $0$, and all the weight sits on the single point $k = -\\nu$, which must then be an integer.\nFor a linear scheme, monotone is the same as monotonicity preserving: an increasing step $u_i = 1$ for $i \u003e J$ and $0$ otherwise gives $u_{j+1}^{n+1} - u_j^{n+1} = c_{J-j}$.\nExamples: the [[upwind scheme|MTCRZC5QKT]] with $0 \\le \\nu \\le 1$ is monotone and of first order.\nThe [[Lax–Wendroff method|YHZ9BCNDRZ]] is of second order, has the negative coefficient $c_1 = -\\nu(1 - \\nu)/2$ for $0 \u003c \\nu \u003c 1$, and oscillates near jumps.\n\n## Explanations\n\n### L1 human\n\nWhen a computer simulates a moving sharp front, simple schemes either smear the front or create wiggles next to it.\nGodunov's theorem says that, for linear schemes, this is unavoidable: a linear scheme that never creates new wiggles is at best first-order accurate, and so it smears.\nTo have both sharp fronts and no wiggles, one must use schemes whose coefficients depend on the solution itself.\n\n### L2 human\n\nGodunov proved this in 1959, and it is the reason why modern high-resolution schemes are nonlinear.\n[[Total variation diminishing|NX8RE9B72A]] schemes, flux limiters, MUSCL and ENO/WENO schemes switch to a first-order monotone flux near discontinuities and use a higher-order flux in smooth regions.\nThe theorem is a statement about linear schemes; it does not limit nonlinear ones, which can be second order away from extrema.\n",
  "commit": "ff8a40749dc16545e3d2fc637f6b0196e81d0bfa",
  "front": {
    "about": [
      "X7HYEBA5SA"
    ],
    "kind": "statement",
    "msc": [
      "65M06",
      "65M12",
      "35L65"
    ],
    "name": "Godunov's theorem",
    "role": "theorem",
    "sources": [
      {
        "url": "https://en.wikipedia.org/wiki/Godunov%27s_theorem"
      }
    ],
    "tag": "559N53ZTMV",
    "uses": [
      "PVD7VZJZ9B",
      "X7HYEBA5SA",
      "MTCRZC5QKT",
      "YHZ9BCNDRZ",
      "NX8RE9B72A"
    ]
  },
  "kind": "statement",
  "link": "https://tamnd.github.io/math2/node/559N53ZTMV/",
  "links": [
    {
      "field": "about",
      "target": "X7HYEBA5SA"
    },
    {
      "field": "uses",
      "target": "PVD7VZJZ9B"
    },
    {
      "field": "uses",
      "target": "X7HYEBA5SA"
    },
    {
      "field": "uses",
      "target": "MTCRZC5QKT"
    },
    {
      "field": "uses",
      "target": "YHZ9BCNDRZ"
    },
    {
      "field": "uses",
      "target": "NX8RE9B72A"
    }
  ],
  "markdown": "https://tamnd.github.io/math2/node/559N53ZTMV.md",
  "msc": [
    "65M06",
    "65M12",
    "35L65"
  ],
  "name": "Godunov's theorem",
  "prov": null,
  "role": "theorem",
  "source": "https://github.com/tamnd/math2/blob/main/nodes/559/559N53ZTMV.md",
  "status": null,
  "tag": "559N53ZTMV",
  "uri": "m2://559N53ZTMV",
  "url": "https://tamnd.github.io/math2/wiki/godunovs-theorem/",
  "writing": {
    "tag": "559N53ZTMV",
    "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
      }
    ]
  }
}
