Численное интегрированиеЧисленное интегрирование (историческое название: (численная) квадратура) — вычисление значения определённого интеграла (как правило, приближённое). Под численным интегрированием понимают набор численных методов для нахождения значения определённого интеграла. Численное интегрирование применяется, когда:
В этих двух случаях невозможно вычисление интеграла по формуле Ньютона — Лейбница. Также возможна ситуация, когда вид первообразной настолько сложен, что быстрее вычислить значение интеграла численным методом. Одномерный случайОсновная идея большинства методов численного интегрирования состоит в замене подынтегральной функции на более простую, интеграл от которой легко вычисляется аналитически. При этом для оценки значения интеграла получаются формулы вида где — число точек, в которых вычисляется значение подынтегральной функции. Точки называются узлами метода, числа — весами узлов. При замене подынтегральной функции на полином нулевой, первой и второй степени получаются соответственно методы прямоугольников, трапеций и парабол (Симпсона). Часто формулы для оценки значения интеграла называют квадратурными формулами. Частным случаем является метод построения интегральных квадратурных формул для равномерных сеток, известный как формулы Котеса. Метод назван в честь Роджера Котса. Основной идеей метода является замена подынтегральной функции каким-либо интерполяционным многочленом. После взятия интеграла можно написать где числа называются коэффициентами Котеса и вычисляются как интегралы от соответствующих многочленов, стоящих в исходном интерполяционном многочлене для подынтегральной функции при значении функции в узле ( — шаг сетки; — число узлов сетки, а индекс узлов ). Слагаемое — погрешность метода, которая может быть найдена разными способами. Для нечетных погрешность может быть найдена интегрированием погрешности интерполяционного полинома подынтегральной функции. Частными случаями формул Котеса являются: формулы прямоугольников (), формулы трапеций (), формула Симпсона (), формула Ньютона () и т. д. Метод прямоугольниковПусть требуется определить значение интеграла функции на отрезке . Этот отрезок делится точками на равных отрезков длиной Обозначим через значение функции в точках Далее составляем суммы Каждая из сумм — интегральная сумма для на и поэтому приближённо выражает интеграл Если заданная функция — положительная и возрастающая, то эта формула выражает площадь ступенчатой фигуры, составленной из «входящих» прямоугольников, также называемая формулой левых прямоугольников, а формула выражает площадь ступенчатой фигуры, состоящей из «выходящих» прямоугольников, также называемая формулой правых прямоугольников. Чем меньше длина отрезков, на которые делится отрезок , тем точнее значение, вычисляемое по этой формуле, искомого интеграла. Очевидно, стоит рассчитывать на бо́льшую точность, если брать в качестве опорной точки для нахождения высоты точку посередине промежутка. В результате получаем формулу средних прямоугольников: где Учитывая априорно бо́льшую точность последней формулы при том же объёме и характере вычислений её называют формулой прямоугольников Метод трапецийЕсли функцию на каждом из частичных отрезков аппроксимировать прямой, проходящей через конечные значения, то получим метод трапеций. Площадь трапеции на каждом отрезке: Погрешность аппроксимации на каждом отрезке:
Полная формула трапеций в случае деления всего промежутка интегрирования на отрезки одинаковой длины :
Погрешность формулы трапеций:
Метод парабол (метод Симпсона)Использовав три точки отрезка интегрирования, можно заменить подынтегральную функцию параболой. Обычно в качестве таких точек используют концы отрезка и его среднюю точку. В этом случае формула имеет очень простой вид
Если разбить интервал интегрирования на равных частей, то имеем где . Увеличение точностиПриближение функции одним полиномом на всем отрезке интегрирования, как правило, приводит к большой ошибке в оценке значения интеграла. Для уменьшения погрешности отрезок интегрирования разбивают на части и применяют численный метод для оценки интеграла на каждой из них. При стремлении количества разбиений к бесконечности оценка интеграла стремится к его истинному значению для аналитических функций для любого численного метода. Приведённые выше методы допускают простую процедуру уменьшения шага в два раза, при этом на каждом шаге требуется вычислять значения функции только во вновь добавленных узлах. Для оценки погрешности вычислений используется правило Рунге. Метод ГауссаОписанные выше методы используют фиксированные точки отрезка (концы и середину) и имеют низкий порядок точности (0 — методы правых и левых прямоугольников, 1 — методы средних прямоугольников и трапеций, 3 — метод парабол (Симпсона)). Если мы можем выбирать точки, в которых мы вычисляем значения функции , то можно при том же количестве вычислений подынтегральной функции получить методы более высокого порядка точности. Так, для двух (как в методе трапеций) вычислений значений подынтегральной функции можно получить метод уже не второго, а третьего порядка точности:
В общем случае, используя точек, по формуле можно получить метод с порядком точности , т. е. получаются точные значения для полиномов степени не выше . Значения узлов метода Гаусса по точкам являются корнями полинома Лежандра степени . Значения весов вычисляются по формуле , где - первая производная полинома Лежандра. Для узлы и веса имеют следующие значения : веса : (полином определен на отрезке ). Наиболее известен метод Гаусса по пяти точкам. Метод Гаусса — КронродаНедостаток метода Гаусса состоит в том, что он не имеет лёгкого (с вычислительной точки зрения) пути оценки погрешности полученного значения интеграла. Использование правила Рунге требует вычисления подынтегральной функции примерно в таком же числе точек, не давая при этом практически никакого выигрыша точности, в отличие от простых методов, где точность увеличивается в несколько раз при каждом новом разбиении. Кронродом был предложен следующий метод оценки значения интеграла
где — узлы метода Гаусса по точкам, а параметров , , подобраны таким образом, чтобы порядок точности метода был равен . Тогда для оценки погрешности можно использовать эмпирическую формулу:
где — приближённое значение интеграла, полученное методом Гаусса по точкам. Библиотеки gsl и SLATEC для вычисления определённых интегралов содержат подпрограммы, использующие метод Гаусса — Кронрода по 15, 21, 31, 41, 51 и 61 точкам. Библиотека ALGLIB использует метод Гаусса — Кронрода по 15 точкам. Метод ЧебышёваМетод Чебышева (или как его иногда называют Гаусса — Чебышева) является одним из представителей методов наивысшей алгебраической точности Гаусса. Его отличительной особенностью является наличие у подынтегральной функции множителя . Суть заключается в следующем:
где , , — количество узлов метода. Метод Гаусса-Лагера
Метод Гаусса-Эрмита
Интегрирование при бесконечных пределахДля интегрирования по бесконечным пределам нужно ввести неравномерную сетку, шаги которой нарастают при стремлении к бесконечности, либо можно сделать такую замену переменных в интеграле, после которой пределы будут конечны. Аналогичным образом можно поступить, если функция особая на концах отрезка интегрирования. См. в том числе Метод Самокиша. Методы Монте-КарлоДля определения площади под графиком функции можно использовать следующий стохастический алгоритм:
Этот алгоритм требует определения экстремумов функции на интервале и не использует вычисленное точное значение функции кроме как в сравнении, вследствие чего непригоден для практики. Приведённые в основной статье варианты метода Монте-Карло избавлены от этих недостатков. Для малого числа измерений интегрируемой функции производительность Монте-Карло интегрирования гораздо ниже, чем производительность детерминированных методов. Тем не менее, в некоторых случаях, когда функция задана неявно, а необходимо определить область, заданную в виде сложных неравенств, стохастический метод может оказаться более предпочтительным. Методы Рунге — КуттыМе́тоды Ру́нге — Ку́тты — важное семейство численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем — итеративные методы явного и неявного приближённого вычисления, разработанные около 1900 года немецкими математиками К. Рунге и М. В. Куттой.
Метод сплайнов
Многомерный случайВ небольших размерностях можно так же применять квадратурные формулы, основанные на интерполяционных многочленах. Интегрирование производится аналогично одномерному интегрированию. Для больших размерностей эти методы становятся неприемлемыми из-за быстрого возрастания числа точек сетки и/или сложной границы области. В этом случае применяется метод Монте-Карло. Генерируются случайные точки в нашей области и усредняются значения функции в них. Так же можно использовать смешанный подход — разбить область на несколько частей, в каждой из которых (или только в тех, где интеграл посчитать не удаётся из-за сложной границы) применить метод Монте-Карло. Примеры реализацииНиже приведена реализация на Python 3 метода средних прямоугольников, метода средних трапеций, метода Симпсона и метода Монте-Карло. import math, random
from numpy import arange
def get_i():
return math.e ** 1 - math.e ** 0
def method_of_rectangles(func, min_lim, max_lim, delta):
def integrate(func, min_lim, max_lim, n):
integral = 0.0
step = (max_lim - min_lim) / n
for x in arange(min_lim, max_lim-step, step):
integral += step * func(x + step / 2)
return integral
d, n = 1, 1
while abs(d) > delta:
d = (integrate(func, min_lim, max_lim, n * 2) - integrate(func, min_lim, max_lim, n)) / 3
n *= 2
a = abs(integrate(func, min_lim, max_lim, n))
b = abs(integrate(func, min_lim, max_lim, n)) + d
if a > b:
a, b = b, a
print('Rectangles:')
print('\t%s\t%s\t%s' % (n, a, b))
def trapezium_method(func, min_lim, max_lim, delta):
def integrate(func, min_lim, max_lim, n):
integral = 0.0
step = (max_lim - min_lim) / n
for x in arange(min_lim, max_lim-step, step):
integral += step*(func(x) + func(x + step)) / 2
return integral
d, n = 1, 1
while abs(d) > delta:
d = (integrate(func, min_lim, max_lim, n * 2) - integrate(func, min_lim, max_lim, n)) / 3
n *= 2
a = abs(integrate(func, min_lim, max_lim, n))
b = abs(integrate(func, min_lim, max_lim, n)) + d
if a > b:
a, b = b, a
print('Trapezium:')
print('\t%s\t%s\t%s' % (n, a, b))
def simpson_method(func, min_lim, max_lim, delta):
def integrate(func, min_lim, max_lim, n):
integral = 0.0
step = (max_lim - min_lim) / n
for x in arange(min_lim + step / 2, max_lim - step / 2, step):
integral += step / 6 * (func(x - step / 2) + 4 * func(x) + func(x + step / 2))
return integral
d, n = 1, 1
while abs(d) > delta:
d = (integrate(func, min_lim, max_lim, n * 2) - integrate(func, min_lim, max_lim, n)) / 15
n *= 2
a = abs(integrate(func, min_lim, max_lim, n))
b = abs(integrate(func, min_lim, max_lim, n)) + d
if a > b:
a, b = b, a
print('Simpson:')
print('\t%s\t%s\t%s' % (n, a, b))
def monte_karlo_method(func, n):
in_d, out_d = 0., 0.
for i in arange(n):
x, y = random.uniform(0, 1), random.uniform(0, 3)
if y < func(x): in_d += 1
print('M-K:')
print('\t%s\t%s' % (n, abs(in_d/n * 3)))
method_of_rectangles(lambda x: math.e ** x, 0.0, 1.0, 0.001)
trapezium_method(lambda x: math.e ** x, 0.0, 1.0, 0.001)
simpson_method(lambda x: math.e ** x, 0.0, 1.0, 0.001)
monte_karlo_method(lambda x: math.e ** x, 100)
print('True value:\n\t%s' % get_i())
Литература
См. также
|