<?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=Greno4ka</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=Greno4ka"/>
	<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/Greno4ka"/>
	<updated>2026-10-22T16:46:00Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=22129</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=22129"/>
		<updated>2017-02-04T13:11:37Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]](п. 1.6-1.10, 2.4, 2.7) [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]](п. 1.1-1.6)&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный. Сначала значение текущего отрезка равно общему отрезку интегрирования. На каждой итерации выполняются следующие действия: &amp;lt;br&amp;gt;&lt;br /&gt;
- На текущем отрезке считается приближенное значение интеграла &amp;lt;br&amp;gt;&lt;br /&gt;
- Текущий отрезок делится пополам, и на получившихся отрезках высчитываются интегралы &amp;lt;br&amp;gt;&lt;br /&gt;
- Сравнивается интеграл на всём отрезке с суммой двух интегралов на половинах. Если достигнута заданная точность, то: &amp;lt;br&amp;gt;&lt;br /&gt;
# Добавить значение интеграла текущего отрезка к общему интегралу &amp;lt;br&amp;gt;&lt;br /&gt;
# Если стек пуст, то завершить алгоритм &amp;lt;br&amp;gt;&lt;br /&gt;
# Иначе достать из стека отрезок и присвоить его значение текущему отрезку. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Иначе &amp;lt;br&amp;gt;&lt;br /&gt;
# Одну половину отрезка положить в стек &amp;lt;br&amp;gt;&lt;br /&gt;
# Текущему отрезку присвоить значение второй половины &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;с++&amp;quot;&amp;gt;&lt;br /&gt;
struct SumRecord {&lt;br /&gt;
	double A;&lt;br /&gt;
	double fA;&lt;br /&gt;
	double B;&lt;br /&gt;
	double fB;&lt;br /&gt;
	double s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double JLS(double A, double B) {&lt;br /&gt;
	stack&amp;lt;SumRecord&amp;gt; localStack;&lt;br /&gt;
	SumRecord tmpRecordAB;&lt;br /&gt;
&lt;br /&gt;
	double J = 0;&lt;br /&gt;
	double fA = f(A);&lt;br /&gt;
	double fB = f(B);&lt;br /&gt;
	double sAB = (fA + fB) * (B - A) / 2.;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		double C = (A + B) / 2.;&lt;br /&gt;
&lt;br /&gt;
		double fC = f(C);&lt;br /&gt;
		double sAC = (fA + fC) * (C - A) / 2.;&lt;br /&gt;
		double sCB = (fC + fB) * (B - C) / 2.;&lt;br /&gt;
		double sACB = sAC + sCB;&lt;br /&gt;
		if (abs(sAB - sACB) &amp;gt;= eps * abs(sACB)) {&lt;br /&gt;
			SumRecord tmpRecordAC = { A, fA, C, fC, sAC };&lt;br /&gt;
			localStack.push(tmpRecordAC);&lt;br /&gt;
			A = C;&lt;br /&gt;
			fA=fC;&lt;br /&gt;
			sAB = sCB;&lt;br /&gt;
		} else {&lt;br /&gt;
			J += sACB;&lt;br /&gt;
			if (localStack.empty())&lt;br /&gt;
				break;&lt;br /&gt;
			else {&lt;br /&gt;
				tmpRecordAB = localStack.top();&lt;br /&gt;
				A = tmpRecordAB.A;&lt;br /&gt;
				fA = tmpRecordAB.fA;&lt;br /&gt;
				B = tmpRecordAB.B;&lt;br /&gt;
				fB = tmpRecordAB.fB;&lt;br /&gt;
				sAB = tmpRecordAB.s;&lt;br /&gt;
				localStack.pop();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return J;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Оценить аналитически последовательную сложность представленного алгоритма невозможно, поскольку нельзя указать количество разбиений отрезка интегрирования для каждой отдельно взятой функции, оно зависит от свойств конкретно взятой функции.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма используется только локальный стек, в который помещаются отрезки, перед очередным этапом деления отрезка. Таким алгоритм чем-то похож на алгоритм рекурсивного деления, только без прямого использования рекурсии. Отрезок делится до тех пор, пока не будет достигнута необходимая точность, вторая половина отрезка будет помещаться в локальный стек на каждом этапе деления. После достижения нужной точности, первым будет исследован последний добавленный отрезок, то есть соответствующий второй половине отрезка, разделённого на предыдущем этапе. Следующий рисунок содержит блок-схему данного алгоритма. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&amp;lt;br&amp;gt;&lt;br /&gt;
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;br /&gt;
&lt;br /&gt;
Вариант реализации параллельного алгоритма представлен ниже.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;с++&amp;quot;&amp;gt;&lt;br /&gt;
sem_t semGlobalSum, semGlobalStack, semTaskPresent;&lt;br /&gt;
&lt;br /&gt;
int numberOfActiveProcs = 0;&lt;br /&gt;
unsigned int maxGSelements = 10, maxLSelements = 5;&lt;br /&gt;
double integral = 0;&lt;br /&gt;
stack&amp;lt;SumRecord&amp;gt; globalStack;&lt;br /&gt;
&lt;br /&gt;
void *JLS_thr(void *processNumber) {&lt;br /&gt;
	stack&amp;lt;SumRecord&amp;gt; localStack;&lt;br /&gt;
	double J = 0;&lt;br /&gt;
	int pN = *((int*)(&amp;amp;processNumber));&lt;br /&gt;
	&lt;br /&gt;
	while (1) {&lt;br /&gt;
		sem_wait(&amp;amp;semTaskPresent);&lt;br /&gt;
		sem_wait(&amp;amp;semGlobalStack);&lt;br /&gt;
&lt;br /&gt;
		SumRecord tmpRecordAB = globalStack.top();&lt;br /&gt;
		double A = tmpRecordAB.A;&lt;br /&gt;
		double fA = tmpRecordAB.fA;&lt;br /&gt;
		double B = tmpRecordAB.B;&lt;br /&gt;
		double fB = tmpRecordAB.fB;	&lt;br /&gt;
		double sAB = tmpRecordAB.s;&lt;br /&gt;
		globalStack.pop();&lt;br /&gt;
&lt;br /&gt;
		if (!globalStack.empty())&lt;br /&gt;
			sem_post(&amp;amp;semTaskPresent);&lt;br /&gt;
		if (A &amp;lt;= B)&lt;br /&gt;
			numberOfActiveProcs++;&lt;br /&gt;
			sem_post(&amp;amp;semGlobalStack);&lt;br /&gt;
		if (A &amp;gt; B) break;		&lt;br /&gt;
&lt;br /&gt;
		while (1) {&lt;br /&gt;
			double C = (A + B) / 2;&lt;br /&gt;
			double fC = f(C);&lt;br /&gt;
			double sAC = (fA + fC) * (C - A) / 2;&lt;br /&gt;
			double sCB = (fC + fB) * (B - C) / 2;&lt;br /&gt;
			double sACB = sAC + sCB;&lt;br /&gt;
			if (abs(sAB - sACB) &amp;lt; eps * abs(sACB)) {&lt;br /&gt;
				J += sACB;&lt;br /&gt;
	&lt;br /&gt;
				if (localStack.empty())&lt;br /&gt;
					break;&lt;br /&gt;
				else {&lt;br /&gt;
					tmpRecordAB = localStack.top();&lt;br /&gt;
					A = tmpRecordAB.A;&lt;br /&gt;
					fA = tmpRecordAB.fA;&lt;br /&gt;
					B = tmpRecordAB.B;&lt;br /&gt;
					fB = tmpRecordAB.fB;&lt;br /&gt;
					sAB = tmpRecordAB.s;&lt;br /&gt;
					localStack.pop();&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				SumRecord tmpRecordAC = { A, fA, C, fC, sAC };&lt;br /&gt;
				localStack.push(tmpRecordAC);&lt;br /&gt;
				A = C;&lt;br /&gt;
				fA=fC;&lt;br /&gt;
				sAB = sCB;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ((localStack.size() &amp;gt; maxLSelements) &amp;amp;&amp;amp; &lt;br /&gt;
				(globalStack.empty())) {&lt;br /&gt;
				sem_wait(&amp;amp;semGlobalStack);&lt;br /&gt;
				if (globalStack.empty()) {&lt;br /&gt;
					sem_post(&amp;amp;semTaskPresent);&lt;br /&gt;
				}&lt;br /&gt;
				while ((localStack.size() &amp;gt; 1)&lt;br /&gt;
						&amp;amp;&amp;amp; (globalStack.size() &amp;lt; maxGSelements)) {&lt;br /&gt;
					SumRecord tmpRecord = localStack.top();&lt;br /&gt;
					localStack.pop();&lt;br /&gt;
					globalStack.push(tmpRecord);&lt;br /&gt;
				}&lt;br /&gt;
				sem_post(&amp;amp;semGlobalStack);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		sem_wait(&amp;amp;semGlobalStack);&lt;br /&gt;
		numberOfActiveProcs--;&lt;br /&gt;
		if ((!numberOfActiveProcs) &amp;amp;&amp;amp; (globalStack.empty())) {&lt;br /&gt;
			for (int i = 0; i &amp;lt; nproc; i++) {&lt;br /&gt;
				SumRecord terminalRecord = { 2, 1, 0 };&lt;br /&gt;
				globalStack.push(terminalRecord);&lt;br /&gt;
			}&lt;br /&gt;
			sem_post(&amp;amp;semTaskPresent);&lt;br /&gt;
		}&lt;br /&gt;
		sem_post(&amp;amp;semGlobalStack);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sem_wait(&amp;amp;semGlobalSum);&lt;br /&gt;
	integral += J;&lt;br /&gt;
	sem_post(&amp;amp;semGlobalSum);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pthread_t *thread;&lt;br /&gt;
&lt;br /&gt;
typedef void *ThrSub(void *);&lt;br /&gt;
&lt;br /&gt;
void StartThrTask(int NumberOfProcs, ThrSub *thrFunc) {&lt;br /&gt;
	thread = (pthread_t *) malloc(NumberOfProcs * sizeof(pthread_t));&lt;br /&gt;
&lt;br /&gt;
	for (int i = 0; i &amp;lt; NumberOfProcs; i++)&lt;br /&gt;
		pthread_create(&amp;amp;(thread[i]), NULL, thrFunc, (void *) i);&lt;br /&gt;
#ifdef HAVE_THR_SETCONCURRENCY_PROTO&lt;br /&gt;
	int thr_setconcurrency(int);&lt;br /&gt;
	thr_setconcurrency(NumberOfProcs);&lt;br /&gt;
#endif &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void WaitThrTask(int NumberOfProcs) {&lt;br /&gt;
	for (int i = 0; i &amp;lt; NumberOfProcs; i++)&lt;br /&gt;
		pthread_join(thread[i], NULL);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
	double A = 10e-5, B = 1;&lt;br /&gt;
&lt;br /&gt;
	sem_init(&amp;amp;semGlobalSum, 0, 1);&lt;br /&gt;
	sem_init(&amp;amp;semGlobalStack, 0, 1);&lt;br /&gt;
	sem_init(&amp;amp;semTaskPresent, 0, 0);&lt;br /&gt;
	double fA = f(A);&lt;br /&gt;
	double fB = f(B);&lt;br /&gt;
	SumRecord tmpRecordAB = { A, fA, B, fB, (fA + fB) * (B - A) / 2. };&lt;br /&gt;
	globalStack.push(tmpRecordAB);&lt;br /&gt;
	sem_post(&amp;amp;semTaskPresent);&lt;br /&gt;
	StartThrTask(nproc, JLS_thr);&lt;br /&gt;
	WaitThrTask(nproc);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&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;
Существует реализация в библиотеке [http://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21677</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21677"/>
		<updated>2017-01-21T11:59:33Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]](п. 1.6-1.10, 2.4, 2.7) [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]](п. 1.1-1.6)&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный. Сначала значение текущего отрезка равно общему отрезку интегрирования. На каждой итерации выполняются следующие действия: &amp;lt;br&amp;gt;&lt;br /&gt;
- На текущем отрезке считается приближенное значение интеграла &amp;lt;br&amp;gt;&lt;br /&gt;
- Текущий отрезок делится пополам, и на получившихся отрезках высчитываются интегралы &amp;lt;br&amp;gt;&lt;br /&gt;
- Сравнивается интеграл на всём отрезке с суммой двух интегралов на половинах. Если достигнута заданная точность, то: &amp;lt;br&amp;gt;&lt;br /&gt;
# Добавить значение интеграла текущего отрезка к общему интегралу &amp;lt;br&amp;gt;&lt;br /&gt;
# Если стек пуст, то завершить алгоритм &amp;lt;br&amp;gt;&lt;br /&gt;
# Иначе достать из стека отрезок и присвоить его значение текущему отрезку. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Иначе &amp;lt;br&amp;gt;&lt;br /&gt;
# Одну половину отрезка положить в стек &amp;lt;br&amp;gt;&lt;br /&gt;
# Текущему отрезку присвоить значение второй половины &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;с++&amp;quot;&amp;gt;&lt;br /&gt;
struct SumRecord {&lt;br /&gt;
	double A;&lt;br /&gt;
	double fA;&lt;br /&gt;
	double B;&lt;br /&gt;
	double fB;&lt;br /&gt;
	double s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double JLS(double A, double B) {&lt;br /&gt;
	stack&amp;lt;SumRecord&amp;gt; localStack;&lt;br /&gt;
	SumRecord tmpRecordAB;&lt;br /&gt;
&lt;br /&gt;
	double J = 0;&lt;br /&gt;
	double fA = f(A);&lt;br /&gt;
	double fB = f(B);&lt;br /&gt;
	double sAB = (fA + fB) * (B - A) / 2.;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		double C = (A + B) / 2.;&lt;br /&gt;
&lt;br /&gt;
		double fC = f(C);&lt;br /&gt;
		double sAC = (fA + fC) * (C - A) / 2.;&lt;br /&gt;
		double sCB = (fC + fB) * (B - C) / 2.;&lt;br /&gt;
		double sACB = sAC + sCB;&lt;br /&gt;
		if (abs(sAB - sACB) &amp;gt;= eps * abs(sACB)) {&lt;br /&gt;
			SumRecord tmpRecordAC = { A, fA, C, fC, sAC };&lt;br /&gt;
			localStack.push(tmpRecordAC);&lt;br /&gt;
			A = C;&lt;br /&gt;
			fA=fC;&lt;br /&gt;
			sAB = sCB;&lt;br /&gt;
		} else {&lt;br /&gt;
			J += sACB;&lt;br /&gt;
			if (localStack.empty())&lt;br /&gt;
				break;&lt;br /&gt;
			else {&lt;br /&gt;
				tmpRecordAB = localStack.top();&lt;br /&gt;
				A = tmpRecordAB.A;&lt;br /&gt;
				fA = tmpRecordAB.fA;&lt;br /&gt;
				B = tmpRecordAB.B;&lt;br /&gt;
				fB = tmpRecordAB.fB;&lt;br /&gt;
				sAB = tmpRecordAB.s;&lt;br /&gt;
				localStack.pop();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return J;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Оценить аналитически последовательную сложность представленного алгоритма невозможно, поскольку нельзя указать количество разбиений отрезка интегрирования для каждой отдельно взятой функции, оно зависит от свойств конкретно взятой функции.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма используется только локальный стек, в который помещаются отрезки, перед очередным этапом деления отрезка. Таким алгоритм чем-то похож на алгоритм рекурсивного деления, только без прямого использования рекурсии. Отрезок делится до тех пор, пока не будет достигнута необходимая точность, вторая половина отрезка будет помещаться в локальный стек на каждом этапе деления. После достижения нужной точности, первым будет исследован последний добавленный отрезок, то есть соответствующий второй половине отрезка, разделённого на предыдущем этапе. Следующий рисунок содержит блок-схему данного алгоритма. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&amp;lt;br&amp;gt;&lt;br /&gt;
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;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Существует реализация в библиотеке [http://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21676</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21676"/>
		<updated>2017-01-21T10:58:21Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]](п. 1.6-1.10, 2.4, 2.7) [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]](п. 1.1-1.6)&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный. Сначала значение текущего отрезка равно общему отрезку интегрирования. На каждой итерации выполняются следующие действия: &amp;lt;br&amp;gt;&lt;br /&gt;
- На текущем отрезке считается приближенное значение интеграла &amp;lt;br&amp;gt;&lt;br /&gt;
- Текущий отрезок делится пополам, и на получившихся отрезках высчитываются интегралы &amp;lt;br&amp;gt;&lt;br /&gt;
- Сравнивается интеграл на всём отрезке с суммой двух интегралов на половинах. Если достигнута заданная точность, то: &amp;lt;br&amp;gt;&lt;br /&gt;
# Добавить значение интеграла текущего отрезка к общему интегралу &amp;lt;br&amp;gt;&lt;br /&gt;
# Если стек пуст, то завершить алгоритм &amp;lt;br&amp;gt;&lt;br /&gt;
# Иначе достать из стека отрезок и присвоить его значение текущему отрезку. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Иначе &amp;lt;br&amp;gt;&lt;br /&gt;
# Одну половину отрезка положить в стек &amp;lt;br&amp;gt;&lt;br /&gt;
# Текущему отрезку присвоить значение второй половины &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;с++&amp;quot;&amp;gt;&lt;br /&gt;
struct SumRecord {&lt;br /&gt;
	double A;&lt;br /&gt;
	double B;&lt;br /&gt;
	double s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double JLS(double A, double B) {&lt;br /&gt;
	stack&amp;lt;SumRecord&amp;gt; localStack;&lt;br /&gt;
	double J = 0;&lt;br /&gt;
	double sAB = (f(A) + f(B)) * (B - A) / 2;&lt;br /&gt;
	SumRecord tmpRecordAB;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		double C = (A + B) / 2;&lt;br /&gt;
		double sAC = (f(A) + f(C)) * (C - A) / 2;&lt;br /&gt;
		double sCB = (f(C) + f(B)) * (B - C) / 2;&lt;br /&gt;
		double sACB = sAC + sCB;&lt;br /&gt;
		if (abs(sAB - sACB) &amp;gt;= eps * abs(sACB)) {&lt;br /&gt;
			SumRecord tmpRecordAC = { A, C, sAC };&lt;br /&gt;
			localStack.push(tmpRecordAC);&lt;br /&gt;
			A = C;&lt;br /&gt;
			sAB = sCB;&lt;br /&gt;
		} else {&lt;br /&gt;
			J += sACB;&lt;br /&gt;
			if (localStack.empty())&lt;br /&gt;
				break;&lt;br /&gt;
			else {&lt;br /&gt;
				tmpRecordAB = localStack.top();&lt;br /&gt;
				A = tmpRecordAB.A;&lt;br /&gt;
				B = tmpRecordAB.B;&lt;br /&gt;
				sAB = tmpRecordAB.s;&lt;br /&gt;
				localStack.pop();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return J;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Оценить аналитически последовательную сложность представленного алгоритма невозможно, поскольку нельзя указать количество разбиений отрезка интегрирования для каждой отдельно взятой функции, оно зависит от свойств конкретно взятой функции.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма используется только локальный стек, в который помещаются отрезки, перед очередным этапом деления отрезка. Таким алгоритм чем-то похож на алгоритм рекурсивного деления, только без прямого использования рекурсии. Отрезок делится до тех пор, пока не будет достигнута необходимая точность, вторая половина отрезка будет помещаться в локальный стек на каждом этапе деления. После достижения нужной точности, первым будет исследован последний добавленный отрезок, то есть соответствующий второй половине отрезка, разделённого на предыдущем этапе. Следующий рисунок содержит блок-схему данного алгоритма. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&amp;lt;br&amp;gt;&lt;br /&gt;
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;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Существует реализация в библиотеке [http://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21675</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21675"/>
		<updated>2017-01-21T10:49:20Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]](п. 1.6-1.10, 2.4, 2.7) [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]](п. 1.1-1.6)&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;с++&amp;quot;&amp;gt;&lt;br /&gt;
struct SumRecord {&lt;br /&gt;
	double A;&lt;br /&gt;
	double B;&lt;br /&gt;
	double s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double JLS(double A, double B) {&lt;br /&gt;
	stack&amp;lt;SumRecord&amp;gt; localStack;&lt;br /&gt;
	double J = 0;&lt;br /&gt;
	double sAB = (f(A) + f(B)) * (B - A) / 2;&lt;br /&gt;
	SumRecord tmpRecordAB;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		double C = (A + B) / 2;&lt;br /&gt;
		double sAC = (f(A) + f(C)) * (C - A) / 2;&lt;br /&gt;
		double sCB = (f(C) + f(B)) * (B - C) / 2;&lt;br /&gt;
		double sACB = sAC + sCB;&lt;br /&gt;
		if (abs(sAB - sACB) &amp;gt;= eps * abs(sACB)) {&lt;br /&gt;
			SumRecord tmpRecordAC = { A, C, sAC };&lt;br /&gt;
			localStack.push(tmpRecordAC);&lt;br /&gt;
			A = C;&lt;br /&gt;
			sAB = sCB;&lt;br /&gt;
		} else {&lt;br /&gt;
			J += sACB;&lt;br /&gt;
			if (localStack.empty())&lt;br /&gt;
				break;&lt;br /&gt;
			else {&lt;br /&gt;
				tmpRecordAB = localStack.top();&lt;br /&gt;
				A = tmpRecordAB.A;&lt;br /&gt;
				B = tmpRecordAB.B;&lt;br /&gt;
				sAB = tmpRecordAB.s;&lt;br /&gt;
				localStack.pop();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return J;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Оценить аналитически последовательную сложность представленного алгоритма невозможно, поскольку нельзя указать количество разбиений отрезка интегрирования для каждой отдельно взятой функции, оно зависит от свойств конкретно взятой функции.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма используется только локальный стек, в который помещаются отрезки, перед очередным этапом деления отрезка. Таким алгоритм чем-то похож на алгоритм рекурсивного деления, только без прямого использования рекурсии. Отрезок делится до тех пор, пока не будет достигнута необходимая точность, вторая половина отрезка будет помещаться в локальный стек на каждом этапе деления. После достижения нужной точности, первым будет исследован последний добавленный отрезок, то есть соответствующий второй половине отрезка, разделённого на предыдущем этапе. Следующий рисунок содержит блок-схему данного алгоритма. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&amp;lt;br&amp;gt;&lt;br /&gt;
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;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Существует реализация в библиотеке [http://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21674</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21674"/>
		<updated>2017-01-21T10:44:41Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;с++&amp;quot;&amp;gt;&lt;br /&gt;
struct SumRecord {&lt;br /&gt;
	double A;&lt;br /&gt;
	double B;&lt;br /&gt;
	double s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double JLS(double A, double B) {&lt;br /&gt;
	stack&amp;lt;SumRecord&amp;gt; localStack;&lt;br /&gt;
	double J = 0;&lt;br /&gt;
	double sAB = (f(A) + f(B)) * (B - A) / 2;&lt;br /&gt;
	SumRecord tmpRecordAB;&lt;br /&gt;
	while (1) {&lt;br /&gt;
		double C = (A + B) / 2;&lt;br /&gt;
		double sAC = (f(A) + f(C)) * (C - A) / 2;&lt;br /&gt;
		double sCB = (f(C) + f(B)) * (B - C) / 2;&lt;br /&gt;
		double sACB = sAC + sCB;&lt;br /&gt;
		if (abs(sAB - sACB) &amp;gt;= eps * abs(sACB)) {&lt;br /&gt;
			SumRecord tmpRecordAC = { A, C, sAC };&lt;br /&gt;
			localStack.push(tmpRecordAC);&lt;br /&gt;
			A = C;&lt;br /&gt;
			sAB = sCB;&lt;br /&gt;
		} else {&lt;br /&gt;
			J += sACB;&lt;br /&gt;
			if (localStack.empty())&lt;br /&gt;
				break;&lt;br /&gt;
			else {&lt;br /&gt;
				tmpRecordAB = localStack.top();&lt;br /&gt;
				A = tmpRecordAB.A;&lt;br /&gt;
				B = tmpRecordAB.B;&lt;br /&gt;
				sAB = tmpRecordAB.s;&lt;br /&gt;
				localStack.pop();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return J;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Оценить аналитически последовательную сложность представленного алгоритма невозможно, поскольку нельзя указать количество разбиений отрезка интегрирования для каждой отдельно взятой функции, оно зависит от свойств конкретно взятой функции.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма используется только локальный стек, в который помещаются отрезки, перед очередным этапом деления отрезка. Таким алгоритм чем-то похож на алгоритм рекурсивного деления, только без прямого использования рекурсии. Отрезок делится до тех пор, пока не будет достигнута необходимая точность, вторая половина отрезка будет помещаться в локальный стек на каждом этапе деления. После достижения нужной точности, первым будет исследован последний добавленный отрезок, то есть соответствующий второй половине отрезка, разделённого на предыдущем этапе. Следующий рисунок содержит блок-схему данного алгоритма. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&amp;lt;br&amp;gt;&lt;br /&gt;
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;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Существует реализация в библиотеке [http://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21673</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21673"/>
		<updated>2017-01-21T03:19:56Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&amp;lt;br&amp;gt;&lt;br /&gt;
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;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Существует реализация в библиотеке [http://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21672</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21672"/>
		<updated>2017-01-21T02:48:14Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В.&amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21671</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21671"/>
		<updated>2017-01-21T02:47:55Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* ЧАСТЬ. Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В. в &amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21670</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21670"/>
		<updated>2017-01-21T02:47:42Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В. в &amp;lt;ref&amp;gt;Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21669</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21669"/>
		<updated>2017-01-21T02:40:37Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB]&amp;lt;br&amp;gt;&lt;br /&gt;
Есть реализация с использованием OpenMP от университета [https://doc.itc.rwth-aachen.de/display/CCP/Parallelizing+an+Algorithm+for+Adaptive+Integration+with+OpenMP RWTH AACHEN UNIVERSITY]&amp;lt;br&amp;gt;&lt;br /&gt;
Кроме того, схема реализации алгоритма представлена Якобовским М. В. в [[1]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka&amp;diff=21668</id>
		<title>Обсуждение участника:Greno4ka</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:Greno4ka&amp;diff=21668"/>
		<updated>2017-01-21T02:32:54Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Пункт 1.3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK) Работа не готова. Нет разделов 1.3, 1.4, 1.6-1.8, 1.10, 2.4; нет описания параллельного алгоритма и исследования масштабируемости. Есть несколько замечаний (ниже с моей подписью) к тому, что уже написано, помимо выполнения основных требований к работе &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Статья [[Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* В разделе 1.1 по сути нет описания алгоритма (сделано)&lt;br /&gt;
* Разделы 1.6-1.8 пусты (сделано)&lt;br /&gt;
* В разделах 1.3 и 1.4 хотелось бы видеть понятное словесное описание&lt;br /&gt;
* Содержимое раздела 1.4 должно быть внесено в раздел 1.5&lt;br /&gt;
* Не указан вклад каждого автора&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:59, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.2 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;в некоторых точках значение функции будет вычисляться несколько раз&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В каких точках в формуле для приближенного вычисления интеграла функция вычисляется несколько раз? В чем проблема сохранять рассчитанные значения функции и использовать их далее без перерасчета?&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.3 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
В этом разделе нужно явно описать вычислительное ядро алгоритма. (сделано)&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Вместо макроструктуры алгоритма здесь приведена реализация структуры данных для стека.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.5 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;if (|sAB - sACB| ≥ ε|sACB|) {&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Не отличается ли здесь условие на деление отрезка от того, что приведено в пункте 1.2?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.9 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Как задается входная функция в алгоритме и реализации?&lt;br /&gt;
Нужно указать размер входных-выходных данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.10 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Есть ли у алгоритма другие свойства, помимо того, что он адаптируется под заданную функцию?&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka&amp;diff=21667</id>
		<title>Обсуждение участника:Greno4ka</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:Greno4ka&amp;diff=21667"/>
		<updated>2017-01-21T02:32:34Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Статья Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK) Работа не готова. Нет разделов 1.3, 1.4, 1.6-1.8, 1.10, 2.4; нет описания параллельного алгоритма и исследования масштабируемости. Есть несколько замечаний (ниже с моей подписью) к тому, что уже написано, помимо выполнения основных требований к работе &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Статья [[Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* В разделе 1.1 по сути нет описания алгоритма (сделано)&lt;br /&gt;
* Разделы 1.6-1.8 пусты (сделано)&lt;br /&gt;
* В разделах 1.3 и 1.4 хотелось бы видеть понятное словесное описание&lt;br /&gt;
* Содержимое раздела 1.4 должно быть внесено в раздел 1.5&lt;br /&gt;
* Не указан вклад каждого автора&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:59, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.2 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;в некоторых точках значение функции будет вычисляться несколько раз&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В каких точках в формуле для приближенного вычисления интеграла функция вычисляется несколько раз? В чем проблема сохранять рассчитанные значения функции и использовать их далее без перерасчета?&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.3 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
В этом разделе нужно явно описать вычислительное ядро алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Вместо макроструктуры алгоритма здесь приведена реализация структуры данных для стека.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.5 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;if (|sAB - sACB| ≥ ε|sACB|) {&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Не отличается ли здесь условие на деление отрезка от того, что приведено в пункте 1.2?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.9 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Как задается входная функция в алгоритме и реализации?&lt;br /&gt;
Нужно указать размер входных-выходных данных.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.10 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:18, 3 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Есть ли у алгоритма другие свойства, помимо того, что он адаптируется под заданную функцию?&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21666</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21666"/>
		<updated>2017-01-21T02:31:13Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&amp;lt;br&amp;gt;&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21665</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21665"/>
		<updated>2017-01-21T02:30:47Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
[[Файл:Ustinov fx.png]]&lt;br /&gt;
В данном алгоритме используется адаптивное разбиение участка интегрирования: размер конкретного отрезка определяется во время подсчета значения функции на нем самом. Если заданная точность не была достигнута на данном отрезке, он рекурсивно разбивается на несколько новых и функция подсчитывается уже на них. Таким образом, выигрыш от применения рассмотренного алгоритма рекурсивного разбиения достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Как правило это бывает очень полезно при расчёте интегралов функций, содержащих области с высокими градиентами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21664</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21664"/>
		<updated>2017-01-21T02:11:05Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&amp;lt;br&amp;gt;&lt;br /&gt;
- нахождение середины отрезка и значения функции в этой точке;&amp;lt;br&amp;gt;&lt;br /&gt;
- вычисление частичных сумм на половинах отрезка;&amp;lt;br&amp;gt;&lt;br /&gt;
- работа со стеком.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21663</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21663"/>
		<updated>2017-01-21T02:10:46Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21662</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21662"/>
		<updated>2017-01-21T02:03:24Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21661</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21661"/>
		<updated>2017-01-20T23:39:17Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21660</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21660"/>
		<updated>2017-01-20T23:35:32Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21659</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21659"/>
		<updated>2017-01-20T23:35:12Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма используется только локальный стек, в который помещаются отрезки, перед очередным этапом деления отрезка. Таким алгоритм чем-то похож на алгоритм рекурсивного деления, только без прямого использования рекурсии. Отрезок делится до тех пор, пока не будет достигнута необходимая точность, вторая половина отрезка будет помещаться в локальный стек на каждом этапе деления. После достижения нужной точности, первым будет исследован последний добавленный отрезок, то есть соответствующий второй половине отрезка, разделённого на предыдущем этапе. Следующий рисунок содержит блок-схему данного алгоритма.&lt;br /&gt;
[[Файл:Ustinov localgraph.png]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
На следующем рисунке изображена информационная структура алгоритма, на котором заметна его внутренняя цикличность.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21658</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21658"/>
		<updated>2017-01-20T23:21:53Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&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;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21656</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21656"/>
		<updated>2017-01-20T22:46:32Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&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;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Ustinov infograph.png]]&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21655</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21655"/>
		<updated>2017-01-20T22:31:07Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. &amp;lt;br&amp;gt;&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21654</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21654"/>
		<updated>2017-01-20T22:30:38Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции. \\&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21651</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21651"/>
		<updated>2017-01-20T20:54:30Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции.&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21650</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21650"/>
		<updated>2017-01-20T20:53:38Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции.\n&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21649</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=21649"/>
		<updated>2017-01-20T20:53:11Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
2. В параллельной версии алгоритма на основе не требуется управляющий процесс. Распределение отрезков и финальное сложение можно провести на нулевом процессе.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12337</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12337"/>
		<updated>2016-10-15T23:34:45Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12233</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12233"/>
		<updated>2016-10-15T22:07:03Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka&amp;diff=12155</id>
		<title>Участник:Greno4ka</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:Greno4ka&amp;diff=12155"/>
		<updated>2016-10-15T21:26:58Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: Новая страница: «Устинов Григорий Андреевич, группа 604.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Устинов Григорий Андреевич, группа 604.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12153</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12153"/>
		<updated>2016-10-15T21:26:22Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12148</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12148"/>
		<updated>2016-10-15T21:24:13Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев Д.В.|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12143</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12143"/>
		<updated>2016-10-15T21:21:35Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Greno4ka]] [[User:John Doe|John Doe]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки примечательно тем, что на разных участках интервала интегрирования количество узлов сетки зависит от необходимой точности. Вычисление на равномерной сетке неэффективно, поскольку предполагает равномерное сгущение сетки на всем отрезке интегрирования, без учета характера изменения подынтегральной функции.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12097</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12097"/>
		<updated>2016-10-15T21:05:50Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Вычислительное ядро алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12072</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12072"/>
		<updated>2016-10-15T21:01:16Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Последовательная сложность алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;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>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12003</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=12003"/>
		<updated>2016-10-15T20:53:19Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Свойства алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;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>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11912</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11912"/>
		<updated>2016-10-15T20:43:37Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Входные и выходные данные алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;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;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&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;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11897</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11897"/>
		<updated>2016-10-15T20:42:45Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Входные и выходные данные алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования a, b.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* число I , равное &amp;lt;math&amp;gt;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&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;/div&gt;</summary>
		<author><name>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11889</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11889"/>
		<updated>2016-10-15T20:42:18Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Математическое описание алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* функция y = f(x);&lt;br /&gt;
* точность \epsilon;&lt;br /&gt;
* границы отрезка интегрирования a, b.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* число I , равное \int_a^b{f(x)dx} с точностью \epsilon.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;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>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11884</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11884"/>
		<updated>2016-10-15T20:41:42Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Входные и выходные данные алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные:&lt;br /&gt;
* функция y = f(x);&lt;br /&gt;
* точность \epsilon;&lt;br /&gt;
* границы отрезка интегрирования a, b.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* число I , равное \int_a^b{f(x)dx} с точностью \epsilon.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;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>Greno4ka</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11842</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%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%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=11842"/>
		<updated>2016-10-15T20:36:24Z</updated>

		<summary type="html">&lt;p&gt;Greno4ka: /* Математическое описание алгоритма */&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;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; 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;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;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>Greno4ka</name></author>
	</entry>
</feed>