Фізика та симуляція
Квітень 2026 · 17 хв читання · Чисельні методи · Аналіз похибок · JavaScript

Чисельне диференціювання та інтегрування: від скінченних різниць до квадратури Гаусса

Кожен симулятор фізики зрештою зводиться до чисельного обчислення похідних та інтегралів. Вибір неправильного методу — чи неправильного кроку — може означати похибки, що зростають експоненційно, або результати, у яких домінує шум чисел з рухомою комою. Ця стаття розгортає теорію з перших принципів: шаблони скінченних різниць, екстраполяція Річардсона, правила Ньютона-Котеса, квадратура Гаусса та адаптивне інтегрування з контролем похибки.

1. Похибка зрізання проти похибки округлення

Під час чисельного наближення похідної чи інтеграла конкурують два незалежні джерела похибки:

Оптимальний крок балансує між цими двома: надто великий — і домінує зрізання; надто малий — і домінує округлення. Для подвійної точності IEEE 754 (ε_mach ≈ 2.2 × 10⁻¹⁶) оптимальний h для центральної різниці першої похідної приблизно дорівнює:

h_opt ≈ ε_mach^(1/3) ≈ 6 × 10^-6 (для центральної різниці) h_opt ≈ ε_mach^(1/2) ≈ 1.5 × 10^-8 (для прямої різниці)

За межею h_opt межу похибки задає округлення, і її не можна зменшити далі зменшенням h. Це фундаментальне обмеження — щоб отримати кращі похідні, потрібна або арифметика вищої точності, або математично інший підхід (автоматичне диференціювання, комплексний крок).

2. Формули скінченних різниць

Усі формули скінченних різниць виводяться з рядів Тейлора. Розклавши f(x + h) навколо x:

f(x+h) = f(x) + h·f'(x) + (h²/2)·f''(x) + (h³/6)·f'''(x) + ... f(x-h) = f(x) - h·f'(x) + (h²/2)·f''(x) - (h³/6)·f'''(x) + ...

Формули першої похідної

Формула Вираз Похибка
Пряма різниця (f(x+h) − f(x)) / h O(h)
Зворотна різниця (f(x) − f(x−h)) / h O(h)
Центральна різниця (f(x+h) − f(x−h)) / (2h) O(h²)
5-точковий шаблон (−f(x+2h) + 8f(x+h) − 8f(x−h) + f(x−2h)) / (12h) O(h⁴)

Центральна різниця досягає точності другого порядку, бо провідний член похибки (від h²·f'') скорочується при відніманні f(x+h) − f(x−h). Саме тому центральні різниці є кращими щоразу, коли доступні обчислення функції з обох боків x.

Друга похідна

f''(x) ≈ (f(x+h) − 2f(x) + f(x−h)) / h² // похибка O(h²) // Виведення: додати два ряди Тейлора: // f(x+h) + f(x-h) = 2f(x) + h²·f''(x) + (h⁴/12)·f''''(x) + ... // Перегрупувати: // f''(x) = [f(x+h) - 2f(x) + f(x-h)] / h² - (h²/12)·f''''(x) + ...

Формула другої похідної використовує три точки й має похибку O(h²). Зверніть увагу, що коефіцієнт похибки — 1/12 × f⁽⁴⁾, тож функції з великими четвертими похідними (як-от sin(100x)) страждають більше. Ця формула всюдисуща у фізиці: вона реалізує дискретний 1D-лапласіан і є основою розв'язувачів PDE на скінченних різницях.

Мішані частинні похідні

∂²f/∂x∂y ≈ [f(x+h,y+h) − f(x+h,y−h) − f(x−h,y+h) + f(x−h,y−h)] / (4h²)

Цей 4-точковий хрестоподібний шаблон має похибку O(h²) і використовується для обчислення матриць Гессе для оптимізації та в розв'язувачах задач пружності.

3. Екстраполяція Річардсона

Екстраполяція Річардсона — потужний прийом для підвищення порядку точності будь-якого наближення скінченними різницями без виведення нової формули. Ідея: якщо відомо, що похибка наближення D(h) має вигляд

D(h) = f'(x) + a₁h² + a₂h⁴ + ... (для центральної різниці непарні степені зникають)

то, обчисливши при h та h/2, ми можемо усунути провідний член h²:

D(h) = f'(x) + a·h² + O(h⁴) D(h/2) = f'(x) + a·h²/4 + O(h⁴) // Усунути a·h² : R(h) = [4·D(h/2) − D(h)] / 3 = f'(x) + O(h⁴)

Це фактично підвищило центральну різницю O(h²) до O(h⁴) — так само, як 5-точковий шаблон — за допомогою лише двох дешевших обчислень. Процес можна повторювати рекурсивно (інтегрування Ромберга для інтегралів або ітеративний Річардсон для похідних), щоб досягти довільно високого порядку.

Інтегрування Ромберга

Інтегрування Ромберга застосовує екстраполяцію Річардсона до складеного правила трапецій:

T(h) = h/2 · [f(a) + 2Σf(aₖ) + f(b)] // складена трапеція // Таблиця Річардсона (кожен рядок ділить h навпіл, кожен стовпець екстраполює): R[i][0] = T(h/2^i) R[i][j] = [4^j · R[i][j-1] − R[i-1][j-1]] / (4^j − 1) // R[n][n] збігається швидко (похибка O(h^(2n+2)))

На практиці інтегрування Ромберга збігається настільки швидко, що навіть R[4][4] (потребуючи лише 17 обчислень функції) досягає точності подвійної точності для більшості гладких функцій. Це основний метод для одновимірних інтегралів на замкнених інтервалах.

4. Диференціювання вищого порядку та з комплексним кроком

Шаблони вищого порядку через невизначені коефіцієнти

Будь-який шаблон скінченних різниць можна вивести систематично. Щоб знайти k-ту похідну з n точками, запишіть:

f^(k)(x) ≈ Σᵢ cᵢ · f(x + iΔx)

Коефіцієнти cᵢ знаходять, вимагаючи, щоб формула була точною для многочленів 1, x, x², ..., x^(n−1) (тобто розв'язуючи систему Вандермонда). Сайт findiff автоматизує це. Для робочого коду надійно реалізують це findiff.coefficients() зі scipy або numpy.gradient() з numpy.

Диференціювання з комплексним кроком

Прийом комплексного кроку — мабуть, найбільш недооцінений прийом чисельного диференціювання:

// Обчислити f у x + ih (уявний крок) f(x + ih) = f(x) + ih·f'(x) − (h²/2)·f''(x) − (ih³/6)·f'''(x) + ... // Взяти уявну частину й поділити на h: Im[f(x + ih)] / h = f'(x) − (h²/6)·f'''(x) + ... // O(h²) — БЕЗ скорочення!

Вирішальна перевага: оскільки ми беремо уявну частину, немає віднімання майже рівних чисел. Похибка округлення суто від обчислення f у комплексній точці, а не від скорочення. Ми можемо використати h = 10⁻²⁰ й отримати майже точні перші похідні, обмежені лише власною точністю обчислення функції. Єдина вимога: функцію f має бути можливо реалізувати над комплексними числами (легко робиться в Python, Julia, C++ з std::complex).

Емпіричне правило: використовуйте комплексний крок (h ≈ 1e−20) для обчислення градієнта в оптимізації та аналізі чутливості. Використовуйте центральні різниці (h ≈ 1e−6) для швидких наближень якобіана в методах Ньютона. Використовуйте екстраполяцію Річардсона, коли вам потрібні похідні високого порядку функції-«чорної скриньки».

5. Правила інтегрування Ньютона-Котеса

Правила Ньютона-Котеса інтегрують, підганяючи многочлен через рівновіддалені точки й інтегруючи многочлен точно.

Правило Точки Формула Похибка
Середньої точки 1 h · f((a+b)/2) O(h³)
Трапецій 2 (h/2)[f(a)+f(b)] O(h³)
Сімпсона 1/3 3 (h/6)[f(a)+4f(m)+f(b)] O(h⁵)
Сімпсона 3/8 4 (3h/8)[f(a)+3f(m₁)+3f(m₂)+f(b)] O(h⁵)
Правило Буля 5 (2h/45)[7f₀+32f₁+12f₂+32f₃+7f₄] O(h⁷)

Складені правила

Одне правило Сімпсона на [a, b] використовує 3 точки. Складене правило Сімпсона ділить [a, b] на n (парне число) підінтервалів ширини h = (b−a)/n і застосовує Сімпсона на кожну пару:

∫ₐᵇ f dx ≈ (h/3)[f(x₀) + 4f(x₁) + 2f(x₂) + 4f(x₃) + ... + 4f(x_{n-1}) + f(xₙ)] // Локальна похибка: O(h⁵) на підінтервал // Глобальна похибка: O(h⁴) на [a,b] (n підінтервалів × h⁵/h = h⁴)

Чому не Ньютон-Котес вищого порядку?

Для n ≥ 8 ваги Ньютона-Котеса містять від'ємні значення — тобто формула віднімає додатні значення функції, що призводить до катастрофічного скорочення та поганих числових властивостей. Це феномен Рунге для інтегрування. Натомість для високої точності слід використовувати квадратуру Гаусса (яка хитро розташовує вузли в нерівномірних позиціях, щоб цього уникнути) або складений Сімпсон/трапеції з екстраполяцією Річардсона (Ромберг).

6. Квадратура Гаусса

Тоді як Ньютон-Котес фіксує позиції вузлів і знаходить ваги, квадратура Гаусса спільно оптимізує обидва. n-точкове правило Гаусса точне для многочленів степеня до 2n − 1 — удвічі точніше за n-точкове правило Ньютона-Котеса. Усі ваги додатні (уникає скорочення), а вузли — корені ортогональних многочленів.

Квадратура Гаусса-Лежандра

Для інтегралів на [−1, 1] правило Гаусса-Лежандра використовує вузли xᵢ = корені многочлена Лежандра Pₙ(x) та ваги:

wᵢ = 2 / [(1 − xᵢ²) · (Pₙ'(xᵢ))²] ∫₋₁¹ f(x) dx ≈ Σᵢ₌₁ⁿ wᵢ f(xᵢ)
n Вузли xᵢ Ваги wᵢ Точне для степеня многочлена
2 ±0.577350 1.000000 ≤ 3
3 0, ±0.774597 0.888889, 0.555556 ≤ 5
5 0, ±0.538469, ±0.906180 0.568889, 0.478629, 0.236927 ≤ 9

Щоб інтегрувати на [a, b] замість [−1, 1], застосуйте заміну змінних x = (b−a)/2 · t + (a+b)/2:

∫ₐᵇ f(x) dx = (b−a)/2 · Σᵢ wᵢ · f((b−a)/2 · xᵢ + (a+b)/2)

Правила Гаусса-Кронрода (G7K15)

Багато адаптивних інтеграторів (QUADPACK, scipy.integrate.quad) використовують 15-точкове правило Гаусса-Кронрода. Воно вкладає 7-точкове правило Гаусса-Лежандра як підмножину: 7 наявних вузлів повторно використовуються, а 8 нових вузлів додаються. Це дає водночас високоточний результат (15 точок) та оцінку похибки (|G15 − G7|) без додаткових обчислень функції порівняно з обчисленням G15 з нуля. Оцінена похибка керує адаптивним поділом.

7. Адаптивне інтегрування та контроль похибки

Адаптивні алгоритми автоматично концентрують обчислення функції там, де підінтегральна функція змінюється найбільше, разюче підвищуючи ефективність для негладких чи гостропікових функцій.

Адаптивне правило Сімпсона

Найпростіша адаптивна схема оцінює похибку на [a, b], порівнюючи результат Сімпсона на всьому інтервалі із сумою двох результатів на півінтервалах:

S(a, b) = Сімпсон на [a, b] (3 обчислення) S₁ + S₂ = Сімпсон на [a,m] + Сімпсон на [m,b] (5 обчислень, m=(a+b)/2) Оцінка похибки ≈ |S(a,b) − (S₁+S₂)| / 15 // з розкладу похибки h⁴

Якщо оцінка похибки < допуск × (b−a) / (b−a_total), рекурсуйте на кожній половині; інакше прийміть S₁ + S₂ як локальний результат. Цей процес завершується за O(n log n) обчислень функції для ліпшиц-неперервних підінтегральних функцій.

Реалізація на JavaScript

// Адаптивне інтегрування за Сімпсоном
function adaptiveSimpson(f, a, b, tol = 1e-9) {
  function simpson(f, a, b) {
    const m = (a + b) / 2;
    return (b - a) / 6 * (f(a) + 4 * f(m) + f(b));
  }
  function recurse(a, b, tol, whole, fa, fm, fb, depth) {
    const m = (a + b) / 2;
    const lm = (a + m) / 2, rm = (m + b) / 2;
    const flm = f(lm), frm = f(rm);
    const left  = (m - a) / 6 * (fa + 4 * flm + fm);
    const right = (b - m) / 6 * (fm + 4 * frm + fb);
    const delta = left + right - whole;
    if (depth >= 50 || Math.abs(delta) <= 15 * tol)
      return left + right + delta / 15;
    return recurse(a, m, tol/2, left,  fa, flm, fm, depth+1)
         + recurse(m, b, tol/2, right, fm, frm, fb, depth+1);
  }
  const fa = f(a), fb = f(b), fm = f((a+b)/2);
  const whole = (b - a) / 6 * (fa + 4 * fm + fb);
  return recurse(a, b, tol, whole, fa, fm, fb, 0);
}

// Приклади використання:
console.log(adaptiveSimpson(Math.sin, 0, Math.PI));  // ≈ 2.0
console.log(adaptiveSimpson(x => 1/x, 1, 100));      // ≈ ln(100) ≈ 4.6052
    

Адаптивний Гаусс-Кронрод (у стилі scipy)

Робочі інтегратори, як-от scipy.integrate.quad, використовують правило G7K15 зі стратегією поділу на основі черги з пріоритетами (підінтервал із найбільшою похибкою ділиться першим). Вони також обробляють:

8. Застосування в симуляції

Обчислення градієнта у фізичних рушіях

Багатьом фізичним рушіям потрібні градієнти функцій енергії чи потенціалу. Для простих аналітичних потенціалів (пружини, гравітація) кращими є точні похідні. Для складних потенціалів чи потенціалів-«чорних скриньок» (силові поля нейронних мереж, табличні потенціали) використовують скінченні різниці або похідні з комплексним кроком.

У молекулярній динаміці міжатомна сила — це F = −∇U(r). Потенціал Леннарда-Джонса:

U(r) = 4ε[(σ/r)¹² − (σ/r)⁶] // Аналітична похідна (краща): dU/dr = 4ε[−12σ¹²/r¹³ + 6σ⁶/r⁷] // Чисельна альтернатива (5-точковий шаблон для валідації): dU/dr ≈ [−U(r+2h) + 8U(r+h) − 8U(r−h) + U(r−2h)] / (12h)

Чисельне інтегрування в розв'язувачах ОДР

Зв'язок між інтегруванням і розв'язанням ОДР: метод Ейлера — це просто правило прямокутників за лівим кінцем, застосоване до інтегральної форми ОДР:

y(t+h) = y(t) + ∫ₜᵗ⁺ʰ f(y(τ)) dτ // Ейлер (точність 1-го степеня): ≈ y(t) + h · f(y(t)) // Трапеція (степінь 2): ≈ y(t) + h/2 · [f(y(t)) + f(y(t+h))] (неявна) // RK4 (степінь 4): ≈ y(t) + h/6 · [k₁ + 2k₂ + 2k₃ + k₄] // де k₁=f(t,y), k₂=f(t+h/2,y+h/2·k₁), тощо.

RK4 — це точно правило Сімпсона, застосоване до підінтегральної функції f(y)! Ця еквівалентність пояснює, чому RK4 досягає точності четвертого порядку (так само, як Сімпсон) і чому йому потрібні 4 обчислення функції на крок.

Аналіз чутливості

У симуляції на основі оптимізації (наприклад, обернена кінематика, фізично-інформовані нейронні мережі) нам потрібні похідні виходів за параметрами. Для малої кількості параметрів скінченні різниці працюють. Для великої кількості параметрів (нейронні мережі з мільйонами ваг) потрібне зворотне поширення (автоматичне диференціювання в зворотному режимі) — скінченні різниці були б у O(n) разів дорожчими. Комплексний крок займає золоту середину: точний до машинної точності, без потреби в AD-інфраструктурі, працює для помірної кількості параметрів (до ~1000 параметрів).

Підсумок рекомендацій:
• Перші похідні гладких функцій: центральна різниця (h ≈ 1e−6) або комплексний крок (h ≈ 1e−20)
• Похідні високого порядку: екстраполяція Річардсона, застосована до центральних різниць
• 1D інтеграли на скінченних інтервалах: адаптивний Сімпсон або Ромберг
• Багатовимірні інтеграли: тензорний добуток Гаусса-Лежандра (низька розмірність) або Монте-Карло (висока розмірність)
• Інтеграли з особливостями: Гаусс-Якобі/Лагерр або QUADPACK