<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kukarkin</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kukarkin"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Kukarkin"/>
	<updated>2026-10-22T17:17:35Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=27410</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=27410"/>
		<updated>2019-07-31T08:07:51Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Квадратурные Формулы Гаусса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{level-a}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Kukarkin|А.Б.Кукаркин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой; различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{a+b}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dt^n}((t^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел —  массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Численные методы интегрирования]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;br /&gt;
&lt;br /&gt;
[[en:Cubature rules]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=14374</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=14374"/>
		<updated>2016-10-28T12:28:53Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Kukarkin|А.Б.Кукаркин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой; различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{a+b}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел —  массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Численные методы интегрирования]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=13911</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=13911"/>
		<updated>2016-10-26T10:41:16Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Kukarkin|А.Б.Кукаркин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой; различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{a+b}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Численные методы интегрирования]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3358</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3358"/>
		<updated>2016-02-09T08:57:43Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Kukarkin|А.Б.Кукаркин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3357</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3357"/>
		<updated>2016-02-09T08:50:06Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3356</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3356"/>
		<updated>2016-02-09T08:49:05Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
[[Умножение плотных матриц]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3330</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3330"/>
		<updated>2016-02-04T14:18:13Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности квадратурной формулы Гаусса c &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_{2n}(n!)^4}{((2n)!)^3(2n+1)}(b-a)^{2n+1},&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_{2n}=\max\limits_{x\in[a,b]}|f^{(2n)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3328</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3328"/>
		<updated>2016-02-04T13:47:04Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
Воспользовавшись квадратурной формулой Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt;, получим квадратурную формулу Гаусса для отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\frac{b-a}2\sum\limits_{i=1}^n c_i f(x_i),&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;x_i=0.5(a+b+(b-a)t_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; — корни многочлена Лежандра &amp;lt;math&amp;gt;P_n(t)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты квадратурных формул Гаусса положительны. Поэтому использование квадратурных формул Гаусса с большим числом узлов не приводит к тем осложнениям, которые возникают при использовании формул Ньютона-Котеса.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3326</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3326"/>
		<updated>2016-02-04T13:17:54Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Квадратурные Формулы Гаусса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы получить квадратурную формулу Гаусса для произвольного отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;, следует сделать замену переменной&lt;br /&gt;
: &amp;lt;math&amp;gt;x=\frac{a+b}2+\frac{b-a}2\,t,&amp;lt;/math&amp;gt;&lt;br /&gt;
в результате которой&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b\!f(x)\,dx=\frac{b-a}2\int\limits_{-1}^1\!f\left(\frac{a+b}2+\frac{b-a}2\,t\right)\,dt.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3317</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3317"/>
		<updated>2016-02-04T11:14:21Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
В случае отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; квадратурная формула&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)dt\approx\sum\limits_{i=1}^n c_i f(t_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
является квадратурной формулой Гаусса тогда и только тогда, когда она является интерполяционной, а ее узлы &amp;lt;math&amp;gt;t_i&amp;lt;/math&amp;gt; являются корнями многочлена Лежандра&lt;br /&gt;
: &amp;lt;math&amp;gt;P_n(t)=\frac1{2^nn!}\frac{d^n}{dx^n}((x^2-1)^n).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В частности, при &amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; квадратурные формулы Гаусса для отрезка &amp;lt;math&amp;gt;[-1,1]&amp;lt;/math&amp;gt; таковы:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx f\left(-\frac1{\sqrt3}\right)+f\left(\frac1{\sqrt3}\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_{-1}^1 f(t)\,dt\approx\frac59\;f\left(-\sqrt{\frac35}\right)+\frac89\;f(0)+&lt;br /&gt;
\frac59\;f\left(\sqrt{\frac35}\right).&amp;lt;/math&amp;gt;&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3311</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3311"/>
		<updated>2016-02-03T13:08:19Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Квадратурные Формулы Гаусса ====&lt;br /&gt;
&lt;br /&gt;
Как отмечалось выше, если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной, то ее алгебраическая степень точности не меньше &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;; при любых заданных узлах построение интерполяционной квадратурной формулы осуществляется за счет выбора ее &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; коэффициентов. За счет же выбора &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов интерполяционной квадратурной формулы можно добиться того, чтобы она имела возможно более высокую алгебраическую степень точности, а именно &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задача построения такой квадратурной формулы рассматривалась Карлом Фридрихом Гауссом; им была доказана ее разрешимость.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами, алгебраическая степень точности которой равна &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt;, называется квадратурной формулой Гаусса или квадратурной формулой наивысшей алгебраической степени точности.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3307</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3307"/>
		<updated>2016-02-02T12:47:28Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Формулы Ньютона-Котеса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f\left(\frac{a+b}2\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,\left(f(a)+3f\left(\frac{2a+b}3\right)+3f\left(\frac{a+2b}3\right)+f(b)\right),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3306</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3306"/>
		<updated>2016-02-02T09:06:26Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; — коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\le 2n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными. Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если интерполяционная квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами имеет алгебраическую степень точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3295</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3295"/>
		<updated>2016-02-01T13:55:40Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; — интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул — приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3294</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3294"/>
		<updated>2016-02-01T13:54:25Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится не на равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье.&lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить значение подынтегрального выражения и помножить его на весовой коэффициент, затем данные числа складываются, и полученная сумма и представляет собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования, представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное и максимальное значения координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности. По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;. Функция для заданного отрезка приближается константной функцией, тем самым интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx f((a+b)/2)*(b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;. &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым интеграл приближается усредненным значением по краям отрезка.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx (f(a)+f(b))*(b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;. &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx \frac{b-a}6\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;. &amp;lt;math&amp;gt;f()x&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек выбираются не концы отрезка, что позволяет увеличить точность.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx \frac{b-a}2\left(f\left(\frac{a+b}2-\frac{b-a}{2\sqrt 3}\right)+f\left(\frac{a+b}2+\frac{b-a}{2\sqrt 3}\right)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерной ситуации распространены методы прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерной ситуации также можно использовать метод Гаусса, однако для больших размерностей не остается ничего, способного конкурировать с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе. на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;x_{1,i},\ldots,x_{n,i}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, в которых будет вычисляться функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будут умножаться значения функции, после чего управление передается вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n c_i f(x_{1,i},\ldots,x_{n,i}).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3293</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3293"/>
		<updated>2016-02-01T13:51:39Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится не на равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье.&lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить значение подынтегрального выражения и помножить его на весовой коэффициент, затем данные числа складываются, и полученная сумма и представляет собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования, представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное и максимальное значения координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности. По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;. Функция для заданного отрезка приближается константной функцией, тем самым интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx f((a+b)/2)*(b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;. &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым интеграл приближается усредненным значением по краям отрезка.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx (f(a)+f(b))*(b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;. &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx \frac{b-a}6\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;. &amp;lt;math&amp;gt;f()x&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек выбираются не концы отрезка, что позволяет увеличить точность.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx \frac{b-a}2\left(f\left(\frac{a+b}2-\frac{b-a}{2\sqrt 3}\right)+f\left(\frac{a+b}2+\frac{b-a}{2\sqrt 3}\right)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерной ситуации распространены методы прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерной ситуации также можно использовать метод Гаусса, однако для больших размерностей не остается ничего, способного конкурировать с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе. на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;x_{1,i},\ldots,x_{n,i}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, в которых будет вычисляться функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будут умножаться значения функции, после чего управление передается вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n c_i f(x_{1,i},\ldots).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3292</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3292"/>
		<updated>2016-02-01T13:45:47Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится не на равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье.&lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить значение подынтегрального выражения и помножить его на весовой коэффициент, затем данные числа складываются, и полученная сумма и представляет собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования, представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное и максимальное значения координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности. По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;. Функция для заданного отрезка приближается константной функцией, тем самым интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx f((a+b)/2)*(b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;. &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым интеграл приближается усредненным значением по краям отрезка.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx (f(a)+f(b))*(b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;. &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx \frac{b-a}6\left(f(a)+4f\left(\frac{a+b}2\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;. &amp;lt;math&amp;gt;f()x&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек выбираются не концы отрезка, что позволяет увеличить точность.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)dx\approx \frac{b-a}2\left(f\left(\frac{a+b}2-\frac{b-a}{2\sqrt 3}\right)+f\left(\frac{a+b}2+\frac{b-a}{2\sqrt 3}\right)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерной ситуации распространены методы прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерной ситуации также можно использовать метод Гаусса, однако для больших размерностей не остается ничего, способного конкурировать с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе. на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;x_{1,i},\ldots,x_{n,i}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; меняется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, в которых будет вычисляться функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будут умножаться значения функции, после чего управление передается вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3289</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3289"/>
		<updated>2016-02-01T09:01:11Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится не на равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье.&lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить значение подынтегрального выражения и помножить его на весовой коэффициент, затем данные числа складываются, и полученная сумма и представляет собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования, представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное и максимальное значения координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности. По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3288</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3288"/>
		<updated>2016-02-01T08:36:43Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится не на равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье.&lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить значение подынтегрального выражения и помножить его на весовой коэффициент, затем данные числа складываются, и полученная сумма и представляет собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3287</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3287"/>
		<updated>2016-02-01T08:35:29Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Введите сюда формулу&amp;lt;/math&amp;gt;=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится не на равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье.&lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить значение подынтегрального выражения и помножить его на весовой коэффициент, затем данные числа складываются, и полученная сумма и представляет собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3275</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3275"/>
		<updated>2016-01-29T13:35:25Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3274</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3274"/>
		<updated>2016-01-29T13:11:23Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3273</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3273"/>
		<updated>2016-01-29T13:09:57Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла по отрезку. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом (лат. quadratura — придание квадратурной формы). 1) Число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет нкаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3272</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3272"/>
		<updated>2016-01-29T12:51:16Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование — приближенное вычисление значения определенного интеграла по отрезку. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерое — кубатурой. Большая советская энциклопедия определяет слово &amp;quot;квадратура&amp;quot; следующим способом (лат. quadratura - придание квадратурной формы). 1)Число квадратных единиц в площади данной фигуры. 2)Построение квадрата, равновеликого данной фигуре. 3)вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). .&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3271</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3271"/>
		<updated>2016-01-29T11:23:19Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование - приближенное вычисление значения определенного интеграла по отрезку. Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача - вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерое - кубатурой. Большая советская энциклопедия определяет слово &amp;quot;квадратура&amp;quot; следующим способом (лат. quadratura - придание квадратурной формы). 1)Число квадратных единиц в площади данной фигуры. 2)Построение квадрата, равновеликого данной фигуре. 3)вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). .&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3270</id>
		<title>Квадратурные формулы</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B&amp;diff=3270"/>
		<updated>2016-01-29T10:41:43Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: Новая страница: «== Свойства и структура алгоритма ==  === Общее описание алгоритма ===  Задача одномерного чи…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=3269</id>
		<title>Классификация алгоритмов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2&amp;diff=3269"/>
		<updated>2016-01-29T10:39:26Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# &amp;lt;div id=&amp;quot;Векторные операции&amp;quot;&amp;gt;&#039;&#039;&#039;Векторные операции&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## &#039;&#039;Суммирование сдваиванием&#039;&#039;&lt;br /&gt;
### {{level|Нахождение суммы элементов массива сдваиванием}}&lt;br /&gt;
### {{level|Нахождение частных сумм элементов массива сдваиванием}}&lt;br /&gt;
## {{level|Равномерная норма вектора, вещественная версия, последовательно-параллельный вариант}}&lt;br /&gt;
## {{level|Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант}}&lt;br /&gt;
## {{level|Последовательно-параллельный метод суммирования}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Матрично-векторные операции&amp;quot;&amp;gt;&#039;&#039;&#039;Матрично-векторные операции&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Умножение плотной матрицы на вектор}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Матричные операции&amp;quot;&amp;gt;&#039;&#039;&#039;Матричные операции&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Умножение плотных матриц}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Разложения матриц&amp;quot;&amp;gt;&#039;&#039;&#039;Разложения матриц&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## &#039;&#039;Треугольные разложения&#039;&#039;&lt;br /&gt;
### Метод Гаусса (нахождение LU-разложения)&lt;br /&gt;
#### {{level|Метод Гаусса без перестановок}}&lt;br /&gt;
##### LU-разложение методом Гаусса&lt;br /&gt;
##### Компактная схема метода Гаусса и её модификации&lt;br /&gt;
###### Компактная схема метода Гаусса для плотной матрицы&lt;br /&gt;
###### {{level|Компактная схема метода Гаусса для трёхдиагональной матрицы и её модификации}}&lt;br /&gt;
####### {{level|Компактная схема метода Гаусса для трёхдиагональной матрицы, последовательный вариант}}&lt;br /&gt;
####### {{level|Алгоритм сдваивания Стоуна для LU-разложения трёхдиагональной матрицы}}&lt;br /&gt;
####### {{level|Последовательно-параллельный алгоритм для LU-разложения трёхдиагональной матрицы}}&lt;br /&gt;
#### Метод Гаусса с перестановками&lt;br /&gt;
##### Метод Гаусса с выбором ведущего элемента по столбцу&lt;br /&gt;
##### Метод Гаусса с выбором ведущего элемента по строке&lt;br /&gt;
##### Метод Гаусса с выбором ведущего элемента по главной диагонали&lt;br /&gt;
##### Метод Гаусса с выбором ведущего элемента по всей матрице&lt;br /&gt;
### {{level|Метод Холецкого (нахождение симметричного треугольного разложения)}}&lt;br /&gt;
#### {{level|Разложение Холецкого (метод квадратного корня)}} базовый точечный вещественный вариант для плотной симметричной положительно-определённой матрицы&lt;br /&gt;
### {{level|Известные треугольные разложения для матриц специального вида}}&lt;br /&gt;
## &#039;&#039;Унитарно-треугольные разложения&#039;&#039;&lt;br /&gt;
### {{level|Метод Гивенса (вращений) QR-разложения матрицы}}&lt;br /&gt;
### {{level|Метод Хаусхолдера (отражений) QR-разложения матрицы}}&lt;br /&gt;
## &#039;&#039;Разложения на унитарные и хессенберговы матрицы&#039;&#039;&lt;br /&gt;
### {{level|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме}}&lt;br /&gt;
### {{level|Метод Гивенса (вращений) приведения матрицы к хессенберговой (двухдиагональной) форме}}&lt;br /&gt;
## &#039;&#039;Разложения на унитарные и диагональные матрицы&#039;&#039;&lt;br /&gt;
### {{level|Спектральное разложение (нахождение собственных значений и векторов)}}&lt;br /&gt;
### {{level|Сингулярное разложение (нахождение сингулярных значений и векторов)}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Решение систем линейных уравнений&amp;quot;&amp;gt;&#039;&#039;&#039;Решение систем линейных уравнений&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## Прямые методы решения СЛАУ&lt;br /&gt;
### {{level|Linpack benchmark}}&lt;br /&gt;
### Методы решения СЛАУ с матрицами специального вида&lt;br /&gt;
#### Методы решения СЛАУ с треугольными матрицами&lt;br /&gt;
##### {{level|Прямая подстановка (вещественный вариант)|Прямая подстановка}}&lt;br /&gt;
##### {{level|Обратная подстановка (вещественный вариант)|Обратная подстановка}}&lt;br /&gt;
##### Методы решения СЛАУ с двухдиагональными матрицами&lt;br /&gt;
###### {{level|Прямая и обратная подстановка в СЛАУ с двухдиагональной матрицей}}&lt;br /&gt;
###### {{level|Метод сдваивания Стоуна для решения двухдиагональных СЛАУ}}&lt;br /&gt;
###### {{level|Последовательно-параллельный вариант обратной подстановки}}&lt;br /&gt;
#### {{level|Методы решения СЛАУ с трёхдиагональными матрицами}}&lt;br /&gt;
##### Методы, основанные на стандартном LU-разложении матрицы&lt;br /&gt;
###### {{level|Прогонка}}&lt;br /&gt;
####### {{level|Прогонка, точечный вариант|Классическая монотонная прогонка}}&lt;br /&gt;
####### {{level|Повторная прогонка, точечный вариант|Повторная прогонка для новой правой части, классическая схема}}&lt;br /&gt;
###### {{level|Метод сдваивания Стоуна}}&lt;br /&gt;
###### {{level|Последовательно-параллельный вариант решения трёхдиагональной СЛАУ с LU-разложением и обратными подстановками}}&lt;br /&gt;
##### Другие методы&lt;br /&gt;
###### {{level|Метод редукции}}&lt;br /&gt;
####### {{level|Полный метод редукции}}&lt;br /&gt;
####### {{level|Повторный метод редукции для новой правой части}}&lt;br /&gt;
###### Встречная прогонка&lt;br /&gt;
####### {{level|Встречная прогонка, точечный вариант|Классическая встречная прогонка}}&lt;br /&gt;
####### {{level|Повторная встречная прогонка, точечный вариант|Повторная прогонка для новой правой части, встречная схема}}&lt;br /&gt;
###### {{level|Метод циклической редукции}}&lt;br /&gt;
####### {{level|Полный метод циклической редукции}}&lt;br /&gt;
####### {{level|Повторный метод циклической редукции для новой правой части}}&lt;br /&gt;
###### {{level|Метод окаймления}}&lt;br /&gt;
#### Методы решения СЛАУ с блочно-треугольными матрицами&lt;br /&gt;
##### {{level|Блочная прямая подстановка (вещественный вариант)|Блочная прямая подстановка}}&lt;br /&gt;
##### {{level|Блочная обратная подстановка (вещественный вариант)|Блочная обратная подстановка}}&lt;br /&gt;
##### Методы решения СЛАУ с блочно-двухдиагональными матрицами&lt;br /&gt;
###### {{level|Прямая и обратная подстановка в СЛАУ с блочно-двухдиагональной матрицей}}&lt;br /&gt;
###### {{level|Метод сдваивания Стоуна для решения блочно-двухдиагональных СЛАУ}}&lt;br /&gt;
###### {{level|Блочный последовательно-параллельный вариант обратной подстановки для решения блочно-двухдиагональных СЛАУ}}&lt;br /&gt;
#### {{level|Методы решения СЛАУ с блочно-трёхдиагональными матрицами}}&lt;br /&gt;
##### Методы, основанные на стандартном LU-разложении матрицы&lt;br /&gt;
###### {{level|Блочная прогонка}}&lt;br /&gt;
###### {{level|Блочный последовательно-параллельный вариант решения с LU-разложением и обратными подстановками}}&lt;br /&gt;
##### Другие методы&lt;br /&gt;
###### {{level|Встречная прогонка, блочный вариант}}&lt;br /&gt;
###### {{level|Блочный метод циклической редукции}}&lt;br /&gt;
###### {{level|Блочный метод окаймления}}&lt;br /&gt;
### {{level|Решения СЛАУ с матрицами специального вида, имеющими известные обратные матрицы}}&lt;br /&gt;
## Итерационные методы решения СЛАУ&lt;br /&gt;
### {{level|High Performance Conjugate Gradient (HPCG) benchmark}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Решения спектральных задач&amp;quot;&amp;gt;&#039;&#039;&#039;Решения спектральных задач&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Спектральное разложение (нахождение собственных значений и векторов)}}&lt;br /&gt;
### {{level|QR-алгоритм}}&lt;br /&gt;
### {{level|Метод Гивенса (вращений) для решения спектральной задачи у симметричных матриц}}&lt;br /&gt;
## {{level|Сингулярное разложение (нахождение сингулярных значений и векторов)}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Тесты производительности компьютеров&amp;quot;&amp;gt;&#039;&#039;&#039;Тесты производительности компьютеров&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|High Performance Conjugate Gradient (HPCG) benchmark}}&lt;br /&gt;
## {{level|Linpack benchmark}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Преобразование Фурье&amp;quot;&amp;gt;&#039;&#039;&#039;Преобразование Фурье&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Быстрое преобразование Фурье для степеней двойки}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгебра многочленов&amp;quot;&amp;gt;&#039;&#039;&#039;Алгебра многочленов&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Схема Горнера, вещественная версия, последовательный вариант|Схема Горнера}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Численные методы интегрирования&amp;quot;&amp;gt;&#039;&#039;&#039;Численные методы интегрирования&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Квадратурные формулы}}&lt;br /&gt;
## {{level|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)}}&lt;br /&gt;
### {{level|Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод прямоугольников}}&lt;br /&gt;
### {{level|Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод трапеций}}&lt;br /&gt;
### {{level|Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод парабол (метод Симпсона)}}&lt;br /&gt;
### {{level|Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод Гаусса}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы на графах&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы на графах&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## Обход графа&lt;br /&gt;
### {{level|Поиск в ширину (BFS)}}&lt;br /&gt;
### {{level|Поиск в глубину (DFS)}}&lt;br /&gt;
## {{level|Поиск кратчайшего пути от одной вершины (SSSP)}}&lt;br /&gt;
### {{level|Поиск в ширину (BFS)}} (для невзвешенных графов)&lt;br /&gt;
### {{level|Алгоритм Дейкстры}}&lt;br /&gt;
### {{level|Алгоритм Беллмана-Форда}}&lt;br /&gt;
### {{level|Алгоритм Δ-шагания}}&lt;br /&gt;
## {{level|Поиск кратчайшего пути для всех пар вершин (APSP)}}&lt;br /&gt;
### {{level|Алгоритм Джонсона}}&lt;br /&gt;
### {{level|Алгоритм Флойда-Уоршелла}}&lt;br /&gt;
## {{level|Поиск транзитивного замыкания орграфа}}&lt;br /&gt;
### {{level|Алгоритм Пурдома}}&lt;br /&gt;
## {{level|Определение диаметра графа}}&lt;br /&gt;
## {{level|Построение минимального остовного дерева (MST)}}&lt;br /&gt;
### {{level|Алгоритм Борувки}}&lt;br /&gt;
### {{level|Алгоритм Крускала}}&lt;br /&gt;
### {{level|Алгоритм Прима}}&lt;br /&gt;
### {{level|Алгоритм GHS}}&lt;br /&gt;
## {{level|Поиск изоморфных подграфов}}&lt;br /&gt;
### {{level|Алгоритм Ульмана}}&lt;br /&gt;
### {{level|Алгоритм VF2}}&lt;br /&gt;
## {{level|Связность в графах}}&lt;br /&gt;
### {{level|Алгоритм Шилоаха-Вишкина поиска компонент связности}}&lt;br /&gt;
### {{level|Система непересекающихся множеств}}&lt;br /&gt;
### {{level|Алгоритм Тарьяна поиска компонент сильной связности}}&lt;br /&gt;
### {{level|Алгоритм DCSC поиска компонент сильной связности}}&lt;br /&gt;
### {{level|Алгоритм Тарьяна поиска компонент двусвязности}}&lt;br /&gt;
### {{level|Алгоритм Тарьяна-Вишкина поиска компонент двусвязности}}&lt;br /&gt;
### {{level|Алгоритм Тарьяна поиска «мостов» в графе}}&lt;br /&gt;
### {{level|Определение вершинной связности графа}}&lt;br /&gt;
### {{level|Алгоритм Габова определения рёберной связности графа}}&lt;br /&gt;
## {{level|Поиск максимального потока в транспортной сети}}&lt;br /&gt;
### {{level|Алгоритм Форда-Фалкерсона}}&lt;br /&gt;
### {{level|Алгоритм проталкивания предпотока}}&lt;br /&gt;
## {{level|Поиск потока минимальной стоимости в транспортной сети}}&lt;br /&gt;
## {{level|Задача о назначениях}}&lt;br /&gt;
### {{level|Венгерский алгоритм}}&lt;br /&gt;
### {{level|Алгоритм аукциона}}&lt;br /&gt;
### {{level|Алгоритм Гопкрофта-Карпа}}&lt;br /&gt;
## {{level|Вычисление betweenness centrality|Вычисление центральности вершин}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы поиска&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы поиска&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Двоичный поиск - находит элемент в отсортированном списке}}, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы сортировки&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы сортировки&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Сортировка с помощью двоичного дерева}}&lt;br /&gt;
## {{level|Сортировка пузырьком}}&lt;br /&gt;
## {{level|Сортировка слиянием (последовательный и параллельный варианты)}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Вычислительная геометрия&amp;quot;&amp;gt;&#039;&#039;&#039;Вычислительная геометрия&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Поиск диаметра множества точек}}&lt;br /&gt;
## {{level|Построение выпуклой оболочки набора точек}}&lt;br /&gt;
## {{level|Триангуляция Делоне}}&lt;br /&gt;
## {{level|Диаграмма Вороного}}&lt;br /&gt;
## {{level|Принадлежность точки многоугольнику}}&lt;br /&gt;
## {{level|Пересечения выпуклых многоугольников}} - трудоёмкость &amp;lt;math&amp;gt;O(n_1 + n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
## {{level|Пересечение звёздных многоугольников}} - трудоёмкость &amp;lt;math&amp;gt;O(n_1 * n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Компьютерная графика&amp;quot;&amp;gt;&#039;&#039;&#039;Компьютерная графика&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Алгоритмы построения отрезка - алгоритмы для аппроксимации отрезка на дискретной графической поверхности}}&lt;br /&gt;
## {{level|Алгоритм определения видимых частей трёхмерной сцены}}&lt;br /&gt;
## {{level|Трассировка лучей - рендеринг реалистичных изображений}}&lt;br /&gt;
## {{level|Глобальное освещение - рассматривает прямое освещение и отражение от других объектов}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Криптографические алгоритмы&amp;quot;&amp;gt;&#039;&#039;&#039;Криптографические алгоритмы&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Нейронные сети&amp;quot;&amp;gt;&#039;&#039;&#039;Нейронные сети&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы оптимизации&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы оптимизации&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Линейное программирование}}&lt;br /&gt;
## {{level|Симплекс-метод}}&lt;br /&gt;
## {{level|Метод ветвей и границ (последовательный и параллельный варианты)}}&lt;br /&gt;
## {{level|Генетические алгоритмы}}&lt;br /&gt;
## {{level|Муравьиные алгоритмы}}&lt;br /&gt;
## {{level|Комбинированные алгоритмы}}&lt;br /&gt;
## {{level|Нахождение экстремума функции}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы теории игр&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы теории игр&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы моделирования квантовых систем&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы моделирования квантовых систем&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## &#039;&#039;Алгоритмы моделирования квантовых вычислений&#039;&#039;&lt;br /&gt;
### {{level|Однокубитное преобразование вектора-состояния}}&lt;br /&gt;
### {{level|Двухкубитное преобразование вектора-состояния}}&lt;br /&gt;
### {{level|Моделирование квантового преобразования Фурье}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Алгоритмы решения уравнений математической физики&amp;quot;&amp;gt;&#039;&#039;&#039;Алгоритмы решения уравнений математической физики&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
## {{level|Уравнение Пуассона, решение дискретным преобразованием Фурье}}&lt;br /&gt;
# &amp;lt;div id=&amp;quot;Другие алгоритмы&amp;quot;&amp;gt;&#039;&#039;&#039;Другие алгоритмы&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[en:Algorithm classification]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3071</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3071"/>
		<updated>2015-12-16T15:22:01Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Численное интегрирование функций одной переменной */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3070</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3070"/>
		<updated>2015-12-16T15:09:26Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3069</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3069"/>
		<updated>2015-12-16T15:03:35Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum\limits_{i=1}^n С_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3068</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3068"/>
		<updated>2015-12-16T14:59:18Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
: &amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
:&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
:&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
:&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_{i=1}^n С_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3067</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3067"/>
		<updated>2015-12-16T14:48:00Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_{i=1}^n С_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3066</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3066"/>
		<updated>2015-12-16T14:46:49Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_{i=1}^n c_i f(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3065</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3065"/>
		<updated>2015-12-16T14:44:58Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_{i=1}1^n c_i f(x_i)&amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3064</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3064"/>
		<updated>2015-12-16T14:39:45Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; и два одномерных массива &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; чисел: массив узлов и массив коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, являющееся значением квадратурной суммы и представляющее собой приближенное значение интеграла.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3063</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3063"/>
		<updated>2015-12-16T14:20:17Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Численное интегрирование функций одной переменной ====&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Формулы Ньютона-Котеса ====&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;1\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы задавались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
==== Составные квадратурные формулы ====&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3062</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3062"/>
		<updated>2015-12-15T18:44:38Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Формулы Ньютона-Котеса&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых заданы равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Свое название эти формулы получили в память того, что они в достаточно общей форме были рассмотрены  Исааком Ньютоном, а их коэффициенты при &amp;lt;math&amp;gt;1\le n\le 10&amp;lt;/math&amp;gt; были найдены Роджером Котесом.&lt;br /&gt;
&lt;br /&gt;
Наиболее известными формулами Ньютона-Котеса являются формула средних прямоугольников (&amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx(b-a)f(\frac{a+b}2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и формула трапеций (&amp;lt;math&amp;gt;n=2&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}2\,(f(a)+f(b));&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
алгебраическая степень точности каждой из них равна 1, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_1(f)|\le\frac{M_2}{24}\,(b-a)^3,\quad |R_2(f)|\le\frac{M_2}{12}\,(b-a)^3,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_2=\max\limits_{x\in[a,b]}|f^{\prime\prime}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса при &amp;lt;math&amp;gt;n=3&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=4&amp;lt;/math&amp;gt; являются формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}6\,(f(a)+4f(\frac{a+b}2)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
которую называют также формулой парабол, и формула трех восьмых&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\frac{b-a}{8}\,(f(a)+3f(\frac{2a+b}3)+3f(\frac{a+2b}3)+f(b)),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
название которой происходит от коэффициента 3/8; алгебраическая степень точности каждой из них равна 3, а для их погрешностей справедливы оценки&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_3(f)|\le\frac{M_4}{2880}\,(b-a)^5,\quad |R_4(f)|\le\frac{M_4}{6480}\,(b-a)^5,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_4=\max\limits_{x\in[a,b]}|f^{(4)}(x)|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности формулы Ньютона-Котеса с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлами равна &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; при четном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и равна &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; при нечетном &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты формул Ньютона-Котеса положительны при &amp;lt;math&amp;gt;2\le n\le8&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n=10&amp;lt;/math&amp;gt;, а при &amp;lt;math&amp;gt;n=9&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n\ge11&amp;lt;/math&amp;gt; среди коэффициентов имеются как положительные так и отрицательные.&lt;br /&gt;
&lt;br /&gt;
Положительность коэффициентов квадратурной формулы важна для ее практического применения. Дело в том, что при вычислении интегральной суммы влияние погрешностей округления на точность результата тем сильнее, чем больше &amp;lt;math&amp;gt;\sum\limits_{i=1}^n |C_i|&amp;lt;/math&amp;gt;. Для формул Ньютона-Котеса эта сумма неограниченно возрастает при &amp;lt;math&amp;gt;n\to\infty&amp;lt;/math&amp;gt;. Поэтому при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; формулы Ньютона-Котеса оказываются практически непригодными.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для того чтобы использовать квадратурные формулы с большим числом узлов, нужно отказаться или от того, чтобы квадратурная формула была интерполяционной, или от того, чтобы узлы выбирались равноотстоящими.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Составные квадратурные формулы&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Составными называются квадратурные формулы, построение которых осуществляется следующим образом. Отрезок интегрирования &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; разбивается на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; отрезков равной длины &amp;lt;math&amp;gt;h=\dfrac{b-a}m&amp;lt;/math&amp;gt;. Тогда по свойству аддитивности интеграл может быть вычислен как сумма интегралов по отрезкам разбиения. Для приближенного вычисления каждого из слагаемых этой суммы применяется одна и та же квадратурная формула, называемая исходной.&lt;br /&gt;
&lt;br /&gt;
Алгебраическая степень точности составной квадратурной формулы совпадает с алгебраической степенью точности исходной.&lt;br /&gt;
&lt;br /&gt;
Если в качестве исходной квадратурной формулы выбрать формулу средних прямоугольников, формулу трапеций или формулу Симпсона, то будут получены следующие составные квадратурные формулы:&lt;br /&gt;
&lt;br /&gt;
составная формула средних прямоугольников&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx h\,(\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_m(f)|\le\frac{M_2}{24}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула трапеций&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{2}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{m+1}(f)|\le\frac{M_2}{12}\,(b-a)h^2,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
составная формула Симпсона&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx \frac{h}{6}\,(f(a)+f(b)+2\sum\limits_{i=1}^{m-1}f(a+ih)+4\sum\limits_{i=1}^m f(a+ih-\frac{h}{2}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
с числом узлов &amp;lt;math&amp;gt;2m+1&amp;lt;/math&amp;gt; и оценкой погрешности&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|R_{2m+1}(f)|\le\frac{M_4}{2880}\,(b-a)h^4.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3045</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3045"/>
		<updated>2015-12-15T11:20:42Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).\qquad(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части (1) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;|\,R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;M_n=\max\limits_{x\in[a,b]}|f^{(n)}(x)|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\omega_n(x)=\prod\limits_{i=1}^n (x-x_i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула (1) является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Формулы Ньютона-Котеса&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Формулами Ньютона-Котеса называются интерполяционные квадратурные формулы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлов которых выбраны равноотстоящими: &amp;lt;math&amp;gt;x_1=\frac{b-a}2&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;n=1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x_i=a+(i-1)\frac{b-a}{n-1}, 1\le i \le n&amp;lt;/math&amp;gt;&lt;br /&gt;
при &amp;lt;math&amp;gt;n&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3039</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3039"/>
		<updated>2015-12-15T09:06:28Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).\qquad(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части (1) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула (1) является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка &lt;br /&gt;
$$|\,R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx.$$&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3038</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3038"/>
		<updated>2015-12-15T09:03:51Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).\qquad(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части (1) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
Широко известны квадратурные формулы, полученные посредством замены подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; алгебраическим интерполяционным многочленом, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_i; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула (1) является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для погрешности интерполяционной квадратурной формулы справедлива оценка &lt;br /&gt;
$$|\,R_n(f)|\le\frac{M_n}{n!}\int\limits_a^b|\,\omega_n(x)|\,dx.$$&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3018</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3018"/>
		<updated>2015-12-14T13:18:35Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).\qquad(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части (1) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;. При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Интерполяционные квадратурные формулы&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Широкое распространение получили квадратурные формулы, построение которых основано на замене подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ее алгебраическим интерполяционным многочленом &amp;lt;math&amp;gt;L_{n-1}(x)&amp;lt;/math&amp;gt;, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_1,\ldots,x_n&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
Квадратурная формула (1) является интерполяционной тогда и только тогда, когда для ее алгебраической степени точности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; выполняется неравенство &amp;lt;math&amp;gt;k\ge n-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3017</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3017"/>
		<updated>2015-12-14T12:47:23Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
{{NumBlk|:|&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i).\num (1)&amp;lt;/math&amp;gt;|{{EquationRef|1}}}}&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части ({{EquationNote|1}}) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Интерполяционные квадратурные формулы&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Широкое распространение получили квадратурные формулы, построение которых основано на замене подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ее алгебраическим интерполяционным многочленом &amp;lt;math&amp;gt;L_{n-1}(x)&amp;lt;/math&amp;gt;, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_1,\ldots,x_n&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3007</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=3007"/>
		<updated>2015-12-14T11:48:10Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i). (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части (1) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
Значение квадратурной суммы, принимаемое за приближенное значение интеграла, зависит от выбора узлов &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; и коэффициентов &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;.При вычислении значения квадратурной суммы основные временные затраты приходятся на вычисление значений подынтегральной функции в узлах.&lt;br /&gt;
&lt;br /&gt;
Погрешностью квадратурной формулы называется разность&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R_n(f)=\int\limits_a^b\!f(x)\,dx-\sum\limits_{i=1}^n C_if(x_i).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; такова, что &amp;lt;math&amp;gt;R_n(f)=0&amp;lt;/math&amp;gt;, то говорят,что квадратурная формула точна для функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Целое число &amp;lt;math&amp;gt;k\ge0&amp;lt;/math&amp;gt; называется алгебраической степенью точности квадратурной формулы, если квадратурная формула точна для любого многочлена степени не выше &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и не точна для многочлена степени &amp;lt;math&amp;gt;k+1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если квадратурная формула выбрана, то алгоритм приближенного вычисления интеграла состоит в вычислении квадратурной суммы, т.е. в вычислении значений функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах, умножении их на соответствующие коэффициенты и суммировании полученных чисел.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Интерполяционные квадратурные формулы&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Широкое распространение получили квадратурные формулы, построение которых основано на замене подынтегральной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; ее алгебраическим интерполяционным многочленом &amp;lt;math&amp;gt;L_{n-1}(x)&amp;lt;/math&amp;gt;, значения которого совпадают со значениями функции в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; узлах &amp;lt;math&amp;gt;x_1,\ldots,x_n&amp;lt;/math&amp;gt;; такие квадратурные формулы называются интерполяционными.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=2999</id>
		<title>Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_(%D0%BA%D1%83%D0%B1%D0%B0%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5)_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D0%BE_%D0%BE%D1%82%D1%80%D0%B5%D0%B7%D0%BA%D1%83_(%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%BC%D1%83_%D0%BA%D1%83%D0%B1%D1%83)&amp;diff=2999"/>
		<updated>2015-12-14T10:25:33Z</updated>

		<summary type="html">&lt;p&gt;Kukarkin: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Sander|А.В.Смирнов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Численное интегрирование функций одной переменной&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Задача одномерного численного интегрирования состоит в приближенном вычислении определенного интеграла по отрезку: требуется вычислить&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I=\int\limits_a^b f(x)dx,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; - интегрируемая функция, определенная на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Численное интегрирование оcуществляется с помощью квадратурных формул - приближенных равенств вида&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I\approx\sum\limits_{i=1}^n C_i f(x_i). (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сумма в правой части (1) называется квадратурной суммой, различные точки &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; отрезка &lt;br /&gt;
&amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt; называются узлами, а числа &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt; - коэффициентами квадратурной формулы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продположим, что нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке или многомерном кубе, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&lt;br /&gt;
&lt;br /&gt;
Исторически численное интегрирование также называлось численной квадратурой, а многомерное — кубатурой. Большая советская энциклопедия определяет слово «квадратура» следующим способом: (лат. quadratura — придание квадратной формы), 1) число квадратных единиц в площади данной фигуры. 2) Построение квадрата, равновеликого данной фигуре. 3) Вычисление площади или интеграла.&lt;br /&gt;
&lt;br /&gt;
В данной статье рассматривается семейство методов численного интегрирования, объединенных общим принципом: область интегрирования разбивается по каждой из осей на равное количество частей. В каждой из полученных маленьких областей интеграл приближается простой функцией (например, линейной), значение которой вычисляется явно (путем вычисления подынтегрального выражения в одной или нескольких точках). Ввиду линейности оператора интегрирования по областям полученные значения суммируются и представляют собой результат интегрирования.&lt;br /&gt;
&lt;br /&gt;
К данному типу относятся одномерные методы: метод прямоугольников, метод трапеций, метод парабол (метод Симпсона), метод Гаусса, метод Гаусса-Кронрода. Часть перечисленных методов обобщается и для многомерного случая. Обобщенно все эти методы называются квадратурными. В многомерном случае они также могут называться кубатурными (это слово не несет никаких дополнительных смыслов). Также говорится, что перечисленные методы используют квадратурные (кубатурные) формулы. &lt;br /&gt;
&lt;br /&gt;
Подходы, в которых область делится на не равные друг другу отрезки (кубы), называются адаптивными и не рассматриваются к данной статье. &lt;br /&gt;
&lt;br /&gt;
Все перечисленные выше методы, а также подобные им могут быть объединены следующим образом: область интегрирования содержит &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в каждой из которых необходимо вычислить подынтегральное выражение и помножить его на весовой коэффициент, затем данные числа складываются, и в итоге, полученная сумма представляет собой результат интегрирования. Погрешность интегрирования оценивается точно таким же образом.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходные данные: функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; переменных, границы области интегрирования,  представляющей собой многомерный куб (по каждой из осей интегрирования заданы минимальное  и максимальное значение координаты), максимальное число &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; точек, в которых можно вычислить функцию &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: число, представляющее собой приближенное значение интеграла и, если это позволяет выбранный метод, число, представляющее собой оценку погрешности.&lt;br /&gt;
По количеству точек &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и методу интегрирования определяются размеры прямоугольных параллелепипедов, на которые разбивается область интегрирования. В каждом из параллелепипедов в зависимости от выбора метода определяются свои точки для вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
Наибольшее разнообразие выбора методов достигается в одномерном случае.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод прямоугольников&#039;&#039;: функция для заданного отрезка приближается константной функцией, тем самым, интеграл приближается значением функции в одной точке. Обычно в качестве этой точки используется граница отрезка или, лучше, его середина:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx f((a+b)/2) (b-a)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод трапеций&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается линейной функцией, тем самым, интеграл приближается усредненным значением по краям отрезка:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx (f(a) + f(b)) (b-a)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод парабол (метод Симпсона)&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается параболой, пересекающей график функции на краях отрезка и в его середине:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx \approx \frac{b-a}{6}\left(f(a)+4f\left(\frac{a+b}{2}\right)+f(b)\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Метод Гаусса&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt; &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; приближается прямой как в методе трапеций, однако в качестве точек можно выбирать не только концы отрезка, что позволяет увеличить точность:&lt;br /&gt;
: &amp;lt;math&amp;gt;\int\limits_a^b f(x)\,dx  \approx \frac{b-a}{2}\left(f\left(\frac{a+b}{2} - \frac{b-a}{2\sqrt{3}} \right)+f\left(\frac{a+b}{2} + \frac{b-a}{2\sqrt{3}} \right) \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В двумерном случае можно применять метод прямоугольников (вычисление в центре квадрата), метод трапеций (в углах квадрата), а также двумерный метод Гаусса. В трехмерном случае также можно использовать метод Гаусса, однако для больших размерностей не остается методов, способных конкурировать по эффективности с методом прямоугольников.&lt;br /&gt;
&lt;br /&gt;
Так или иначе, на подготовительной стадии определяется &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; наборов координат &amp;lt;math&amp;gt;{x_{1,i}, \ldots, x_{n,i}}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,\ldots,M&amp;lt;/math&amp;gt;, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и набор весовых коэффициентов &amp;lt;math&amp;gt;c_i&amp;lt;/math&amp;gt;, на которые будет умножено значение этой функции, после чего управление будет передано вычислительному ядру алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии любого из квадратурных методов численного интегрирования представляет собой вычисление суммы&lt;br /&gt;
: &amp;lt;math&amp;gt;\sum \limits_1^M c_i f(x_{1,i}, \ldots, x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
В реальных примерах эффективность алгоритма определяется именно эффективностью вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, т.к. затраты времени на её вычисление гораздо больше времени на соответствующие операции суммирования и умножения.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Начальная стадия работы алгоритма заключается в том, что по выбранному методу, координатам, ограничивающим область интегрирования, и максимальному число точек, в которых должно производиться вычисление функции, определяется набор точек для этих вычислений. Время, требуемое на эту операцию, оценивается константой.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Формулы для реализации алгоритмы были приведены выше. В цикле обходятся все необходимые точки, и в них происходит вычисление значения функции. Результаты вычисления умножаются на весовые коэффициенты и складываются.&lt;br /&gt;
При последовательной реализации алгоритма для экономии памяти можно не генерировать сразу весь массив точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Общее время, затрачиваемое на вычисление функции растет примерно как &amp;lt;math&amp;gt;tM&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; — время, необходимое на однократное вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; — количество точек, в которых вычисляется функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Таким образом, алгоритм является линейным относительно количества точек интегрирования.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма интегрирования можно описать аналитически, а также представить его в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трех групп вершин. Вершины на верхнем ярусе берут в качестве входных данных координаты и вычисляют по ним значение функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Вершины на втором ярусе умножают полученное значение на соответствующий весовой коэффициент. Вершины на третьем ярусе поочередно складывают полученные значения; результат сложения относится к выходным данным.&lt;br /&gt;
&lt;br /&gt;
[[Image:Cubature.png|center|thumb|800px|Рисунок 1. Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления методом кубатур интеграла функции необходимо последовательно выполнить следующие ярусы алгоритма: &lt;br /&gt;
&lt;br /&gt;
* Вычисление исходной функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, производящееся независимо для различных точек и выполняющееся за близкое к константному время &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, эта операция является основной вычислительной часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
* Умножение полученных результатов на соответствующие весовые коэффициенты.&lt;br /&gt;
&lt;br /&gt;
* Сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, а все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на различных вычислительных узлах, тем самым, задача вычисления интеграла методом кубатур идеально подходит для параллельной реализации. Однако при значительном увеличении количества узлов (в случае, когда оно становится сравнимым с количеством точек, в которых вычисляется функция), ресурс параллелизма может быть ограничен накладными расходами, такими как передача исходного выражения на каждый из вычислительных узлов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, до тех пор, пока количество вычислительных узлов не превышает количества точек, в которых должно быть произведено интегрирование, алгоритм выполняется за около константное время. Однако, в реальных вычислениях обычно требуется значительно большее количество точек интегрирования (измеряемое миллионами), чем количество вычислительных узлов, которые можно задействовать, и в таком случае сложность алгоритма является линейной. В этом случае алгоритм распараллеливается идеально.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Входными данными для алгоритма являются размерность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, границы интегрирования (два массива длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;), ограничение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на количество точек интегрирования, выбор метода интегрирования и функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; — подынтегральное выражение. Она обычно задается в виде функции, написанной на используемом языке программирования или же в строковом виде, если реализация алгоритма имеет встроенный аналог компилятора, работающий с используемым классом функций.&lt;br /&gt;
&lt;br /&gt;
К входным данными для вычислительного ядра алгоритма относится функция &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и массив длины &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;, содержащий точки, в которых должно быть произведено вычисление.&lt;br /&gt;
&lt;br /&gt;
Выходными данными является число - результат интегрирования и, возможно, второе число, представляющее собой оценку погрешности.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение линейной сложности к константной). В данной оценке предполагается, что накладные расходы пренебрежимо малы по отношению к вычислению подынтегрального выражения. &lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является почти полностью детерминированным — выбор точек интегрирования полностью определяется выбором метода и ограничением на их количество. Использование иного порядка суммирования конечных результатов может приводить к накоплению ошибок округления, однако обычно его влияние незначительно по сравнению с оценкой ошибки, представляемой алгоритмом. Дуги информационного графа являются полностью локальными.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В простейшем варианте вычислительное ядро метода на Фортране можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;fortran&amp;quot;&amp;gt;&lt;br /&gt;
		double::res&lt;br /&gt;
		DO  I = 1, M&lt;br /&gt;
			double::a = f(x(I))&lt;br /&gt;
			res = res + a&lt;br /&gt;
		END DO&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
Локальность операций существенно определяется реализацией вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;. Если рассматривать ее вычисление как «черный ящик», то забота об эффективном использовании подсистемы памяти полностью перекладывается на его готовую реализацию.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Самым естественным способом реализации параллельного алгоритма является независимое вычислении функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; в заданных точках различными вычислительными узлами. Это может быть реализовано как при помощи технологии threads или OpenMP при запуске на одном узле, так и, например, при использовании межпроцессорных обменов при помощи MPI. Головной узел передает остальным вычислительным узлам &amp;quot;определение&amp;quot; функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, и затем раздает подчиненным узлам точки, в которых должна вычисляться функция. Для оптимизации процесса коммуникации возможно организовать передачу сразу наборов точек.&lt;br /&gt;
&lt;br /&gt;
Представляется также возможным одновременное вычисление нескольких значений функции одним узлом, однако такой подход требует адаптации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и не всегда является применимым. Например, использование команд типа AVX для микропроцессоров позволяет выполнять по 4 сложения или умножения за один такт работы процессора, однако так могут складываться лишь последовательно расположенные вещественные числа. Однако использование подобных ускорителей или, скажем, перевод алгоритма на использование графических процессоров, безусловно требует модификации самого алгоритма вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; и уточнения класса функций, для которых будет применяться данная реализация.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть превосходно  масштабируем. Для демонстрации этого утверждения на конкретном примере, в НИВЦ МГУ была создана реализация алгоритма интегрирования методом прямоугольников. В качестве тестового примера рассматривалось трехмерное интегрирование. Поскольку в задачи не входила оценка сложности вычисления той или иной функции от трех переменных, было выбрано простейшее подынтегральное выражение &amp;lt;math&amp;gt;x_1^2+x_2^2+x_3^3&amp;lt;/math&amp;gt;. Однако такая функция является слишком простой и нетипичной для тех примеров, на которых обычно применяется алгоритм. Поэтому для демонстрации масштабируемости алгоритма на достаточно сложных примерах при вычислении функции в одной точке была заложена пауза длительностью в 0.01 секунды (для типичных примеров длительность может существенно превышать это время, однако и оно оказалось достаточным для проведения демонстрации масштабируемости).&lt;br /&gt;
&lt;br /&gt;
В качестве метода распараллеливания данный алгоритм использует технологию MPI. Тесты проводились на суперкомпьютере [http://parallel.ru/cluster/superinfo Ломоносов]. Для демонстрации оказалось достаточным провести тесты с количеством процессоров до 64 (с шагом 8). Для количества точек, в которых вычислялась функция, была введена логарифмическая шкала (от 100 до миллиона с шагом умножения на 10). Причина введения такой шкалы состоит в том, что в настоящих примерах требуется вычислять функцию не меньше, чем в ста тысячах точек и эта величина может доходить до одного миллиарда, а провал эффективности наблюдается лишь при существенно меньших количествах точек интегрирования. При таком подходе не представлялось возможным измерять производительность в гигафлопсах; в качестве показателя производительности использовалось количество точек, в которых была вычислена функция.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 27.20%;&lt;br /&gt;
*	максимальная эффективность реализации 98.01%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации численного интегрирования в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность вычислений для задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае получаемое ускорение практически линейно, а эффективность реализации стремится к единице. Поскольку в реальных примерах сложно представить, чтобы в этом алгоритме количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, является идеально масштабируемым.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от &amp;lt;math&amp;gt;10^{-5}&amp;lt;/math&amp;gt; секунды до &amp;lt;math&amp;gt;101 \cdot 10^{-5}&amp;lt;/math&amp;gt; с шагом &amp;lt;math&amp;gt;10^{-4}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg|thumb|center|600px|Рисунок 4. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 \cdot 10^{-4}&amp;lt;/math&amp;gt; эффективность резко возрастает и становится близкой к единице.&lt;br /&gt;
&lt;br /&gt;
Суммируя результаты экспериментов можно сделать вывод, что у алгоритма есть некоторая граница, зависящая от времени вычисления функции, ниже которой параллельная реализация имеет крайне низкую эффективность (точное значение данной границы может зависеть от архитектуры кластера, но не должно превышать сотую долю секунды). Однако, после перехода этой границы эффективность быстро возрастает и приближается к единице, при этом от числа процессоров она также зависит несущественно. Число процессоров для эффективной работы, в свою очередь, должно быть меньше хотя бы на порядок, чем число точек, в которых происходит вычисление функции.&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например, если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и других операций над массивами чисел. &lt;br /&gt;
В этом случае возможна реализация, в которой данные операции выполняются на графическом ускорителе GPGPU, что может приводить к существенному ускорению работы алгоритма по сравнению с вычислениями на центральном процессоре.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу [http://git.algowiki-project.org/Sander/numerical_integration/tree/master]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Kukarkin</name></author>
	</entry>
</feed>