9.3: Правило Сімпсона
Наш аналіз правила середньої точки та правила трапеції показав, що обидва методи маютьO(1/N2) числову похибку. В обох випадках похибка може бути простежена до одного і того ж джерела: той факт, що інтегральна оцінка по кожному сегменту відрізняється від результату ряду Тейлора в другому порядку - термін, пропорційнийf″(xn). Це пропонує спосіб покращити результат числового інтегрування: ми могли б взяти середньозважене середнє значення правила середньої точки та правила трапеції, таким чином, що числові помилки другого порядку з двох схем скасовують один одного! Це метод числового інтегрування, відомий як правило Сімпсона.
Якщо бути точним, давайте знову розглянемо пару сусідніх відрізків, які лежать між рівнорозташованими точками дискретизації{xn−1,xn,xn+1}. Як виведено вище, інтеграл над цими сегментами може бути розширений Тейлором як
In=2f(xn)Δx+f″(xn)3Δx3+O(Δx5)+⋯
Для порівняння, оцінювачі правила середньої точки та правила трапеції для інтеграла є
Impn=2f(xn)Δx
Itrapzn=2f(xn)Δx+f″(xn)2Δx3+O(Δx5).
Отже, ми могли б взяти наступне середньозважене:
Isimpn=13Impn+23Itrapzn=2f(xn)Δx+f″(xn)3Δx3+O(Δx5).
Таке середньозважене буде відповідати результату серії Тейлора аж доO(Δx4)! (Ви можете перевірити самі, чи відрізняютьсяO(Δx5) умови.) Підводячи підсумок, правило Сімпсона для цього набору з трьох пунктів можна записати як
Isimpn=13[2f(xn)Δx]+23Δx[f(xn−1)2+f(xn)+f(xn+1)2]=Δx3[f(xn−1)+4f(xn)+f(xn+1)].
Загальна числова похибка, над наборомO(N) сегментів, дорівнюєO(1/N4). Це вдосконалення двох повноважень1/N над правилами трапцезіуму та середньої точки! Що ще краще, це те, що він включає в себе точно таку ж кількість арифметичних операцій, що і правило трапеції. Це так близько до безкоштовного обіду, як ви можете отримати в обчислювальній науці.
9.3.1 Реалізація правила Сімпсона на Python
У Scipy правило Сімпсона реалізовано функцією scipy.integrate.simps
, яка визначається у підмодулі scipy.integrate
. Подібно до функції trapz
, це може бути викликано або simps (y, x)
або simps (y, dx=s)
для оцінки інтеграла∫ydx, використовуючи елементи x
як точки дискретизації, при цьому y
вказуючи набір значень для integrand.
Оскільки правило Сімпсона вимагає поділу сегментів на пари, якщо ви вкажете парну кількість точок дискретизації в x
(тобто непарну кількість сегментів), функція вирішує це, виконуючи оцінку правила трапеції на першому та останньому сегментах. Зазвичай помилка незначна, тому не турбуйтеся про цю деталь
Ось приклад симпсів
в дії:
>>> from scipy import * >>> from scipy.integrate import simps >>> x = linspace(0,10,25) >>> y = exp(-x) >>> t = simps(y,x) >>> print(t) 1.00011864276
Для такої ж кількості точок дискретизації дає правило трапеції1.01438; точний результат -0.9999546… Ясно, правило Сімпсона більш точне.