<?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=Sander</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=Sander"/>
	<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/Sander"/>
	<updated>2026-10-22T18:02:56Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lvs&amp;diff=16339</id>
		<title>Обсуждение участника:Lvs</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lvs&amp;diff=16339"/>
		<updated>2016-11-10T20:10:44Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пункт 1.7 =&lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
- Поплыло форматирование: между рисунками из п.1.7 включается содержимое п.1.8 и далее&lt;br /&gt;
- Необходимо привести описание, что чему соответствует на рисунках, а лучше перерисовать. Пока это нельзя рассматривать как информационный граф.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
См. именование пункта в шаблоне.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.2 =&lt;br /&gt;
Это определение пространства Крылова?&lt;br /&gt;
Не совсем понятно описание алгоритма, если не знаешь, о чем речь&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.3 =&lt;br /&gt;
Он достаточно длинный. Посмотрите описания готовых алгоритмов на алговики. Псевдокод здесь не читается, ядро должно лучше восприниматься&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.4 =&lt;br /&gt;
Если макроструктура это указанные 3 пункта, то нужно пояснить, почему именно пункт 1 является ядром. Он самый ресурсоемкий?&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 =&lt;br /&gt;
Почему это основной ресурс. Это основная операция в алгоритме? Требуются пояснения&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lexaloris&amp;diff=16338</id>
		<title>Обсуждение участника:Lexaloris</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lexaloris&amp;diff=16338"/>
		<updated>2016-11-10T20:00:07Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Вклад = &lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039; Необходимо явно указать вклад каждого соавтора.&lt;br /&gt;
&lt;br /&gt;
= Пункт 1 =&lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039; Все пункты должны именоваться строго по шаблону. например, первый уровень - просто: &amp;quot;Свойства и структура алгоритмов&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 =&lt;br /&gt;
Если рисунок заимствован, надо дать ссылку на источник&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;требуется уточнить:&#039;&#039;&#039; рисунок собственный или откуда-то взят? &lt;br /&gt;
&lt;br /&gt;
= Пункт 2 =&lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039; Аналогично, именование пункта д.б. по шаблону.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основной вопрос. Ядро это все-таки умножение матрицы или строки матрицы? Соответственно под это нужно подстраивать и остальной текст, потому что можно понять и так, и так.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Trrufina&amp;diff=16337</id>
		<title>Обсуждение участницы:Trrufina</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Trrufina&amp;diff=16337"/>
		<updated>2016-11-10T19:56:10Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пункт 1.7 =&lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039; &lt;br /&gt;
Необходимо пояснить строение графа, он далек от классического инф. графа.&lt;br /&gt;
Что такое зеленый прямоугольник с &amp;quot;Х&amp;quot;?&lt;br /&gt;
Что вообще представляют собой элементы на схеме и стрелки?&lt;br /&gt;
Думается, лучше перерисовать, т.к. на этапе проверки математики алгоритма такой рисунок точно не пройдет...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Хорошая работа. Один маленький вопрос&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.2 =&lt;br /&gt;
Наиболее удобный CSR. Почему?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И, конечно, хорошо бы действительно пересчитать на однородном кластере, сделать соответствующие диаграммы, приложить код (на algowiki есть git-репозиторий).&lt;br /&gt;
Обратитесь к организаторам, может быть, все это возможно устроить?&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=16003</id>
		<title>Обсуждение участника:Alexander34396</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=16003"/>
		<updated>2016-11-06T19:44:29Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Janyell&amp;diff=16001</id>
		<title>Обсуждение участника:Janyell</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Janyell&amp;diff=16001"/>
		<updated>2016-11-06T19:33:27Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Вклад = &lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039; Необходимо явно указать вклад каждого соавтора.&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 =&lt;br /&gt;
&#039;&#039;&#039;принято&#039;&#039;&#039; Если рисунок заимствован, надо дать ссылку на источник.&lt;br /&gt;
Рисунок не заимствован.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Добрый день. Подключаюсь к проверке. Статья мне в целом понравилась, и тем больше от этого хочется добавить замечаний, чтобы довести ее до того вида, чтобы она могла остаться на Алговики.&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.1 = &lt;br /&gt;
Разреженная матрица, будучи множеством чисел, не имеющим регулярности, &#039;&#039;&#039;не может быть представлена в памяти машины тем же простым способом, что и полная матрица&#039;&#039;&#039;. Поэтому возникает необходимость дополнительно хранить индексную информацию, указывающую расположение каждого элемента в регулярном массиве.&lt;br /&gt;
&lt;br /&gt;
Что означает фраза, выделенная жирным? Или как-то переформулируйте утверждение, оно не понятно&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Однако многие схемы хранения допускают определенную долю нулей, и алгоритм обрабатывает их, как если бы они не были нулями.&#039;&#039;&#039;&lt;br /&gt;
Тоже непонятно&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.1.1.1 = &lt;br /&gt;
Поставьте определение ленточной матрицы в начало. Потому что, начиная читать первую фразу, сначала задаешься вопросом, что это такое&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.1.1.2 = &lt;br /&gt;
&#039;&#039;&#039;Кроме того, схема является статической, потому что включение нового элемента, лежащего вне оболочки, требует изменения всей структуры (если только не используются записи переменной длины).&#039;&#039;&#039;&lt;br /&gt;
Также нужны пояснения&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.1.2 = &lt;br /&gt;
&#039;&#039;&#039;Достоинство этих процедур, с вычислительной точки зрения, состоит в том, что единственная требуемая матрич­ная операция — это повторное умножение матрицы на последо­вательность заполненных векторов; сама матрица не меняется.&#039;&#039;&#039;&lt;br /&gt;
Опять непонятно&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.3 = &lt;br /&gt;
Почему вычислительное ядро только последовательной версии?&lt;br /&gt;
Вычислительное ядро (computational kernel) алгоритма - это часть алгоритма, на которую приходится основное время его работы.&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.4 = &lt;br /&gt;
Наверное, вопрос в том, что алгоритм делает помимо запуска вычислительных ядер?&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.5 = &lt;br /&gt;
Как была выбрана форма хранения матрицы? Это нужно прокомментировать&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 = &lt;br /&gt;
Правильно я понимаю, что на рисунке изображено вычисление всего произведения матрицы на вектор? Аналогичные блоки для разных строк. А разве не должен быть рисунок, изображающий ядро (то есть произведение одной строки на вектор)? &lt;br /&gt;
(я не уверен, поэтому спрашиваю. Возможно, это как-то надо лучше подписать)&lt;br /&gt;
&lt;br /&gt;
= Пункт 2.4 = &lt;br /&gt;
Пока пустой?&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sander&amp;diff=15999</id>
		<title>Участник:Sander</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sander&amp;diff=15999"/>
		<updated>2016-11-06T19:23:56Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://istina.msu.ru/profile/Sander/ Смирнов Александр Владимирович], д.ф.-м.н, заведующий лаборатории Математического моделирования Научно-исследовательского вычислительного центра Московского государственного университета имени М.В.Ломоносова&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3180</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3180"/>
		<updated>2015-12-22T13:13:31Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Однокубитное преобразование &amp;lt;br /&amp;gt; вектора-состояния&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;3 \cdot 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]])&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;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/store/storage/jpvtv20_algebraic_tools.pdf|Кронберг Д. А., Ожигов Ю. И., Чернявский А. Ю. Алгебраический аппарат квантовой информатики.]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/files/book_v01.pdf|Корж О. В., Чернявский А. Ю. Практикум по суперкомпьютерным технологиям и квантовым вычислениям 3 курс.]] &amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Preskill J. Lecture notes for physics 229: Quantum information and computation //California Institute of Technology. – 1998.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Нильсен М., Чанг И. Квантовые вычисления и квантовая информация. – М : Мир, 2006.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Данный алгоритм обычно является подпрограммой и многократно применяется к различным кубитам одного состояния (например при моделировании квантовых алгоритмов или анализе квантовой запутанности). Особенностью алгоритма, как и большинства алгоритмов квантовой инфоорматики, является экспоненциальный рост объема данных в зависимости от основного параметра - числа кубитов, что приводит к необходимости суперкомпьютерной реализации для решения важных практических задач.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающий начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
Однако, элементы итогового вектора можно записать и в прямом виде, что более удобно для вычислений: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить индексы &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; имеющие двоичные представления &amp;lt;math&amp;gt;i_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут однократно проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; (рис.1) и &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; (рис.2). На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. На Рис.3 изображена основная операция, представляемая на Рис.1 и Рис.2 оранжевым цветом. &lt;br /&gt;
&lt;br /&gt;
Отображение графа со входными и выходными данных, а также &amp;quot;свёрнутой&amp;quot; тройной операцией удобно для понимания локальности обращений к памяти.&lt;br /&gt;
Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Рисунок 1. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Рисунок 2. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:q_operation.png|thumb|center|300px|Рисунок 3. Граф основной операции.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, прямой алгоритм моделирования однокубитного преобразования обладает высочайшей степенью параллелизма. Все операции вычисления элементов нового вектора-состояния могут быть произведены параллельно. Для вычисления одного элемента необходимо выполнить две операции умножения и одну операцию сложения, операции умножения, в свою очередь, также могут быть выполнены параллельно.&lt;br /&gt;
Таким образом, необходимо выполнение двух ярусов: одного, состоящего из &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; умножений и другого, состоящего из &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Обычно нормирован на единицу.&lt;br /&gt;
* Унитарная матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Номер кубита &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt; комплексных чисел и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целочисленный параметр.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности является &#039;&#039;экспоненциальным&#039;&#039; (эксмпонента переходит в константу).&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – &#039;&#039;константа&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
На языке C функцию однокубитного преобразования можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void OneQubitEvolution(complexd *in, complexd *out, complexd U[2][2], int nqubits, int q)&lt;br /&gt;
{&lt;br /&gt;
	//n - число кубитов&lt;br /&gt;
        //q - номер кубита для преобразования&lt;br /&gt;
&lt;br /&gt;
	int shift = nqubits-q;&lt;br /&gt;
	//Все биты нулевые, кроме соответствующего позиции преобразуемого кубита  &lt;br /&gt;
	int pow2q=1&amp;lt;&amp;lt;(shift);&lt;br /&gt;
&lt;br /&gt;
	int N=1&amp;lt;&amp;lt;nqubits;&lt;br /&gt;
	for	(int i=0; i&amp;lt;N; i++)&lt;br /&gt;
	{&lt;br /&gt;
		//Обнуления меняющегося бита&lt;br /&gt;
		int i0 = i &amp;amp; ~pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Установка меняющегося бита&lt;br /&gt;
		int i1 = i | pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Получение значения меняющегося бита&lt;br /&gt;
		int iq = (i &amp;amp; pow2q) &amp;gt;&amp;gt; shift;&lt;br /&gt;
&lt;br /&gt;
		out[i] = U[iq][0] * in[i0] + U[iq][1] *in[i1];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что существенная часть вычислений и логики кода приходится на битовые операции, однако, этого можно избежать: однокубитное преобразование в большинстве случаев является лишь подпрограммой и применяется к разным кубитам большое число раз. В свою очередь, вычисляемые при помощи битовых операций индексы i0, i1 и iq зависят лишь от параметров количества кубитов n и номера кубита q. Число кубитов обычно фиксировано, соответственно, можно вычислить эти индексы заранее для всех q от 1 до n. Для хранения потребуется лишь массив целочисленных переменных линейного размера 3n в то время, как обрабатываемые данные имеют экспоненциальный размер. Очевидно, что такая оптимизация критически необходима при реализации алгоритма на вычислительных устройствах или языках программирования с отсутствием быстрых битовых операций (примером может служить среда Matlab).&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
К сожалению, в противовес идеальной возможности параллелизации алгоритма, практические реализации обладают очень плохой локальностью.&lt;br /&gt;
&lt;br /&gt;
Из математического описания и информационных графов для разных параметров q можно заметить, что при однократном применении однокубитного преобразования легко получить идеальную локальность обращения к данным простой перестановкой кубитов. Так, переместив кубит q на последнее место, мы получим взаимодействие лишь соседних по памяти элементов, причем в идеальном последовательном доступе. &lt;br /&gt;
&lt;br /&gt;
Однако, преобразование одного кубита в прикладных задачах является лишь подпрограммой и применяется многократно с различными параметрами q. Как видно из математического описания и Рис. 1-2, это полностью исключает возможность добиться локальности обращений к данным. &lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_1.png|thumb|center|700px|Рисунок 1. Однокубитное преобразование вектора-состояния. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис. 1 представлен профиль обращений в память для вычисления однокубитного преобразования вектора-состояния. Данный профиль состоит из обращений к трем массивам, фрагменты для отдельных массивов выделены на рис. 1 зеленым цветом. Из общего профиля можно увидеть, что обращения редко используются повторно, по крайней мере в случае фрагментов 2 и 3. При этом обращения к близко расположенным друг к другу данным выполняются рядом. Рассмотрим выделенные фрагменты поближе.&lt;br /&gt;
&lt;br /&gt;
Отдельно фрагмент 1 представлен на рис. 2. Видно, что данный массив состоит всего из 4-х элементов, к которым постоянно выполняются обращения. Такой фрагмент обладает очень высокой локальностью, поскольку постоянно используются ранее запрошенные данные.&lt;br /&gt;
&lt;br /&gt;
Далее, рассмотрим фрагмент 2 (рис. 3). Здесь все еще проще – выполняется обычный последовательный перебор всех элементов массива. Такой фрагмент обладает высокой пространственной локальностью, однако очень низкой временной (данные не используются повторно).&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_2.png|thumb|center|500px|Рисунок 2. Фрагмент 1 (профиль обращений к первому массиву)]]&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_3.png|thumb|center|500px|Рисунок 3. Фрагмент 2 (профиль обращений ко второму массиву)]]&lt;br /&gt;
&lt;br /&gt;
Наиболее интересным представляется фрагмент 3. Его небольшой фрагмент, выделенный на рис. 1 желтым, представлен на рис. 4. Однако при ближайшем рассмотрении оказывается, что данный фрагмент тоже просто устроен, хотя и немного сложнее предыдущих.&lt;br /&gt;
&lt;br /&gt;
В данном случае также виден в центре последовательный перебор всех элементов массива, параллельно с которым выполняются обращения либо к элементам с большим или меньшим виртуальным адресом. Отметим, однако, что эта разница между виртуальными адресами, судя по всему, больше 64 байт (длины строки), что может служить причиной возникновения большого числа кэш-промахов.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_4.png|thumb|center|500px|Рисунок 4. Небольшая часть фрагмента 3, выделенная на рис. 1 желтым]]&lt;br /&gt;
&lt;br /&gt;
В общем можно сказать, что общий профиль обращений в память обладает достаточно высокой пространственной локальностью, поскольку большинство обращений образуют последовательные переборы элементов массивов, однако временная локальность низка – данные практически не используются повторно.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/benchmarks/qubit_evolution/qubit_evolution.h здесь] (функция Kernel). Условия запуска описаны [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность работы с памятью для этой программы высока – значение daps примерно на уровне теста Linpack. Видимо, низкая временная локальность в данном случае компенсируется высокой пространственной локальностью. &lt;br /&gt;
&lt;br /&gt;
[[file:qubit_daps.png|thumb|center|700px|Рисунок 5. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рисунке 6 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, в отличие от daps, cvg оценивает локальность данной программы как достаточно низкую. В частности, значение cvg для Linpack заметно меньше, в то время как значения daps практически совпадали.&lt;br /&gt;
&lt;br /&gt;
Одна из возможных причин этого – влияние арифметических операций. Может получиться, что данные из памяти не будут запрашиваться, пока арифметические операции не будут выполнены; это приводит к простою подсистемы памяти. Соответственно, если в одной программе таких операций нет, а в другой - есть, то daps в первом случае будет выше. При этом cvg не поменяется, поскольку эта оценка не зависит от времени выполнения. &lt;br /&gt;
&lt;br /&gt;
В данном случае арифметических операций практически нет (в отличие от некоторых других программ), поэтому daps может показывать более высокие результаты, в то время как cvg показывает достаточно низкую оценку.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_cvg.png|thumb|center|700px|Рисунок 6. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Основной способ параллельной реализации очевиден - необходимо распараллеливание основного цикла (параллельное вычисление различных компонент выходного вектора-состояния) и, желательно, операций умножения. На машинах с общей памятью такой вариант распараллеливания приводит к ускорению, близкому к максимально-возможному. &lt;br /&gt;
Однако, данный способ сталкивается с проблемами локальности данных. Анализируя математическая описание и информационные графы алгоритма легко видеть, что при использовании большого числа узлов с собственной памятью количество необходимых пересылок между узлами становится сопоставимым с количеством вычислений, что приводит к существенной потере эффективности. Возможны разные пути частичного решения этой проблемы, например, кэширование или использование парадигмы программирования SHMEM, однако, столь сильная нелокальность использования данных всё равно не позволяет добиться хорошей эффективности.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
В связи с констатной высотой ярусно-параллельной формы алгоритм имеет отличную масштабируемость на машинах с общей памятью. При реализации на машинах с разделяемой памятью быстро возникают проблемы, связанные с локальностью.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 512] со значениями степени двойки;&lt;br /&gt;
*	число кубитов [16;32] с шагом 2.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0.000003%;&lt;br /&gt;
*	максимальная эффективность реализации 0.008%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Qbit perf.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма. Изменение производительности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
[[file:Qbit eff.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма. Изменение эффективности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3179</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3179"/>
		<updated>2015-12-22T13:10:20Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Локальность данных и вычислений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Однокубитное преобразование &amp;lt;br /&amp;gt; вектора-состояния&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;3 \cdot 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]])&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;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/store/storage/jpvtv20_algebraic_tools.pdf|Кронберг Д. А., Ожигов Ю. И., Чернявский А. Ю. Алгебраический аппарат квантовой информатики.]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/files/book_v01.pdf|Корж О. В., Чернявский А. Ю. Практикум по суперкомпьютерным технологиям и квантовым вычислениям 3 курс.]] &amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Preskill J. Lecture notes for physics 229: Quantum information and computation //California Institute of Technology. – 1998.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Нильсен М., Чанг И. Квантовые вычисления и квантовая информация. – М : Мир, 2006.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Данный алгоритм обычно является подпрограммой и многократно применяется к различным кубитам одного состояния (например при моделировании квантовых алгоритмов или анализе квантовой запутанности). Особенностью алгоритма, как и большинства алгоритмов квантовой инфоорматики, является экспоненциальный рост объема данных в зависимости от основного параметра - числа кубитов, что приводит к необходимости суперкомпьютерной реализации для решения важных практических задач.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающий начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
Однако, элементы итогового вектора можно записать и в прямом виде, что более удобно для вычислений: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить индексы &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; имеющие двоичные представления &amp;lt;math&amp;gt;i_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут однократно проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; (рис.1) и &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; (рис.2). На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. На Рис.3 изображена основная операция, представляемая на Рис.1 и Рис.2 оранжевым цветом. &lt;br /&gt;
&lt;br /&gt;
Отображение графа со входными и выходными данных, а также &amp;quot;свёрнутой&amp;quot; тройной операцией удобно для понимания локальности обращений к памяти.&lt;br /&gt;
Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Рисунок 1. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Рисунок 2. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:q_operation.png|thumb|center|300px|Рисунок 3. Граф основной операции.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, прямой алгоритм моделирования однокубитного преобразования обладает высочайшей степенью параллелизма. Все операции вычисления элементов нового вектора-состояния могут быть произведены параллельно. Для вычисления одного элемента необходимо выполнить две операции умножения и одну операцию сложения, операции умножения, в свою очередь, также могут быть выполнены параллельно.&lt;br /&gt;
Таким образом, необходимо выполнение двух ярусов: одного, состоящего из &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; умножений и другого, состоящего из &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Обычно нормирован на единицу.&lt;br /&gt;
* Унитарная матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Номер кубита &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt; комплексных чисел и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целочисленный параметр.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности является &#039;&#039;экспоненциальным&#039;&#039; (эксмпонента переходит в константу).&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – &#039;&#039;константа&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
На языке C функцию однокубитного преобразования можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void OneQubitEvolution(complexd *in, complexd *out, complexd U[2][2], int nqubits, int q)&lt;br /&gt;
{&lt;br /&gt;
	//n - число кубитов&lt;br /&gt;
        //q - номер кубита для преобразования&lt;br /&gt;
&lt;br /&gt;
	int shift = nqubits-q;&lt;br /&gt;
	//Все биты нулевые, кроме соответствующего позиции преобразуемого кубита  &lt;br /&gt;
	int pow2q=1&amp;lt;&amp;lt;(shift);&lt;br /&gt;
&lt;br /&gt;
	int N=1&amp;lt;&amp;lt;nqubits;&lt;br /&gt;
	for	(int i=0; i&amp;lt;N; i++)&lt;br /&gt;
	{&lt;br /&gt;
		//Обнуления меняющегося бита&lt;br /&gt;
		int i0 = i &amp;amp; ~pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Установка меняющегося бита&lt;br /&gt;
		int i1 = i | pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Получение значения меняющегося бита&lt;br /&gt;
		int iq = (i &amp;amp; pow2q) &amp;gt;&amp;gt; shift;&lt;br /&gt;
&lt;br /&gt;
		out[i] = U[iq][0] * in[i0] + U[iq][1] *in[i1];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что существенная часть вычислений и логики кода приходится на битовые операции, однако, этого можно избежать: однокубитное преобразование в большинстве случаев является лишь подпрограммой и применяется к разным кубитам большое число раз. В свою очередь, вычисляемые при помощи битовых операций индексы i0, i1 и iq зависят лишь от параметров количества кубитов n и номера кубита q. Число кубитов обычно фиксировано, соответственно, можно вычислить эти индексы заранее для всех q от 1 до n. Для хранения потребуется лишь массив целочисленных переменных линейного размера 3n в то время, как обрабатываемые данные имеют экспоненциальный размер. Очевидно, что такая оптимизация критически необходима при реализации алгоритма на вычислительных устройствах или языках программирования с отсутствием быстрых битовых операций (примером может служить среда Matlab).&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
К сожалению, в противовес идеальной возможности параллелизации алгоритма, практические реализации обладают очень плохой локальностью.&lt;br /&gt;
&lt;br /&gt;
Из математического описания и информационных графов для разных параметров q можно заметить, что при однократном применении однокубитного преобразования легко получить идеальную локальность обращения к данным простой перестановкой кубитов. Так, переместив кубит q на последнее место, мы получим взаимодействие лишь соседних по памяти элементов, причем в идеальном последовательном доступе. &lt;br /&gt;
&lt;br /&gt;
Однако, преобразование одного кубита в прикладных задачах является лишь подпрограммой и применяется многократно с различными параметрами q. Как видно из математического описания и Рис. 1-2, это полностью исключает возможность добиться локальности обращений к данным. &lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_1.png|thumb|center|700px|Рисунок 1. Однокубитное преобразование вектора-состояния. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис. 1 представлен профиль обращений в память для вычисления однокубитного преобразования вектора-состояния. Данный профиль состоит из обращений к трем массивам, фрагменты для отдельных массивов выделены на рис. 1 зеленым цветом. Из общего профиля можно увидеть, что обращения редко используются повторно, по крайней мере в случае фрагментов 2 и 3. При этом обращения к близко расположенным друг к другу данным выполняются рядом. Рассмотрим выделенные фрагменты поближе.&lt;br /&gt;
&lt;br /&gt;
Отдельно фрагмент 1 представлен на рис. 2. Видно, что данный массив состоит всего из 4-х элементов, к которым постоянно выполняются обращения. Такой фрагмент обладает очень высокой локальностью, поскольку постоянно используются ранее запрошенные данные.&lt;br /&gt;
&lt;br /&gt;
Далее, рассмотрим фрагмент 2 (рис. 3). Здесь все еще проще – выполняется обычный последовательный перебор всех элементов массива. Такой фрагмент обладает высокой пространственной локальностью, однако очень низкой временной (данные не используются повторно).&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_2.png|thumb|center|500px|Рисунок 2. Фрагмент 1 (профиль обращений к первому массиву)]]&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_3.png|thumb|center|500px|Рисунок 3. Фрагмент 2 (профиль обращений ко второму массиву)]]&lt;br /&gt;
&lt;br /&gt;
Наиболее интересным представляется фрагмент 3. Его небольшой фрагмент, выделенный на рис. 1 желтым, представлен на рис. 4. Однако при ближайшем рассмотрении оказывается, что данный фрагмент тоже просто устроен, хотя и немного сложнее предыдущих.&lt;br /&gt;
&lt;br /&gt;
В данном случае также виден в центре последовательный перебор всех элементов массива, параллельно с которым выполняются обращения либо к элементам с большим или меньшим виртуальным адресом. Отметим, однако, что эта разница между виртуальными адресами, судя по всему, больше 64 байт (длины строки), что может служить причиной возникновения большого числа кэш-промахов.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_4.png|thumb|center|500px|Рисунок 4. Небольшая часть фрагмента 3, выделенная на рис. 1 желтым]]&lt;br /&gt;
&lt;br /&gt;
В общем можно сказать, что общий профиль обращений в память обладает достаточно высокой пространственной локальностью, поскольку большинство обращений образуют последовательные переборы элементов массивов, однако временная локальность низка – данные практически не используются повторно.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/benchmarks/qubit_evolution/qubit_evolution.h здесь] (функция Kernel). Условия запуска описаны [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность работы с памятью для этой программы высока – значение daps примерно на уровне теста Linpack. Видимо, низкая временная локальность в данном случае компенсируется высокой пространственной локальностью. &lt;br /&gt;
&lt;br /&gt;
[[file:qubit_daps.png|thumb|center|700px|Рисунок 5. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рисунке 6 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, в отличие от daps, cvg оценивает локальность данной программы как достаточно низкую. В частности, значение cvg для Linpack заметно меньше, в то время как значения daps практически совпадали.&lt;br /&gt;
&lt;br /&gt;
Одна из возможных причин этого – влияние арифметических операций. Может получиться, что данные из памяти не будут запрашиваться, пока арифметические операции не будут выполнены; это приводит к простою подсистемы памяти. Соответственно, если в одной программе таких операций нет, а в другой - есть, то daps в первом случае будет выше. При этом cvg не поменяется, поскольку эта оценка не зависит от времени выполнения. &lt;br /&gt;
&lt;br /&gt;
В данном случае арифметических операций практически нет (в отличие от некоторых других программ), поэтому daps может показывать более высокие результаты, в то время как cvg показывает достаточно низкую оценку.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_cvg.png|thumb|center|700px|Рисунок 6. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Основной способ параллельной реализации очевиден - необходимо распараллеливание основного цикла (параллельное вычисление различных компонент выходного вектора-состояния) и, желательно, операций умножения. На машинах с общей памятью такой вариант распараллеливания приводит к ускорению, близкому к максимально-возможному. &lt;br /&gt;
Однако, данный способ сталкивается с проблемами локальности данных. Анализируя математическая описание и информационные графы алгоритма легко видеть, что при использовании большого числа узлов с собственной памятью количество необходимых пересылок между узлами становится сопоставимым с количеством вычислений, что приводит к существенной потере эффективности. Возможны разные пути частичного решения этой проблемы, например, кэширование или использование парадигмы программирования SHMEM, однако, столь сильная нелокальность использования данных всё равно не позволяет получить хорошей эффективности.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
В связи с констатной высотой ярусно-параллельной формы алгоритм имеет отличную масштабируемость на машинах с общей памятью. При реализации на машинах с разделяемой памятью быстро возникают проблемы, связанные с локальностью.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 512] со значениями степени двойки;&lt;br /&gt;
*	число кубитов [16;32] с шагом 2.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0.000003%;&lt;br /&gt;
*	максимальная эффективность реализации 0.008%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Qbit perf.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма. Изменение производительности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
[[file:Qbit eff.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма. Изменение эффективности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3178</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3178"/>
		<updated>2015-12-22T13:05:02Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Однокубитное преобразование &amp;lt;br /&amp;gt; вектора-состояния&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;3 \cdot 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]])&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;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/store/storage/jpvtv20_algebraic_tools.pdf|Кронберг Д. А., Ожигов Ю. И., Чернявский А. Ю. Алгебраический аппарат квантовой информатики.]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/files/book_v01.pdf|Корж О. В., Чернявский А. Ю. Практикум по суперкомпьютерным технологиям и квантовым вычислениям 3 курс.]] &amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Preskill J. Lecture notes for physics 229: Quantum information and computation //California Institute of Technology. – 1998.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Нильсен М., Чанг И. Квантовые вычисления и квантовая информация. – М : Мир, 2006.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Данный алгоритм обычно является подпрограммой и многократно применяется к различным кубитам одного состояния (например при моделировании квантовых алгоритмов или анализе квантовой запутанности). Особенностью алгоритма, как и большинства алгоритмов квантовой инфоорматики, является экспоненциальный рост объема данных в зависимости от основного параметра - числа кубитов, что приводит к необходимости суперкомпьютерной реализации для решения важных практических задач.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающий начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
Однако, элементы итогового вектора можно записать и в прямом виде, что более удобно для вычислений: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить индексы &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; имеющие двоичные представления &amp;lt;math&amp;gt;i_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут однократно проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; (рис.1) и &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; (рис.2). На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. На Рис.3 изображена основная операция, представляемая на Рис.1 и Рис.2 оранжевым цветом. &lt;br /&gt;
&lt;br /&gt;
Отображение графа со входными и выходными данных, а также &amp;quot;свёрнутой&amp;quot; тройной операцией удобно для понимания локальности обращений к памяти.&lt;br /&gt;
Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Рисунок 1. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Рисунок 2. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:q_operation.png|thumb|center|300px|Рисунок 3. Граф основной операции.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, прямой алгоритм моделирования однокубитного преобразования обладает высочайшей степенью параллелизма. Все операции вычисления элементов нового вектора-состояния могут быть произведены параллельно. Для вычисления одного элемента необходимо выполнить две операции умножения и одну операцию сложения, операции умножения, в свою очередь, также могут быть выполнены параллельно.&lt;br /&gt;
Таким образом, необходимо выполнение двух ярусов: одного, состоящего из &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; умножений и другого, состоящего из &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Обычно нормирован на единицу.&lt;br /&gt;
* Унитарная матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Номер кубита &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt; комплексных чисел и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целочисленный параметр.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности является &#039;&#039;экспоненциальным&#039;&#039; (эксмпонента переходит в константу).&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – &#039;&#039;константа&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
На языке C функцию однокубитного преобразования можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void OneQubitEvolution(complexd *in, complexd *out, complexd U[2][2], int nqubits, int q)&lt;br /&gt;
{&lt;br /&gt;
	//n - число кубитов&lt;br /&gt;
        //q - номер кубита для преобразования&lt;br /&gt;
&lt;br /&gt;
	int shift = nqubits-q;&lt;br /&gt;
	//Все биты нулевые, кроме соответствующего позиции преобразуемого кубита  &lt;br /&gt;
	int pow2q=1&amp;lt;&amp;lt;(shift);&lt;br /&gt;
&lt;br /&gt;
	int N=1&amp;lt;&amp;lt;nqubits;&lt;br /&gt;
	for	(int i=0; i&amp;lt;N; i++)&lt;br /&gt;
	{&lt;br /&gt;
		//Обнуления меняющегося бита&lt;br /&gt;
		int i0 = i &amp;amp; ~pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Установка меняющегося бита&lt;br /&gt;
		int i1 = i | pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Получение значения меняющегося бита&lt;br /&gt;
		int iq = (i &amp;amp; pow2q) &amp;gt;&amp;gt; shift;&lt;br /&gt;
&lt;br /&gt;
		out[i] = U[iq][0] * in[i0] + U[iq][1] *in[i1];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что существенная часть вычислений и логики кода приходится на битовые операции, однако, этого можно избежать: однокубитное преобразование в большинстве случаев является лишь подпрограммой и применяется к разным кубитам большое число раз. В свою очередь, вычисляемые при помощи битовых операций индексы i0, i1 и iq зависят лишь от параметров количества кубитов n и номера кубита q. Число кубитов обычно фиксировано, соответственно, можно вычислить эти индексы заранее для всех q от 1 до n. Для хранения потребуется лишь массив целочисленных переменных линейного размера 3n в то время, как обрабатываемые данные имеют экспоненциальный размер. Очевидно, что такая оптимизация критически необходима при реализации алгоритма на вычислительных устройствах или языках программирования с отсутствием быстрых битовых операций (примером может служить среда Matlab).&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
К сожалению, в потивовес идельной возможности параллелизации алгоритма, он обладает очень плохой локальностью.&lt;br /&gt;
&lt;br /&gt;
Из математического описания и информационных графов для разных параметров q можно заметить, что при однократном применении однокубитного преобразования легко получить идеальную локальность обращения к данным простой перестановкой кубитов. Так, переместив кубит q на последнее место, мы получим взаимодействие лишь соседних по памяти элемнтов, причем в идеальном последовательном доступе. &lt;br /&gt;
&lt;br /&gt;
Однако, преобразование одного кубита в прикладных задачах является лишь подпрограммой и применяется многократно с различными параметрами q. Как видно из математического описания и Рис. 1-2, это полностью исключает возможность добиться локальности обращений к данным. &lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_1.png|thumb|center|700px|Рисунок 1. Однокубитное преобразование вектора-состояния. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис. 1 представлен профиль обращений в память для вычисления однокубитного преобразования вектора-состояния. Данный профиль состоит из обращений к трем массивам, фрагменты для отдельных массивов выделены на рис. 1 зеленым цветом. Из общего профиля можно увидеть, что обращения редко используются повторно, по крайней мере в случае фрагментов 2 и 3. При этом обращения к близко расположенным друг к другу данным выполняются рядом. Рассмотрим выделенные фрагменты поближе.&lt;br /&gt;
&lt;br /&gt;
Отдельно фрагмент 1 представлен на рис. 2. Видно, что данный массив состоит всего из 4-х элементов, к которым постоянно выполняются обращения. Такой фрагмент обладает очень высокой локальностью, поскольку постоянно переиспользуются запрошенные ранее данные.&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим фрагмент 2 (рис. 3). Здесь все еще проще – выполняется обычный последовательный перебор всех элементов массива. Такой фрагмент обладает высокой пространственной локальностью, однако очень низкой временной (данные просто не используются повторно).&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_2.png|thumb|center|500px|Рисунок 2. Фрагмент 1 (профиль обращений к первому массиву)]]&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_3.png|thumb|center|500px|Рисунок 3. Фрагмент 2 (профиль обращений ко второму массиву)]]&lt;br /&gt;
&lt;br /&gt;
Наиболее интересным представляется фрагмент 3. Его небольшой фрагмент, выделенный на рис. 1 желтым, представлен на рис. 4. Однако при ближайшем рассмотрении оказывается, что данный фрагмент тоже просто устроен, хотя и немного сложнее предыдущих.&lt;br /&gt;
&lt;br /&gt;
В данном случае также виден в центре последовательный перебор всех элементов массива, параллельно с которым выполняются обращения либо к элементам с большим или меньшим виртуальным адресом. Отметим, однако, что эта разница между виртуальными адресами, судя по всему, больше 64 байт (длины строки), что может служить причиной возникновения большого числа кэш-промахов.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_4.png|thumb|center|500px|Рисунок 4. Небольшая часть фрагмента 3, выделенная на рис. 1 желтым]]&lt;br /&gt;
&lt;br /&gt;
В общем можно сказать, что общий профиль обращений в память обладает достаточно высокой пространственной локальностью, поскольку большинство обращений образуют последовательные переборы элементов массивов, однако временная локальность низка – данные практически не используются повторно.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/benchmarks/qubit_evolution/qubit_evolution.h здесь] (функция Kernel). Условия запуска описаны [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность работы с памятью для этой программы высока – значение daps примерно на уровне теста Linpack. Видимо, низкая временная локальность в данном случае компенсируется высокой пространственной локальностью. &lt;br /&gt;
&lt;br /&gt;
[[file:qubit_daps.png|thumb|center|700px|Рисунок 5. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рисунке 6 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, в отличие от daps, cvg оценивает локальность данной программы как достаточно низкую. В частности, значение cvg для Linpack заметно меньше, в то время как значения daps практически совпадали.&lt;br /&gt;
&lt;br /&gt;
Одна из возможных причин этого – влияние арифметических операций. Может получиться, что данные из памяти не будут запрашиваться, пока арифметические операции не будут выполнены; это приводит к простою подсистемы памяти. Соответственно, если в одной программе таких операций нет, а в другой - есть, то daps в первом случае будет выше. При этом cvg не поменяется, поскольку эта оценка не зависит от времени выполнения. &lt;br /&gt;
&lt;br /&gt;
В данном случае арифметических операций практически нет (в отличие от некоторых других программ), поэтому daps может показывать более высокие результаты, в то время как cvg показывает достаточно низкую оценку.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_cvg.png|thumb|center|700px|Рисунок 6. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Основной способ параллельной реализации очевиден - необходимо распараллеливание основного цикла (параллельное вычисление различных компонент выходного вектора-состояния) и, желательно, операций умножения. На машинах с общей памятью такой вариант распараллеливания приводит к ускорению, близкому к максимально-возможному. &lt;br /&gt;
Однако, данный способ сталкивается с проблемами локальности данных. Анализируя математическая описание и информационные графы алгоритма легко видеть, что при использовании большого числа узлов с собственной памятью количество необходимых пересылок между узлами становится сопоставимым с количеством вычислений, что приводит к существенной потере эффективности. Возможны разные пути частичного решения этой проблемы, например, кэширование или использование парадигмы программирования SHMEM, однако, столь сильная нелокальность использования данных всё равно не позволяет получить хорошей эффективности.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
В связи с констатной высотой ярусно-параллельной формы алгоритм имеет отличную масштабируемость на машинах с общей памятью. При реализации на машинах с разделяемой памятью быстро возникают проблемы, связанные с локальностью.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 512] со значениями степени двойки;&lt;br /&gt;
*	число кубитов [16;32] с шагом 2.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0.000003%;&lt;br /&gt;
*	максимальная эффективность реализации 0.008%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Qbit perf.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма. Изменение производительности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
[[file:Qbit eff.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма. Изменение эффективности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3177</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3177"/>
		<updated>2015-12-22T13:04:10Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Однокубитное преобразование &amp;lt;br /&amp;gt; вектора-состояния&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;3 \cdot 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]])&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;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/store/storage/jpvtv20_algebraic_tools.pdf|Кронберг Д. А., Ожигов Ю. И., Чернявский А. Ю. Алгебраический аппарат квантовой информатики.]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/files/book_v01.pdf|Корж О. В., Чернявский А. Ю. Практикум по суперкомпьютерным технологиям и квантовым вычислениям 3 курс.]] &amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Preskill J. Lecture notes for physics 229: Quantum information and computation //California Institute of Technology. – 1998.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Нильсен М., Чанг И. Квантовые вычисления и квантовая информация. – М : Мир, 2006.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Данный алгоритм обычно является подпрограммой и многократно применяется к различным кубитам одного состояния (например при моделировании квантовых алгоритмов или анализе квантовой запутанности). Особенностью алгоритма, как и большинства алгоритмов квантовой инфоорматики, является экспоненциальный рост объема данных в зависимости от основного параметра - числа кубитов, что приводит к необходимости суперкомпьютерной реализации для решения важных практических задач.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающий начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
Однако, элементы итогового вектора можно записать и в прямом виде, что более удобно для вычислений: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить индексы &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; имеющие двоичные представления &amp;lt;math&amp;gt;i_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут однократно проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; (рис.1) и &amp;lt;math&amp;gt;k=2&amp;lt;/math&amp;gt; (рис.2). На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. На Рис.3 изображена основная операция, представляемая на Рис.1 и Рис.2 оранжевым. &lt;br /&gt;
&lt;br /&gt;
Отображение графа со входными и выходными данных, а также &amp;quot;свёрнутой&amp;quot; тройной операцией удобно для понимания локальности обращений к памяти.&lt;br /&gt;
Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Рисунок 1. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Рисунок 2. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:q_operation.png|thumb|center|300px|Рисунок 3. Граф основной операции.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, прямой алгоритм моделирования однокубитного преобразования обладает высочайшей степенью параллелизма. Все операции вычисления элементов нового вектора-состояния могут быть произведены параллельно. Для вычисления одного элемента необходимо выполнить две операции умножения и одну операцию сложения, операции умножения, в свою очередь, также могут быть выполнены параллельно.&lt;br /&gt;
Таким образом, необходимо выполнение двух ярусов: одного, состоящего из &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; умножений и другого, состоящего из &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Обычно нормирован на единицу.&lt;br /&gt;
* Унитарная матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Номер кубита &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt; комплексных чисел и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целочисленный параметр.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности является &#039;&#039;экспоненциальным&#039;&#039; (эксмпонента переходит в константу).&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – &#039;&#039;константа&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
На языке C функцию однокубитного преобразования можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void OneQubitEvolution(complexd *in, complexd *out, complexd U[2][2], int nqubits, int q)&lt;br /&gt;
{&lt;br /&gt;
	//n - число кубитов&lt;br /&gt;
        //q - номер кубита для преобразования&lt;br /&gt;
&lt;br /&gt;
	int shift = nqubits-q;&lt;br /&gt;
	//Все биты нулевые, кроме соответствующего позиции преобразуемого кубита  &lt;br /&gt;
	int pow2q=1&amp;lt;&amp;lt;(shift);&lt;br /&gt;
&lt;br /&gt;
	int N=1&amp;lt;&amp;lt;nqubits;&lt;br /&gt;
	for	(int i=0; i&amp;lt;N; i++)&lt;br /&gt;
	{&lt;br /&gt;
		//Обнуления меняющегося бита&lt;br /&gt;
		int i0 = i &amp;amp; ~pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Установка меняющегося бита&lt;br /&gt;
		int i1 = i | pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Получение значения меняющегося бита&lt;br /&gt;
		int iq = (i &amp;amp; pow2q) &amp;gt;&amp;gt; shift;&lt;br /&gt;
&lt;br /&gt;
		out[i] = U[iq][0] * in[i0] + U[iq][1] *in[i1];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что существенная часть вычислений и логики кода приходится на битовые операции, однако, этого можно избежать: однокубитное преобразование в большинстве случаев является лишь подпрограммой и применяется к разным кубитам большое число раз. В свою очередь, вычисляемые при помощи битовых операций индексы i0, i1 и iq зависят лишь от параметров количества кубитов n и номера кубита q. Число кубитов обычно фиксировано, соответственно, можно вычислить эти индексы заранее для всех q от 1 до n. Для хранения потребуется лишь массив целочисленных переменных линейного размера 3n в то время, как обрабатываемые данные имеют экспоненциальный размер. Очевидно, что такая оптимизация критически необходима при реализации алгоритма на вычислительных устройствах или языках программирования с отсутствием быстрых битовых операций (примером может служить среда Matlab).&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
К сожалению, в потивовес идельной возможности параллелизации алгоритма, он обладает очень плохой локальностью.&lt;br /&gt;
&lt;br /&gt;
Из математического описания и информационных графов для разных параметров q можно заметить, что при однократном применении однокубитного преобразования легко получить идеальную локальность обращения к данным простой перестановкой кубитов. Так, переместив кубит q на последнее место, мы получим взаимодействие лишь соседних по памяти элемнтов, причем в идеальном последовательном доступе. &lt;br /&gt;
&lt;br /&gt;
Однако, преобразование одного кубита в прикладных задачах является лишь подпрограммой и применяется многократно с различными параметрами q. Как видно из математического описания и Рис. 1-2, это полностью исключает возможность добиться локальности обращений к данным. &lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_1.png|thumb|center|700px|Рисунок 1. Однокубитное преобразование вектора-состояния. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис. 1 представлен профиль обращений в память для вычисления однокубитного преобразования вектора-состояния. Данный профиль состоит из обращений к трем массивам, фрагменты для отдельных массивов выделены на рис. 1 зеленым цветом. Из общего профиля можно увидеть, что обращения редко используются повторно, по крайней мере в случае фрагментов 2 и 3. При этом обращения к близко расположенным друг к другу данным выполняются рядом. Рассмотрим выделенные фрагменты поближе.&lt;br /&gt;
&lt;br /&gt;
Отдельно фрагмент 1 представлен на рис. 2. Видно, что данный массив состоит всего из 4-х элементов, к которым постоянно выполняются обращения. Такой фрагмент обладает очень высокой локальностью, поскольку постоянно переиспользуются запрошенные ранее данные.&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим фрагмент 2 (рис. 3). Здесь все еще проще – выполняется обычный последовательный перебор всех элементов массива. Такой фрагмент обладает высокой пространственной локальностью, однако очень низкой временной (данные просто не используются повторно).&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_2.png|thumb|center|500px|Рисунок 2. Фрагмент 1 (профиль обращений к первому массиву)]]&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_3.png|thumb|center|500px|Рисунок 3. Фрагмент 2 (профиль обращений ко второму массиву)]]&lt;br /&gt;
&lt;br /&gt;
Наиболее интересным представляется фрагмент 3. Его небольшой фрагмент, выделенный на рис. 1 желтым, представлен на рис. 4. Однако при ближайшем рассмотрении оказывается, что данный фрагмент тоже просто устроен, хотя и немного сложнее предыдущих.&lt;br /&gt;
&lt;br /&gt;
В данном случае также виден в центре последовательный перебор всех элементов массива, параллельно с которым выполняются обращения либо к элементам с большим или меньшим виртуальным адресом. Отметим, однако, что эта разница между виртуальными адресами, судя по всему, больше 64 байт (длины строки), что может служить причиной возникновения большого числа кэш-промахов.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_4.png|thumb|center|500px|Рисунок 4. Небольшая часть фрагмента 3, выделенная на рис. 1 желтым]]&lt;br /&gt;
&lt;br /&gt;
В общем можно сказать, что общий профиль обращений в память обладает достаточно высокой пространственной локальностью, поскольку большинство обращений образуют последовательные переборы элементов массивов, однако временная локальность низка – данные практически не используются повторно.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/benchmarks/qubit_evolution/qubit_evolution.h здесь] (функция Kernel). Условия запуска описаны [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность работы с памятью для этой программы высока – значение daps примерно на уровне теста Linpack. Видимо, низкая временная локальность в данном случае компенсируется высокой пространственной локальностью. &lt;br /&gt;
&lt;br /&gt;
[[file:qubit_daps.png|thumb|center|700px|Рисунок 5. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рисунке 6 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, в отличие от daps, cvg оценивает локальность данной программы как достаточно низкую. В частности, значение cvg для Linpack заметно меньше, в то время как значения daps практически совпадали.&lt;br /&gt;
&lt;br /&gt;
Одна из возможных причин этого – влияние арифметических операций. Может получиться, что данные из памяти не будут запрашиваться, пока арифметические операции не будут выполнены; это приводит к простою подсистемы памяти. Соответственно, если в одной программе таких операций нет, а в другой - есть, то daps в первом случае будет выше. При этом cvg не поменяется, поскольку эта оценка не зависит от времени выполнения. &lt;br /&gt;
&lt;br /&gt;
В данном случае арифметических операций практически нет (в отличие от некоторых других программ), поэтому daps может показывать более высокие результаты, в то время как cvg показывает достаточно низкую оценку.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_cvg.png|thumb|center|700px|Рисунок 6. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Основной способ параллельной реализации очевиден - необходимо распараллеливание основного цикла (параллельное вычисление различных компонент выходного вектора-состояния) и, желательно, операций умножения. На машинах с общей памятью такой вариант распараллеливания приводит к ускорению, близкому к максимально-возможному. &lt;br /&gt;
Однако, данный способ сталкивается с проблемами локальности данных. Анализируя математическая описание и информационные графы алгоритма легко видеть, что при использовании большого числа узлов с собственной памятью количество необходимых пересылок между узлами становится сопоставимым с количеством вычислений, что приводит к существенной потере эффективности. Возможны разные пути частичного решения этой проблемы, например, кэширование или использование парадигмы программирования SHMEM, однако, столь сильная нелокальность использования данных всё равно не позволяет получить хорошей эффективности.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
В связи с констатной высотой ярусно-параллельной формы алгоритм имеет отличную масштабируемость на машинах с общей памятью. При реализации на машинах с разделяемой памятью быстро возникают проблемы, связанные с локальностью.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 512] со значениями степени двойки;&lt;br /&gt;
*	число кубитов [16;32] с шагом 2.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0.000003%;&lt;br /&gt;
*	максимальная эффективность реализации 0.008%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Qbit perf.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма. Изменение производительности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
[[file:Qbit eff.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма. Изменение эффективности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3176</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3176"/>
		<updated>2015-12-22T12:53:38Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Однокубитное преобразование &amp;lt;br /&amp;gt; вектора-состояния&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;3 \cdot 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]])&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;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/store/storage/jpvtv20_algebraic_tools.pdf|Кронберг Д. А., Ожигов Ю. И., Чернявский А. Ю. Алгебраический аппарат квантовой информатики.]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/files/book_v01.pdf|Корж О. В., Чернявский А. Ю. Практикум по суперкомпьютерным технологиям и квантовым вычислениям 3 курс.]] &amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Preskill J. Lecture notes for physics 229: Quantum information and computation //California Institute of Technology. – 1998.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Нильсен М., Чанг И. Квантовые вычисления и квантовая информация. – М : Мир, 2006.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Данный алгоритм обычно является подпрограммой и многократно применяется к различным кубитам одного состояния (например при моделировании квантовых алгоритмов или анализе квантовой запутанности). Особенностью алгоритма, как и большинства алгоритмов квантовой инфоорматики, является экспоненциальный рост объема данных в зависимости от основного параметра - числа кубитов, что приводит к необходимости суперкомпьютерной реализации для решения важных практических задач.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающий начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
Однако, элементы итогового вектора можно записать и в прямом виде, что более удобно для вычислений: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&amp;lt;/math&amp;gt; представляет собой двоичную запись индекса элемента в массиве.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма представляет собой независимое вычисление всех &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить индексы &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; имеющие двоичные представления &amp;lt;math&amp;gt;i_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; (рис.1) и &amp;lt;math&amp;gt;k=2&amp;lt;/math&amp;gt; (рис.2). На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. На Рис.3 изображена основная операция, представляемая на Рис.1 и Рис.2 оранжевым. &lt;br /&gt;
&lt;br /&gt;
Отображение графа со входными и выходными данных, а также &amp;quot;свёрнутой&amp;quot; тройной операцией удобно для понимания локальности обращений к памяти.&lt;br /&gt;
Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Рисунок 1. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Рисунок 2. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:q_operation.png|thumb|center|300px|Рисунок 3. Граф основной операции.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, прямой алгоритм моделирования однокубитного преобразования обладает высочайшей степенью параллелизма. Все операции вычисления элементов нового вектора-состояния могут быть произведены параллельно. Для вычисления одного элемента необходимо выполнить две операции умножения и одну операцию сложения, операции умножения, в свою очередь, также могут быть выполнены параллельно.&lt;br /&gt;
Таким образом, необходимо выполнение двух ярусов: одного, состоящего из &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; умножений и другого, состоящего из &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Обычно нормирован на единицу.&lt;br /&gt;
* Унитарная матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Номер кубита &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt; комплексных чисел и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целочисленный параметр.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности является &#039;&#039;экспоненциальным&#039;&#039; (эксмпонента переходит в константу).&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – &#039;&#039;константа&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
На языке C функцию однокубитного преобразования можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void OneQubitEvolution(complexd *in, complexd *out, complexd U[2][2], int nqubits, int q)&lt;br /&gt;
{&lt;br /&gt;
	//n - число кубитов&lt;br /&gt;
        //q - номер кубита для преобразования&lt;br /&gt;
&lt;br /&gt;
	int shift = nqubits-q;&lt;br /&gt;
	//Все биты нулевые, кроме соответствующего позиции преобразуемого кубита  &lt;br /&gt;
	int pow2q=1&amp;lt;&amp;lt;(shift);&lt;br /&gt;
&lt;br /&gt;
	int N=1&amp;lt;&amp;lt;nqubits;&lt;br /&gt;
	for	(int i=0; i&amp;lt;N; i++)&lt;br /&gt;
	{&lt;br /&gt;
		//Обнуления меняющегося бита&lt;br /&gt;
		int i0 = i &amp;amp; ~pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Установка меняющегося бита&lt;br /&gt;
		int i1 = i | pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Получение значения меняющегося бита&lt;br /&gt;
		int iq = (i &amp;amp; pow2q) &amp;gt;&amp;gt; shift;&lt;br /&gt;
&lt;br /&gt;
		out[i] = U[iq][0] * in[i0] + U[iq][1] *in[i1];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что существенная часть вычислений и логики кода приходится на битовые операции, однако, этого можно избежать: однокубитное преобразование в большинстве случаев является лишь подпрограммой и применяется к разным кубитам большое число раз. В свою очередь, вычисляемые при помощи битовых операций индексы i0, i1 и iq зависят лишь от параметров количества кубитов n и номера кубита q. Число кубитов обычно фиксировано, соответственно, можно вычислить эти индексы заранее для всех q от 1 до n. Для хранения потребуется лишь массив целочисленных переменных линейного размера 3n в то время, как обрабатываемые данные имеют экспоненциальный размер. Очевидно, что такая оптимизация критически необходима при реализации алгоритма на вычислительных устройствах или языках программирования с отсутствием быстрых битовых операций (примером может служить среда Matlab).&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
К сожалению, в потивовес идельной возможности параллелизации алгоритма, он обладает очень плохой локальностью.&lt;br /&gt;
&lt;br /&gt;
Из математического описания и информационных графов для разных параметров q можно заметить, что при однократном применении однокубитного преобразования легко получить идеальную локальность обращения к данным простой перестановкой кубитов. Так, переместив кубит q на последнее место, мы получим взаимодействие лишь соседних по памяти элемнтов, причем в идеальном последовательном доступе. &lt;br /&gt;
&lt;br /&gt;
Однако, преобразование одного кубита в прикладных задачах является лишь подпрограммой и применяется многократно с различными параметрами q. Как видно из математического описания и Рис. 1-2, это полностью исключает возможность добиться локальности обращений к данным. &lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_1.png|thumb|center|700px|Рисунок 1. Однокубитное преобразование вектора-состояния. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис. 1 представлен профиль обращений в память для вычисления однокубитного преобразования вектора-состояния. Данный профиль состоит из обращений к трем массивам, фрагменты для отдельных массивов выделены на рис. 1 зеленым цветом. Из общего профиля можно увидеть, что обращения редко используются повторно, по крайней мере в случае фрагментов 2 и 3. При этом обращения к близко расположенным друг к другу данным выполняются рядом. Рассмотрим выделенные фрагменты поближе.&lt;br /&gt;
&lt;br /&gt;
Отдельно фрагмент 1 представлен на рис. 2. Видно, что данный массив состоит всего из 4-х элементов, к которым постоянно выполняются обращения. Такой фрагмент обладает очень высокой локальностью, поскольку постоянно переиспользуются запрошенные ранее данные.&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим фрагмент 2 (рис. 3). Здесь все еще проще – выполняется обычный последовательный перебор всех элементов массива. Такой фрагмент обладает высокой пространственной локальностью, однако очень низкой временной (данные просто не используются повторно).&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_2.png|thumb|center|500px|Рисунок 2. Фрагмент 1 (профиль обращений к первому массиву)]]&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_3.png|thumb|center|500px|Рисунок 3. Фрагмент 2 (профиль обращений ко второму массиву)]]&lt;br /&gt;
&lt;br /&gt;
Наиболее интересным представляется фрагмент 3. Его небольшой фрагмент, выделенный на рис. 1 желтым, представлен на рис. 4. Однако при ближайшем рассмотрении оказывается, что данный фрагмент тоже просто устроен, хотя и немного сложнее предыдущих.&lt;br /&gt;
&lt;br /&gt;
В данном случае также виден в центре последовательный перебор всех элементов массива, параллельно с которым выполняются обращения либо к элементам с большим или меньшим виртуальным адресом. Отметим, однако, что эта разница между виртуальными адресами, судя по всему, больше 64 байт (длины строки), что может служить причиной возникновения большого числа кэш-промахов.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_4.png|thumb|center|500px|Рисунок 4. Небольшая часть фрагмента 3, выделенная на рис. 1 желтым]]&lt;br /&gt;
&lt;br /&gt;
В общем можно сказать, что общий профиль обращений в память обладает достаточно высокой пространственной локальностью, поскольку большинство обращений образуют последовательные переборы элементов массивов, однако временная локальность низка – данные практически не используются повторно.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/benchmarks/qubit_evolution/qubit_evolution.h здесь] (функция Kernel). Условия запуска описаны [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность работы с памятью для этой программы высока – значение daps примерно на уровне теста Linpack. Видимо, низкая временная локальность в данном случае компенсируется высокой пространственной локальностью. &lt;br /&gt;
&lt;br /&gt;
[[file:qubit_daps.png|thumb|center|700px|Рисунок 5. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рисунке 6 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, в отличие от daps, cvg оценивает локальность данной программы как достаточно низкую. В частности, значение cvg для Linpack заметно меньше, в то время как значения daps практически совпадали.&lt;br /&gt;
&lt;br /&gt;
Одна из возможных причин этого – влияние арифметических операций. Может получиться, что данные из памяти не будут запрашиваться, пока арифметические операции не будут выполнены; это приводит к простою подсистемы памяти. Соответственно, если в одной программе таких операций нет, а в другой - есть, то daps в первом случае будет выше. При этом cvg не поменяется, поскольку эта оценка не зависит от времени выполнения. &lt;br /&gt;
&lt;br /&gt;
В данном случае арифметических операций практически нет (в отличие от некоторых других программ), поэтому daps может показывать более высокие результаты, в то время как cvg показывает достаточно низкую оценку.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_cvg.png|thumb|center|700px|Рисунок 6. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Основной способ параллельной реализации очевиден - необходимо распараллеливание основного цикла (параллельное вычисление различных компонент выходного вектора-состояния) и, желательно, операций умножения. На машинах с общей памятью такой вариант распараллеливания приводит к ускорению, близкому к максимально-возможному. &lt;br /&gt;
Однако, данный способ сталкивается с проблемами локальности данных. Анализируя математическая описание и информационные графы алгоритма легко видеть, что при использовании большого числа узлов с собственной памятью количество необходимых пересылок между узлами становится сопоставимым с количеством вычислений, что приводит к существенной потере эффективности. Возможны разные пути частичного решения этой проблемы, например, кэширование или использование парадигмы программирования SHMEM, однако, столь сильная нелокальность использования данных всё равно не позволяет получить хорошей эффективности.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
В связи с констатной высотой ярусно-параллельной формы алгоритм имеет отличную масштабируемость на машинах с общей памятью. При реализации на машинах с разделяемой памятью быстро возникают проблемы, связанные с локальностью.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 512] со значениями степени двойки;&lt;br /&gt;
*	число кубитов [16;32] с шагом 2.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0.000003%;&lt;br /&gt;
*	максимальная эффективность реализации 0.008%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Qbit perf.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма. Изменение производительности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
[[file:Qbit eff.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма. Изменение эффективности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3175</id>
		<title>Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3175"/>
		<updated>2015-12-22T12:52:47Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Однокубитное преобразование &amp;lt;br /&amp;gt; вектора-состояния&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;3 \cdot 2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Chernyavskiy|А.Ю.Чернявский]], [[Участник:VadimVV|Вад.В.Воеводин]] ([[#Описание локальности данных и вычислений|раздел 2.2]])&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;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/store/storage/jpvtv20_algebraic_tools.pdf|Кронберг Д. А., Ожигов Ю. И., Чернявский А. Ю. Алгебраический аппарат квантовой информатики.]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[http://sqi.cs.msu.su/files/book_v01.pdf|Корж О. В., Чернявский А. Ю. Практикум по суперкомпьютерным технологиям и квантовым вычислениям 3 курс.]] &amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Preskill J. Lecture notes for physics 229: Quantum information and computation //California Institute of Technology. – 1998.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;Нильсен М., Чанг И. Квантовые вычисления и квантовая информация. – М : Мир, 2006.&amp;lt;/ref&amp;gt;&lt;br /&gt;
Данный алгоритм обычно является подпрограммой и многократно применяется к различным кубитам одного состояния (например при моделировании квантовых алгоритмов или анализе квантовой запутанности). Особенностью алгоритма, как и большинства алгоритмов квантовой инфоорматики, является экспоненциальный рост объема данных в зависимости от основного параметра - числа кубитов, что приводит к необходимости суперкомпьютерной реализации для решения важных практических задач.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#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;k -&amp;lt;/math&amp;gt; номер кубита, над которым производится преобразование.&lt;br /&gt;
&lt;br /&gt;
Комплексная матрица &amp;lt;math&amp;gt;U = \begin{pmatrix}&lt;br /&gt;
u_{00} &amp;amp; u_{01}\\ &lt;br /&gt;
u_{10} &amp;amp; u_{11}&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; однокубитного преобразования  размера &amp;lt;math&amp;gt;2 \times 2.&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Комплексный вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; задающей начальное состояние многокубитной системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; комплексный вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;2^n,&amp;lt;/math&amp;gt; соответствующий состоянию после преобразования.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Состояние после действия преобразования &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;k-&amp;lt;/math&amp;gt;й кубит имеет вид &amp;lt;math&amp;gt;v_{out} = I_{2^{k-1}}\otimes U \otimes I_{2^{n-k}},&amp;lt;/math&amp;gt; где &amp;lt;math&amp;gt;I_{j} - &amp;lt;/math&amp;gt; единичная матрица размерности &amp;lt;math&amp;gt;j,&amp;lt;/math&amp;gt; а &amp;lt;math&amp;gt;\otimes - &amp;lt;/math&amp;gt; тензорное произведение (произведение Кронекера).&lt;br /&gt;
&lt;br /&gt;
Однако, элементы итогового вектора можно записать и в прямом виде, что более удобно для вычислений: &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
w_{i_1i_2\ldots i_k \ldots i_n} = \sum\limits_{j_k=0}^1 u_{i_k j} v_{i_1i_2\ldots j_k \ldots i_n} = u_{i_k 0} v_{i_1i_2\ldots 0_k \ldots i_n} + u_{i_k 1} v_{i_1i_2\ldots 1_k \ldots i_n}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Индекс-кортеж &amp;lt;math&amp;gt;i_1i_2\ldots i_n&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;2^n&amp;lt;/math&amp;gt; элементов вектора &amp;lt;math&amp;gt;w.&amp;lt;/math&amp;gt; Вычисление каждого элемента требует две операции умножения и одну операцию сложения. Кроме того необходимо вычислять индексы типа &amp;lt;math&amp;gt;i_1i_2\ldots 0_k \ldots i_n,&amp;lt;/math&amp;gt; а также значение бита &amp;lt;math&amp;gt;i_k,&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;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить элемент &amp;lt;math&amp;gt;i_k&amp;lt;/math&amp;gt; двоичного представления индекса &amp;lt;math&amp;gt;i.&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычислить индексы &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; имеющие двоичные представления &amp;lt;math&amp;gt;i_1i_2\ldots \overline{i_k} \ldots i_n,&amp;lt;/math&amp;gt; где крышка означает обращение бита.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;w_i = u_{i_k i_k}\cdot v_{i} + u_{i_k \overline{i_k}}\cdot v_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует:&lt;br /&gt;
# &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; операций умножения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций сложения комплексных чисел;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций получения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа;&lt;br /&gt;
# &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; операций изменения значения &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-го бита числа.&lt;br /&gt;
Отметим, что данный алгоритм обычно применяется много раз подряд, в связи с чем вычисления, связанные с побитовыми операциями (3-4), могут единожды проводиться в начале алгоритма. Кроме того, от них можно избавиться, пользуясь сложением и логическим умножением с числом &amp;lt;math&amp;gt;2^k,&amp;lt;/math&amp;gt; которое сохраняется для всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Представим рисунки графов алгоритма для случая &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; (рис.1) и &amp;lt;math&amp;gt;k=2&amp;lt;/math&amp;gt; (рис.2). На графах не представлены матрицы преобразования &amp;lt;math&amp;gt;U,&amp;lt;/math&amp;gt; в связи с тем, что их размер при больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; много меньше, нежели размеры входного и выходного векторов. На Рис.3 изображена основная операция, представляемая на Рис.1 и Рис.2 оранжевым. &lt;br /&gt;
&lt;br /&gt;
Отображение графа со входными и выходными данных, а также &amp;quot;свёрнутой&amp;quot; тройной операцией удобно для понимания локальности обращений к памяти.&lt;br /&gt;
Отметим, что структура графа (а именно обращение к входным данным) сильно зависит от параметра &amp;lt;math&amp;gt;k.&amp;lt;/math&amp;gt;&lt;br /&gt;
[[file:OneQubitVectorTransform1.png|thumb|center|800px|Рисунок 1. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=1&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:OneQubitVectorTransform.png|thumb|center|800px|Рисунок 2. Граф алгоритма для &amp;lt;math&amp;gt;n=3, k=2&amp;lt;/math&amp;gt; без отображения матрицы преобразования &amp;lt;math&amp;gt;U.&amp;lt;/math&amp;gt; ]]&lt;br /&gt;
[[file:q_operation.png|thumb|center|300px|Рисунок 3. Граф основной операции.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из информационного графа, прямой алгоритм моделирования однокубитного преобразования обладает высочайшей степенью параллелизма. Все операции вычисления элементов нового вектора-состояния могут быть произведены параллельно. Для вычисления одного элемента необходимо выполнить две операции умножения и одну операцию сложения, операции умножения, в свою очередь, также могут быть выполнены параллельно.&lt;br /&gt;
Таким образом, необходимо выполнение двух ярусов: одного, состоящего из &amp;lt;math&amp;gt;2^{n+1}&amp;lt;/math&amp;gt; умножений и другого, состоящего из &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n.&amp;lt;/math&amp;gt; Обычно нормирован на единицу.&lt;br /&gt;
* Унитарная матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Номер кубита &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039;&lt;br /&gt;
* Комплексный вектор состояния &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n+4&amp;lt;/math&amp;gt; комплексных чисел и &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; целочисленный параметр.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; комплексных чисел.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложности является &#039;&#039;экспоненциальным&#039;&#039; (эксмпонента переходит в константу).&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – &#039;&#039;константа&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
На языке C функцию однокубитного преобразования можно записать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void OneQubitEvolution(complexd *in, complexd *out, complexd U[2][2], int nqubits, int q)&lt;br /&gt;
{&lt;br /&gt;
	//n - число кубитов&lt;br /&gt;
        //q - номер кубита для преобразования&lt;br /&gt;
&lt;br /&gt;
	int shift = nqubits-q;&lt;br /&gt;
	//Все биты нулевые, кроме соответствующего позиции преобразуемого кубита  &lt;br /&gt;
	int pow2q=1&amp;lt;&amp;lt;(shift);&lt;br /&gt;
&lt;br /&gt;
	int N=1&amp;lt;&amp;lt;nqubits;&lt;br /&gt;
	for	(int i=0; i&amp;lt;N; i++)&lt;br /&gt;
	{&lt;br /&gt;
		//Обнуления меняющегося бита&lt;br /&gt;
		int i0 = i &amp;amp; ~pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Установка меняющегося бита&lt;br /&gt;
		int i1 = i | pow2q;&lt;br /&gt;
		&lt;br /&gt;
		//Получение значения меняющегося бита&lt;br /&gt;
		int iq = (i &amp;amp; pow2q) &amp;gt;&amp;gt; shift;&lt;br /&gt;
&lt;br /&gt;
		out[i] = U[iq][0] * in[i0] + U[iq][1] *in[i1];&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Отметим, что существенная часть вычислений и логики кода приходится на битовые операции, однако, этого можно избежать: однокубитное преобразование в большинстве случаев является лишь подпрограммой и применяется к разным кубитам большое число раз. В свою очередь, вычисляемые при помощи битовых операций индексы i0, i1 и iq зависят лишь от параметров количества кубитов n и номера кубита q. Число кубитов обычно фиксировано, соответственно, можно вычислить эти индексы заранее для всех q от 1 до n. Для хранения потребуется лишь массив целочисленных переменных линейного размера 3n в то время, как обрабатываемые данные имеют экспоненциальный размер. Очевидно, что такая оптимизация критически необходима при реализации алгоритма на вычислительных устройствах или языках программирования с отсутствием быстрых битовых операций (примером может служить среда Matlab).&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
К сожалению, в потивовес идельной возможности параллелизации алгоритма, он обладает очень плохой локальностью.&lt;br /&gt;
&lt;br /&gt;
Из математического описания и информационных графов для разных параметров q можно заметить, что при однократном применении однокубитного преобразования легко получить идеальную локальность обращения к данным простой перестановкой кубитов. Так, переместив кубит q на последнее место, мы получим взаимодействие лишь соседних по памяти элемнтов, причем в идеальном последовательном доступе. &lt;br /&gt;
&lt;br /&gt;
Однако, преобразование одного кубита в прикладных задачах является лишь подпрограммой и применяется многократно с различными параметрами q. Как видно из математического описания и Рис. 1-2, это полностью исключает возможность добиться локальности обращений к данным. &lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_1.png|thumb|center|700px|Рисунок 1. Однокубитное преобразование вектора-состояния. Общий профиль обращений в память]]&lt;br /&gt;
&lt;br /&gt;
На рис. 1 представлен профиль обращений в память для вычисления однокубитного преобразования вектора-состояния. Данный профиль состоит из обращений к трем массивам, фрагменты для отдельных массивов выделены на рис. 1 зеленым цветом. Из общего профиля можно увидеть, что обращения редко используются повторно, по крайней мере в случае фрагментов 2 и 3. При этом обращения к близко расположенным друг к другу данным выполняются рядом. Рассмотрим выделенные фрагменты поближе.&lt;br /&gt;
&lt;br /&gt;
Отдельно фрагмент 1 представлен на рис. 2. Видно, что данный массив состоит всего из 4-х элементов, к которым постоянно выполняются обращения. Такой фрагмент обладает очень высокой локальностью, поскольку постоянно переиспользуются запрошенные ранее данные.&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим фрагмент 2 (рис. 3). Здесь все еще проще – выполняется обычный последовательный перебор всех элементов массива. Такой фрагмент обладает высокой пространственной локальностью, однако очень низкой временной (данные просто не используются повторно).&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_2.png|thumb|center|500px|Рисунок 2. Фрагмент 1 (профиль обращений к первому массиву)]]&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_3.png|thumb|center|500px|Рисунок 3. Фрагмент 2 (профиль обращений ко второму массиву)]]&lt;br /&gt;
&lt;br /&gt;
Наиболее интересным представляется фрагмент 3. Его небольшой фрагмент, выделенный на рис. 1 желтым, представлен на рис. 4. Однако при ближайшем рассмотрении оказывается, что данный фрагмент тоже просто устроен, хотя и немного сложнее предыдущих.&lt;br /&gt;
&lt;br /&gt;
В данном случае также виден в центре последовательный перебор всех элементов массива, параллельно с которым выполняются обращения либо к элементам с большим или меньшим виртуальным адресом. Отметим, однако, что эта разница между виртуальными адресами, судя по всему, больше 64 байт (длины строки), что может служить причиной возникновения большого числа кэш-промахов.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_4.png|thumb|center|500px|Рисунок 4. Небольшая часть фрагмента 3, выделенная на рис. 1 желтым]]&lt;br /&gt;
&lt;br /&gt;
В общем можно сказать, что общий профиль обращений в память обладает достаточно высокой пространственной локальностью, поскольку большинство обращений образуют последовательные переборы элементов массивов, однако временная локальность низка – данные практически не используются повторно.&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
Основной фрагмент реализации, на основе которого были получены количественные оценки, приведен [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/benchmarks/qubit_evolution/qubit_evolution.h здесь] (функция Kernel). Условия запуска описаны [http://git.parallel.ru/shvets.pavel.srcc/locality/blob/master/README.md здесь].&lt;br /&gt;
&lt;br /&gt;
Первая оценка выполняется на основе характеристики daps, которая оценивает число выполненных обращений (чтений и записей) в память в секунду. Данная характеристика является аналогом оценки flops применительно к работе с памятью и является в большей степени оценкой производительности взаимодействия с памятью, чем оценкой локальности. Однако она служит хорошим источником информации, в том числе для сравнения с результатами по следующей характеристике cvg.&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 приведены значения daps для реализаций распространенных алгоритмов, отсортированные по возрастанию (чем больше daps, тем в общем случае выше производительность). Можно увидеть, что производительность работы с памятью для этой программы высока – значение daps примерно на уровне теста Linpack. Видимо, низкая временная локальность в данном случае компенсируется высокой пространственной локальностью. &lt;br /&gt;
&lt;br /&gt;
[[file:qubit_daps.png|thumb|center|700px|Рисунок 5. Сравнение значений оценки daps]]&lt;br /&gt;
&lt;br /&gt;
Вторая характеристика – cvg – предназначена для получения более машинно-независимой оценки локальности. Она определяет, насколько часто в программе необходимо подтягивать данные в кэш-память. Соответственно, чем меньше значение cvg, тем реже это нужно делать, тем лучше локальность. &lt;br /&gt;
&lt;br /&gt;
На рисунке 6 приведены значения cvg для того же набора реализаций, отсортированные по убыванию (чем меньше cvg, тем в общем случае выше локальность). Можно увидеть, что, в отличие от daps, cvg оценивает локальность данной программы как достаточно низкую. В частности, значение cvg для Linpack заметно меньше, в то время как значения daps практически совпадали.&lt;br /&gt;
&lt;br /&gt;
Одна из возможных причин этого – влияние арифметических операций. Может получиться, что данные из памяти не будут запрашиваться, пока арифметические операции не будут выполнены; это приводит к простою подсистемы памяти. Соответственно, если в одной программе таких операций нет, а в другой - есть, то daps в первом случае будет выше. При этом cvg не поменяется, поскольку эта оценка не зависит от времени выполнения. &lt;br /&gt;
&lt;br /&gt;
В данном случае арифметических операций практически нет (в отличие от некоторых других программ), поэтому daps может показывать более высокие результаты, в то время как cvg показывает достаточно низкую оценку.&lt;br /&gt;
&lt;br /&gt;
[[file:qubit_cvg.png|thumb|center|700px|Рисунок 6. Сравнение значений оценки cvg]]&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
Основной способ параллельной реализации очевиден - необходимо распараллеливание основного цикла (параллельное вычисление различных компонент выходного вектора-состояния) и, желательно, операций умножения. На машинах с общей памятью такой вариант распараллеливания приводит к ускорению, близкому к максимально-возможному. &lt;br /&gt;
Однако, данный способ сталкивается с проблемами локальности данных. Анализируя математическая описание и информационные графы алгоритма легко видеть, что при использовании большого числа узлов с собственной памятью количество необходимых пересылок между узлами становится сопоставимым с количеством вычислений, что приводит к существенной потере эффективности. Возможны разные пути частичного решения этой проблемы, например, кэширование или использование парадигмы программирования SHMEM, однако, столь сильная нелокальность использования данных всё равно не позволяет получить хорошей эффективности.&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
В связи с констатной высотой ярусно-параллельной формы алгоритм имеет отличную масштабируемость на машинах с общей памятью. При реализации на машинах с разделяемой памятью быстро возникают проблемы, связанные с локальностью.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 512] со значениями степени двойки;&lt;br /&gt;
*	число кубитов [16;32] с шагом 2.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0.000003%;&lt;br /&gt;
*	максимальная эффективность реализации 0.008%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Qbit perf.png|thumb|center|700px|Рисунок 7. Параллельная реализация алгоритма. Изменение производительности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
[[file:Qbit eff.png|thumb|center|700px|Рисунок 8. Параллельная реализация алгоритма. Изменение эффективности в зависимости от числа процессоров и числа кубитов.]]&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&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;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Статьи в работе]]&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3174</id>
		<title>Обсуждение:Однокубитное преобразование вектора-состояния</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9E%D0%B4%D0%BD%D0%BE%D0%BA%D1%83%D0%B1%D0%B8%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B0-%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F&amp;diff=3174"/>
		<updated>2015-12-22T12:52:06Z</updated>

		<summary type="html">&lt;p&gt;Sander: Новая страница: «Ссылки на литературу в однокубитном преобразовании не работают»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ссылки на литературу в однокубитном преобразовании не работают&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sander&amp;diff=1377</id>
		<title>Участник:Sander</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sander&amp;diff=1377"/>
		<updated>2015-03-27T09:02:10Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://istina.msu.ru/profile/Sander/ Смирнов Александр Владимирович], д.ф.-м.н, вед.н.с. лаборатории Информационных систем математических наук Научно-исследовательского вычислительного центра Московского государственного университета имени М.В.Ломоносова&lt;/div&gt;</summary>
		<author><name>Sander</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=935</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=935"/>
		<updated>2015-02-09T14:56:42Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Векторные операции ==&lt;br /&gt;
&lt;br /&gt;
# [[Суммирование сдваиванием]]&lt;br /&gt;
# [[Равномерная норма вектора, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# [[Последовательно-параллельный метод суммирования]]&lt;br /&gt;
&lt;br /&gt;
== Умножение матрицы на вектор ==&lt;br /&gt;
&lt;br /&gt;
# [[Умножение плотной матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Матричные операции ==&lt;br /&gt;
&lt;br /&gt;
# [[Умножение плотных матриц]]&lt;br /&gt;
&lt;br /&gt;
== Разложения матриц == &lt;br /&gt;
&lt;br /&gt;
=== Треугольные разложения ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Холецкого (нахождение симметричного треугольного разложения)]]&lt;br /&gt;
&lt;br /&gt;
=== Унитарно-треугольные разложения ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Гивенса (вращений) QR-разложения матрицы]]&lt;br /&gt;
# [[Метод Хаусхолдера (отражений) QR-разложения матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Разложения на унитарные и хессенберговы матрицы ===&lt;br /&gt;
&lt;br /&gt;
# [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
=== Разложения на унитарные и диагональные матрицы ===&lt;br /&gt;
&lt;br /&gt;
# [[Спектральное разложение (нахождение собственных значений и векторов)]]&lt;br /&gt;
# [[Сингулярное разложение (нахождение сингулярных значений и векторов)]]&lt;br /&gt;
&lt;br /&gt;
== Решение систем линейных уравнений ==&lt;br /&gt;
&lt;br /&gt;
# [[High Performance Conjugate Gradient (HPCG) benchmark]]&lt;br /&gt;
# [[Linpack benchmark]]&lt;br /&gt;
# [[Метод Гаусса решения СЛАУ (прямой ход)]]&lt;br /&gt;
# [[Метод Гаусса решения СЛАУ (обратный ход)]]&lt;br /&gt;
&lt;br /&gt;
== Тесты производительности компьютеров ==&lt;br /&gt;
&lt;br /&gt;
# [[High Performance Conjugate Gradient (HPCG) benchmark]]&lt;br /&gt;
# [[Linpack benchmark]]&lt;br /&gt;
&lt;br /&gt;
== Преобразование Фурье ==&lt;br /&gt;
&lt;br /&gt;
# [[Быстрое преобразование Фурье для степеней двойки]]&lt;br /&gt;
&lt;br /&gt;
== Численные методы интегрирования ==&lt;br /&gt;
&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод прямоугольников]]&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод трапеций]]&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод парабол (метод Симпсона)]]&lt;br /&gt;
# [[Квадратурные_(кубатурные)_методы_численного_интегрирования_по_отрезку_(многомерному_кубу)#Математическое описание|Метод Гаусса]]&lt;br /&gt;
&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;O(log(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;
== Вычислительная геометрия ==&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;O(n_1 + n_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Пересечение звёздных многоугольников]] - трудоёмкость &amp;lt;math&amp;gt;O(n_1 * n_2)&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;
# [[Генетические алгоритмы]]&lt;br /&gt;
# [[Муравьиные алгоритмы]]&lt;br /&gt;
# [[Комбинированные алгоритмы]]&lt;br /&gt;
# [[Нахождение экстремума функции]]&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы теории игр ==&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:Algorithm classification]]&lt;/div&gt;</summary>
		<author><name>Sander</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=886</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=886"/>
		<updated>2015-01-23T18:15:15Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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|700px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&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|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&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;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&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;/div&gt;</summary>
		<author><name>Sander</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=817</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=817"/>
		<updated>2014-12-03T21:02:18Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Описание ресурса параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&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|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&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;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=815</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=815"/>
		<updated>2014-12-03T21:01:31Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&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|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&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;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C_2.svg&amp;diff=814</id>
		<title>Файл:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C_2.svg&amp;diff=814"/>
		<updated>2014-12-03T21:00:36Z</updated>

		<summary type="html">&lt;p&gt;Sander: Sander загружена новая версия «Файл:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</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=813</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=813"/>
		<updated>2014-12-03T20:59:33Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&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 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|Рисунок 3. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и времени вычисления функции.]]&lt;br /&gt;
&lt;br /&gt;
Данный эксперимент показывает, что действительно при малом времени вычисления функции в одной точке эффективность алгоритма резко падает (до 2.02% в некоторых случаях). Это объясняется тем, что накладные расходы на организацию MPI-вычислений начинают доминировать. Однако при времени вычисления функции превышающим &amp;lt;math&amp;gt;3 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;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C_2.svg&amp;diff=812</id>
		<title>Файл:Масштабируемость численного интегрирования методом прямоугольников. Эффективность 2.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C_2.svg&amp;diff=812"/>
		<updated>2014-12-03T20:51:27Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</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=811</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=811"/>
		<updated>2014-12-03T20:51:09Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&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 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|Рисунок 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;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=810</id>
		<title>Файл:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=810"/>
		<updated>2014-12-03T20:46:29Z</updated>

		<summary type="html">&lt;p&gt;Sander: Sander загружена новая версия «Файл:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=809</id>
		<title>Файл:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=809"/>
		<updated>2014-12-03T20:45:37Z</updated>

		<summary type="html">&lt;p&gt;Sander: Sander загружена новая версия «Файл:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</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=800</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=800"/>
		<updated>2014-12-03T16:49:01Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Динамические характеристики и эффективность реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае эффективность реализации стремится к единице. А поскольку в реальных примерах сложно представить, чтобы количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, идеально масштабируем.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Так как мы рассматриваем вычисление функции как абстрактно устроенную и неизвестную нам процедуру, то представляется невозможным прокомментировать эффективность работы алгоритма с памятью или иные близкие характеристики. Как показали результаты предыдущего параграфа, алгоритм проявляет себя крайне эффективно в случае, когда количество вычисляемых точек становится существенно больше числа задействованных процессоров, а время вычисления функции не меньше одной сотой секунды. Соответственно представляет интерес зафиксировать количество вычисляемых точек (например, числом 10000) и изучить зависимость эффективности от числа процессоров (как и ранее, до 64 с шагом 8) и времени вычисления функции в одной точке (от ??????????)&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=799</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=799"/>
		<updated>2014-12-03T10:23:08Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
При полученных данных не представляется осмысленным выводить средние оценки изменения эффективности по тем или иным осям. Эффективность задачи существенно зависит от того, превышает ли количество вычисляемых точек количество процессоров (хотя бы на порядок). В таком случае эффективность реализации стремится к единице. А поскольку в реальных примерах сложно представить, чтобы количество используемых процессоров могло сравняться с количеством вычисляемых точек, делается вывод, что алгоритм, как и предполагалось согласно теоретическим оценкам, идеально масштабируем.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=798</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=798"/>
		<updated>2014-12-03T10:13:41Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=797</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=797"/>
		<updated>2014-12-03T10:11:16Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|600px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=796</id>
		<title>Файл:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=796"/>
		<updated>2014-12-03T10:10:17Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=795</id>
		<title>Файл:Масштабируемость численного интегрирования методом прямоугольников. Производительность.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_%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%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2._%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C.svg&amp;diff=795"/>
		<updated>2014-12-03T10:09:53Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</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=794</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=794"/>
		<updated>2014-12-03T10:09:28Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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|680px|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.svg|thumb|center|680px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=793</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=793"/>
		<updated>2014-12-03T10:09:05Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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:Масштабируемость численного интегрирования методом прямоугольников. Производительность.png|thumb|center|680px|Рисунок 1. Параллельная реализация интегрирования методом прямоугольников. Изменение производительности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
[[file:Масштабируемость численного интегрирования методом прямоугольников. Эффективность.png|thumb|center|680px|Рисунок 2. Параллельная реализация интегрирования методом прямоугольников. Изменение эффективности в зависимости от числа процессоров и количества вычисляемых точек.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=762</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=762"/>
		<updated>2014-11-26T13:02:48Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|640px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=761</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=761"/>
		<updated>2014-11-26T13:01:04Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|600px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=760</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=760"/>
		<updated>2014-11-26T13:00:41Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|400px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=759</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=759"/>
		<updated>2014-11-26T13:00:24Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg|center|thumb|800px|Квадратурные (кубатурные) методы численного интегрирования по отрезку (многомерному кубу)]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=758</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=758"/>
		<updated>2014-11-26T12:59:23Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.svg]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cubature.svg&amp;diff=757</id>
		<title>Файл:Cubature.svg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Cubature.svg&amp;diff=757"/>
		<updated>2014-11-26T12:58:50Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sander</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=756</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=756"/>
		<updated>2014-11-26T12:57:31Z</updated>

		<summary type="html">&lt;p&gt;Sander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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.jpg]]&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=755</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=755"/>
		<updated>2014-11-26T09:53:36Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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 при запуске на одном узле, так и, например, при помощи MPI. Головной узел передает определение функции &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;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;????? нам нужна модельная реализация?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Интерес представляет случай, когда алгоритм вычисления функции может быть адаптирован для одновременного вычисления в большом количестве точек. Например если функция является рациональной, то алгоритм может быть представлен как серия операций сложения, умножения и тому подобных над массивами чисел. &lt;br /&gt;
&lt;br /&gt;
В таком случае возможна реализация, в которой данные операции выполняются на графическом процессоре, что может приводить к существенному ускорению работы кода по сравнению с исполняющимся на обычных процессорах.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существующие библиотеки, осуществляющие интегрирование, обычно не используют алгоритм, описанный в данной статье, в чистом виде. Ввиду того, что функция может быть близкой к константе в части области интегрирования и существенно изменяться в другой части, намного эффективней оказываются так называемые адаптивные алгоритмы, в которых точки для вычисления функции располагаются не равномерно по области интегрирования, а добавляются постепенно на основании предыдущих вычислений. Кроме того, для многомерного интегрирования кубатурные правила становятся зачастую неэффективными, и требуется дробить не каждую ось в отдельности, а распределять точки случайным образом по области интегрирования. Такие подходы имеют относятся к классу методов Монте-Карло.&lt;/div&gt;</summary>
		<author><name>Sander</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=754</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=754"/>
		<updated>2014-11-26T08:50:07Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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;/div&gt;</summary>
		<author><name>Sander</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=753</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=753"/>
		<updated>2014-11-26T08:34:39Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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;/div&gt;</summary>
		<author><name>Sander</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=752</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=752"/>
		<updated>2014-11-26T08:31:52Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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;/div&gt;</summary>
		<author><name>Sander</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=751</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=751"/>
		<updated>2014-11-26T08:28:18Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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;/div&gt;</summary>
		<author><name>Sander</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=750</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=750"/>
		<updated>2014-11-26T08:18:13Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&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;
В общем случае время, затрачиваемое на сложение или умножение пренебрежимо мало по сравнением со временем необходимым на вычисление функции &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;/div&gt;</summary>
		<author><name>Sander</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=749</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=749"/>
		<updated>2014-11-26T08:14:52Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;
&#039;&#039;&#039;НА ЧЕМ ДЕЛАЕТСЯЯ РИСУНОК???????&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Sander</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=748</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=748"/>
		<updated>2014-11-26T08:13:24Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;t*M&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;/div&gt;</summary>
		<author><name>Sander</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=747</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=747"/>
		<updated>2014-11-26T08:10:39Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;/div&gt;</summary>
		<author><name>Sander</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=746</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=746"/>
		<updated>2014-11-26T08:08:14Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … 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;/div&gt;</summary>
		<author><name>Sander</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=745</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=745"/>
		<updated>2014-11-26T08:06:15Z</updated>

		<summary type="html">&lt;p&gt;Sander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Так или иначе, на подготовительной стадии определяется M наборов координат &amp;lt;math&amp;gt;{x_{1,i}, … 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;с_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}, … x_{n,i}) &amp;lt;/math&amp;gt;&lt;br /&gt;
Поскольку время, требуемое на операции сложения и умножения в реальных примерах представляют собой о малое от времени, затрачиваемого на вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;, для производительности становится совершенно неважно, каким способом осуществлять сложение и умножение.&lt;/div&gt;</summary>
		<author><name>Sander</name></author>
	</entry>
</feed>