Формула Симпсона: парабола вместо отрезка

Урок про формулу Симпсона — рабочую лошадку численного интегрирования с четвёртым порядком точности.

Формула Симпсона приближает интеграл, заменяя функцию на каждой паре соседних полосок параболой через три точки; составная формула имеет 4-й порядок точности.

Идея: ловить кривизну

Трапеции заменяют функцию на полоске прямой — и не чувствуют кривизны. Симпсон идёт дальше: берёт две соседние полоски (три узла: левый, средний, правый) и проводит через них параболу. Парабола повторяет изгиб функции куда лучше прямой, поэтому точность скачком вырастает до четвёртого порядка: удвоение n уменьшает ошибку в 16 раз. Бонус: формула Симпсона точна для любых полиномов до третьей степени включительно — хотя строится по параболе, она интегрирует и кубики без ошибки.

Веса узлов в формуле — 1, 4, 2, 4, 2, ..., 4, 1 (краевые с весом 1, средние полосок — 4, стыки — 2), всё умножается на h/3. Число полосок n должно быть чётным (узлы идут парами).

import math

def симпсон(f, a, b, n):
    if n % 2:           # n должно быть чётным
        n += 1
    h = (b - a) / n
    s = f(a) + f(b)
    for i in range(1, n):
        s += (4 if i % 2 else 2) * f(a + i * h)   # нечётные*4, чётные*2
    return s * h / 3

# Проверка 1: интеграл sin от 0 до pi = 2
print("∫sin(0..π):", round(симпсон(math.sin, 0.0, math.pi, 10), 8), " истина = 2")
# Проверка 2: интеграл x^4 от 0 до 1 = 0.2 (степень 4 — уже не точно)
print("∫x⁴(0..1):", round(симпсон(lambda x: x**4, 0.0, 1.0, 10), 8), " истина = 0.2")

# Порядок: ошибка падает в ~16 раз при удвоении n
точно = 2.0
print("\nсходимость на ∫sin(0..π):")
for n in [4, 8, 16, 32]:
    приближение = симпсон(math.sin, 0.0, math.pi, n)
    print(f"  n={n:2}: ошибка = {abs(приближение - точно):.2e}")

Вывод:

∫sin(0..π): 2.00010952  истина = 2
∫x⁴(0..1): 0.20001333  истина = 0.2

сходимость на ∫sin(0..π):
  n= 4: ошибка = 4.56e-03
  n= 8: ошибка = 2.69e-04
  n=16: ошибка = 1.66e-05
  n=32: ошибка = 1.03e-06

При удвоении n ошибка падает примерно в 16 раз (4.6e-3 → 2.7e-4 → 1.7e-5) — это четвёртый порядок в действии. Сравните с трапециями из прошлого урока: при n=16 Симпсон даёт ошибку 1.7e-5, трапеции — 6.5e-4, почти в 40 раз хуже при той же сетке.

Откуда веса 1-4-2-4-1

Формула Симпсона на двух полосках выводится интегрированием параболы Лагранжа через три узла: ∫ ≈ (h/3)(f₀ + 4f₁ + f₂). В составной формуле такие тройки накладываются: средний узел каждой пары входит с весом 4, а узлы-стыки принадлежат двум соседним тройкам — поэтому их веса складываются в 2. Краевые узлы участвуют лишь раз — вес 1. Отсюда характерный узор 1, 4, 2, 4, ..., 4, 1.

Как работает под капотом

Погрешность составного Симпсона — −(b−a)·h⁴·f⁽⁴⁾(ξ)/180: четвёртая производная и h⁴ объясняют и высокий порядок, и точность на кубиках (у них f⁽⁴⁾=0). Симпсон — частный случай более общей идеи квадратур Ньютона–Котеса: брать полином всё выше через равноотстоящие узлы. Но выше Симпсона эта идея буксует: формулы высокого порядка на равномерных узлах получают отрицательные веса и теряют устойчивость (родственник феномена Рунге). Поэтому на практике берут не «Симпсон 10-го порядка», а либо адаптивный Симпсон (следующий урок), либо квадратуры Гаусса с неравномерными узлами.

Частые ошибки

  • Нечётное число полосок. Симпсон требует чётного n (узлы идут тройками с перекрытием); иначе формула неверна.
  • Перепутать веса 4 и 2. Вес 4 — у середин полосок (нечётные индексы), 2 — у стыков (чётные внутренние); ошибка в индексации портит ответ.
  • Гнаться за порядком через Ньютона–Котеса высоких степеней. Они неустойчивы; лучше адаптивный Симпсон или Гаусс.

Итоги

  • Симпсон заменяет функцию параболой на каждой паре полосок — 4-й порядок (удвоение n → ошибка ÷16).
  • Точна для полиномов до 3-й степени; веса узлов — 1, 4, 2, 4, ..., 4, 1, множитель h/3, n чётно.
  • Это частный случай Ньютона–Котеса; выше Симпсона равномерные формулы становятся неустойчивыми.
  • На практике — основа адаптивного интегрирования; при той же сетке точнее трапеций на порядки.
Проверьте себя
1. Какой порядок точности у составной формулы Симпсона?
Aвторой
Bтретий
Cчетвёртый (удвоение n уменьшает ошибку в ~16 раз)
Dпервый
2. Полиномы какой степени формула Симпсона интегрирует точно?
Aтолько до 1-й
Bдо 2-й (параболы)
Cдо 3-й включительно
Dлюбой степени
3. Каким должно быть число полосок n для формулы Симпсона?
Aлюбым
Bчётным
Cнечётным
Dстепенью двойки