Перейти до основного вмісту

Інтегрування за формулою Сімпсона

Ми збираємося обчислити значення визначеного інтеграла

abf(x)dx\int_a ^ b f (x) dx

Описаний тут розв'язок було опубліковано в одній із дисертацій Томаса Сімпсона у 1743 році.

Коли підходить цей алгоритм?
  • Підінтегральну функцію f(x)f(x) важко або неможливо проінтегрувати аналітично, тож потрібне чисельне наближення? (якщо первісну легко взяти аналітично — інтегруйте напряму, без чисельного методу)
  • Функцію можна обчислити в довільній точці відрізка [a,b][a, b], а сам ff достатньо гладкий (мала четверта похідна)?
  • Шукаєте площу / визначений інтеграл, а не корінь чи екстремум функції? (для кореня → Метод Ньютона, для екстремуму → Тернарний пошук)

Формула Сімпсона

Нехай nn — деяке натуральне число. Розіб'ємо відрізок інтегрування [a,b][a, b] на 2n2n рівних частин:

xi=a+ih,  i=02n,x_i = a + i h, ~~ i = 0 \ldots 2n, h=ba2n.h = \frac {b-a} {2n}.

Тепер обчислимо інтеграл окремо на кожному з відрізків [x2i2,x2i][x_ {2i-2}, x_ {2i}], i=1ni = 1 \ldots n, а потім додамо всі значення.

Отже, припустимо, що ми розглядаємо черговий відрізок [x2i2,x2i],i=1n[x_ {2i-2}, x_ {2i}], i = 1 \ldots n. Замінимо на ньому функцію f(x)f(x) параболою P(x)P(x), що проходить через 3 точки (x2i2,x2i1,x2i)(x_ {2i-2}, x_ {2i-1}, x_ {2i}). Така парабола завжди існує і єдина; її можна знайти аналітично. Наприклад, ми могли б побудувати її за допомогою інтерполяційного многочлена Лагранжа. Єдине, що залишається зробити, — проінтегрувати цей многочлен. Якщо зробити це для загальної функції ff, ми отримаємо напрочуд простий вираз:

x2i2x2if(x) dxx2i2x2iP(x) dx=(f(x2i2)+4f(x2i1)+(f(x2i))h3\int_{x_ {2i-2}} ^ {x_ {2i}} f (x) ~dx \approx \int_{x_ {2i-2}} ^ {x_ {2i}} P (x) ~dx = \left(f(x_{2i-2}) + 4f(x_{2i-1})+(f(x_{2i})\right)\frac {h} {3}

Додавши ці значення по всіх відрізках, ми отримуємо остаточну формулу Сімпсона:

abf(x)dx(f(x0)+4f(x1)+2f(x2)+4f(x3)+2f(x4)++4f(x2N1)+f(x2N))h3\int_a ^ b f (x) dx \approx \left(f (x_0) + 4 f (x_1) + 2 f (x_2) + 4f(x_3) + 2 f(x_4) + \ldots + 4 f(x_{2N-1}) + f(x_{2N}) \right)\frac {h} {3}

Похибка

Похибка наближення інтеграла за формулою Сімпсона дорівнює

190(ba2)5f(4)(ξ)-\tfrac{1}{90} \left(\tfrac{b-a}{2}\right)^5 f^{(4)}(\xi)

де ξ\xi — деяке число між aa і bb.

Похибка асимптотично пропорційна (ba)5(b-a)^5. Однак наведені вище викладки наводять на думку про похибку, пропорційну (ba)4(b-a)^4. Формула Сімпсона набуває додаткового порядку, оскільки точки, у яких обчислюється підінтегральна функція, розподілені симетрично на відрізку [a,b][a, b].

Реалізація

Тут f(x)f(x) — деяка визначена користувачем функція.

const int N = 1000 * 1000; // кількість кроків (уже помножена на 2)

double simpson_integration(double a, double b){
double h = (b - a) / N;
double s = f(a) + f(b); // a = x_0 і b = x_2n
for (int i = 1; i <= N - 1; ++i) { // дивіться остаточну формулу Сімпсона
double x = a + h * i;
s += f(x) * ((i & 1) ? 4 : 2);
}
s *= h / 3;
return s;
}

Задачі для практики

Відеоматеріали