Квадратуры Ньютона#
Задача численного интегрирования#
Требуется вычислить определенный интеграл
Интеграл предполагается собственным, то есть \(a, b \neq \infty\), \(|f(x)| < \infty\). Функция задана дискретно набором на сетке \(\{f(x_k) \}_{k=1}^N\).
Общий подход - правило квадратур#
Очевидно, что для численного приближения интеграла (вследствие линейности самого интеграла) общая формула для (численной) оценки будет
Такая формула называется квадратурой. Таким образом для корректно-определенной квадратуры хотим стремление ошибки к нулю
Квадратуры Ньютона-Котеса#
Определим произвольную сетку на отрезке:
И разложим интеграл:
Аппроксимируем каждый \(I_k\) как \(Q_k\) (теперь это интеграл по «маленькому» отрезку - гораздо более простая задача! Называется элементарная квадратура), и тогда итоговая составная квадратура будет
Осталось научиться аппроксимировать интегралы на «маленьком отрезке» - здесь нам поможет интерполяция.
Аппроксимация интегралов на малом отрезке. Элементарные квадратуры#
Если отрезок \([\alpha, \beta]\) достаточно мал, то можно приблизить нашу функции её интерполяционным многочленом (который интегрируется аналитически):
Будем приближать функцию на отрезке \([\alpha,\beta]\) интерполяционным многочленом на равномерной сетке:
\(P_0(x) = f(\alpha)\). Получится формула прямоугольников: \(\displaystyle \int_\alpha^\beta f(x) dx \approx (\beta-\alpha) f(\alpha)\)
\(P_1(x) = f(\alpha) + (x-\alpha) \frac{f(\beta) - f(\alpha)}{\beta-\alpha}\). Получится формула трапеций: \(\displaystyle \int_\alpha^\beta f(x) dx \approx (\beta-\alpha) \frac{f(\alpha) + f(\beta)}{2}\)
Для интерполяционного многочлена второй степени (случай \(p = 2\)) получаем формулу Симпсона
Квадратуры, построенные таким методом, называются квадратурами Ньютона-Котеса или интерполяционными квадратурами. Квадратуры на малых отрезках называются элементарными - осталось просуммировать все элементарные квадратуры для получения приближенного интеграла.
Составные квадратуры#
Пусть на отрезке \([a,b]\) задана равномерная сетка с интервалом \(h = \frac{b-a}{n}\). Применим к каждому отдельному интервалу формулу прямоугольников
Применив к каждому формулу трапеций, получаем
Объединив интервалы по два и, применив к каждой паре формулу Симпсона, получаем
Теоретическая погрешность составных формул#
Пример расчета погрешности#
Определим остаток следующей элементарной квадратуры:
Далее ряд Тейлора:
Итого,
Пусть \(M_1=\max _{x \in[a, b]}\left|f^{\prime}(x)\right|\). Тогда погрешность составной квадратуры будет
Несложно проделать эту же процедуру и для других методов:
\(p\) |
\(n\) |
Название |
Погрешность |
---|---|---|---|
\(0\) |
\(\forall\) |
Прямоугольников |
\(\frac{(b-a) h}{2} M_1\) |
\(1\) |
\(\forall\) |
Трапеций |
\(\frac{(b-a) h^2}{12} M_2\) |
\(2\) |
\(n = 2m\) |
Симпсона |
\(\frac{(b-a) h^4}{180} M_4\) |
\(3\) |
\(n = 3m\) |
Формула 3/8 |
\(\frac{(b-a) h^4}{80} M_4\) |
Показатель степени \(h\), как обычно, называется порядком сходимости метода.
Точность квадратурных формул#
Алгебраической степенью точности квадратурной формулы называют такое число \(d\), что квадратурная формула точна для всех многочленов степени \(d\), но для некоторых многочленов степени \(d+1\) уже не точна. Из вида остаточного члена заключаем, что метод прямоугольников имеет \(d=0\), метод трапеций \(d=1\), методы Симпсона и 3/8 \(d=3\).
Графики фактических погрешностей для простых квадратур#
def rectangle(f, h):
return h * sum(f[:-1])
def trapezoid(f, h):
return 0.5 * h * (f[0] + 2 * sum(f[1:-1]) + f[-1])
def simpson(f, h):
assert (len(f)-1) % 2 == 0
return h/3. * (f[0] + 4 * sum(f[1:-1:2]) + \
2 * sum(f[2:-2:2]) + f[-1])
def threeeights(f, h):
assert (len(f)-1) % 3 == 0
return 3*h/8. * (f[0] + 3 * sum(f[1:-1:3]) + \
3 * sum(f[2:-1:3]) + 2 * sum(f[3:-3:3]) + f[-1])
Show code cell source
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rc('font', **{'size' : 14})
def f(x): return 4 / (1 + x*x)
exact = 4 * np.arctan(0.5)
ns = 6 + 3 * 2**np.arange(1, 12)
errs = []
for n in ns:
x = np.linspace(0, 0.5, n+1)
fv = f(x)
I1 = rectangle(fv, x[1] - x[0])
I2 = trapezoid(fv, x[1] - x[0])
I3 = simpson(fv, x[1] - x[0])
I4 = threeeights(fv, x[1] - x[0])
errs.append([abs(I1-exact), abs(I2-exact), abs(I3-exact), abs(I4-exact)])
errs=np.array(errs)
plt.figure(figsize=(10, 7))
plt.loglog(ns, errs[:, 0], 'b.-', label='Rectangles', lw=2, ms=10)
plt.loglog(ns, errs[:, 1], 'g.-', label='Trapezoids', lw=2, ms=10)
plt.loglog(ns, errs[:, 2], 'r.-', label='Simpson''s', lw=2, ms=10)
plt.loglog(ns, errs[:, 3], 'm.-', label='3/8 rule', lw=2, ms=10)
plt.legend(loc='center left', bbox_to_anchor=(1, .5))
plt.xlabel('$n$')
plt.ylabel('$\\varepsilon$')
plt.xlim(ns[0], ns[-1])
plt.grid()
plt.show()
