<?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=%D0%9B%D0%B8%D0%B4%D0%B6%D0%B8%D0%B5%D0%B2+%D0%94%D0%B0%D0%BD%D0%B8%D1%80+%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B8%D1%87</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=%D0%9B%D0%B8%D0%B4%D0%B6%D0%B8%D0%B5%D0%B2+%D0%94%D0%B0%D0%BD%D0%B8%D1%80+%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B8%D1%87"/>
	<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/%D0%9B%D0%B8%D0%B4%D0%B6%D0%B8%D0%B5%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D1%80_%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B8%D1%87"/>
	<updated>2026-10-23T02:36:09Z</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=22471</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=22471"/>
		<updated>2017-02-08T12:33:58Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Информационный граф */&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;
{{algorithm&lt;br /&gt;
| name              = Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(1)&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;
[[Файл: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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&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 f(double x)&lt;br /&gt;
{&lt;br /&gt;
	return (1/x*x)*sin(1/(x*x))*sin(1/(x*x));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const double eps = 0.00001;&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;
Функция получает координаты начала и конца отрезка. В цикле проверяется условие if (|sAB - sACB| ≥ ε|sACB|). Если оно соблюдается, то один отрезок помещается в стек, а на другом продолжаются вычисления до тех пор, пока не достигается необходимая точность. Затем вычисляется интеграл на отрезках, концы которых берутся из стека.&lt;br /&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|700px|center|thumb|Рис.1.]]&lt;br /&gt;
&lt;br /&gt;
В параллельной версии алгоритма, появляется дополнительный глобальный стек, в который будут помещаться отрезки из локальных стеков параллельных процессов, и доступ к которому имеют все процессы. Он находится в общей памяти и содержит границы отрезков. Процессы обмениваются с ним данными, распределяя таким образом отрезки между собой. Когда в локальном стеке заканчиваются элементы, процесс обращается к глобальному стеку, чтобы получить их. &amp;lt;br&amp;gt;&lt;br /&gt;
Изначально в глобальный стек помещается один отрезок, соответствующий участку интегрирования. Существуют реализации, где локальные стеки полностью отсутствуют, а все отрезки хранятся в глобальном стеке. Такой вариант проще реализовать, но его недостаток в том, что увеличивается количество обращений процессов к глобальному стеку, и каждый процесс должен ждать своей очереди, что может привести к увеличению времени работы программы. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Adaptive mesh informac graph.png|700px|center|thumb|Рис.2. Информационный граф для алгоритма глобального стека. [a,b] - выбор отрезка, calcSquare - вычисление площади, Div - деление отрезка пополам, Check - проверка достижения точности, Wr - запись отрезка в локальный/глобальный стек, Sum - общая сумма]]&lt;br /&gt;
&lt;br /&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>Лиджиев Данир Владимирович</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Adaptive_mesh_informac_graph.png&amp;diff=22469</id>
		<title>Файл:Adaptive mesh informac graph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Adaptive_mesh_informac_graph.png&amp;diff=22469"/>
		<updated>2017-02-08T12:19:19Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22152</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=22152"/>
		<updated>2017-02-06T00:05:32Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.10 */&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;
Ответ: в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)  (сделано)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22151</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=22151"/>
		<updated>2017-02-06T00:05:04Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Статья Участник: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;
Ответ: в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22150</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=22150"/>
		<updated>2017-02-06T00:04:53Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: &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;
{{algorithm&lt;br /&gt;
| name              = Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;O(1)&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;
[[Файл: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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&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 f(double x)&lt;br /&gt;
{&lt;br /&gt;
	return (1/x*x)*sin(1/(x*x))*sin(1/(x*x));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const double eps = 0.00001;&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;
Функция получает координаты начала и конца отрезка. В цикле проверяется условие if (|sAB - sACB| ≥ ε|sACB|). Если оно соблюдается, то один отрезок помещается в стек, а на другом продолжаются вычисления до тех пор, пока не достигается необходимая точность. Затем вычисляется интеграл на отрезках, концы которых берутся из стека.&lt;br /&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>Лиджиев Данир Владимирович</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=22149</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=22149"/>
		<updated>2017-02-06T00:02:45Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.9 */&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;
Ответ: в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22148</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=22148"/>
		<updated>2017-02-06T00:02:20Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Схема реализации последовательного алгоритма */&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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&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 f(double x)&lt;br /&gt;
{&lt;br /&gt;
	return (1/x*x)*sin(1/(x*x))*sin(1/(x*x));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
const double eps = 0.00001;&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;
Функция получает координаты начала и конца отрезка. В цикле проверяется условие if (|sAB - sACB| ≥ ε|sACB|). Если оно соблюдается, то один отрезок помещается в стек, а на другом продолжаются вычисления до тех пор, пока не достигается необходимая точность. Затем вычисляется интеграл на отрезках, концы которых берутся из стека.&lt;br /&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>Лиджиев Данир Владимирович</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=22147</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=22147"/>
		<updated>2017-02-05T23:50:43Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.5 */&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;
Ответ: в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22146</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=22146"/>
		<updated>2017-02-05T23:48:35Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.2 */&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;
Ответ: в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22145</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=22145"/>
		<updated>2017-02-05T23:47:48Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: &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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&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 f(double x)&lt;br /&gt;
{&lt;br /&gt;
	return (1/x*x)*sin(1/(x*x))*sin(1/(x*x));&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>Лиджиев Данир Владимирович</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=22140</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=22140"/>
		<updated>2017-02-04T22:07:21Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.10 */&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;
в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22139</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=22139"/>
		<updated>2017-02-04T22:05:18Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.5 */&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;
в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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.2 мы говорим, что при соблюдении условия &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;
мы &#039;&#039;останавливаем&#039;&#039; вычисления.&lt;br /&gt;
В то время как в 1.5 при abs(sAB - sACB) &amp;gt;= eps * abs(sACB) мы &#039;&#039;продолжаем&#039;&#039; вычисления методом локального стека.&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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22138</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=22138"/>
		<updated>2017-02-04T21:50:08Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.2 */&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;
в некоторых точках значение подынтегральной функции вычисляется более одного раза. Например, в точке А функция будет вычислена k раз, где k -  число выполнения цикла do-while. Никаких проблем с сохранением значений нет. Это было взято из рекомендованной книги... Переписали без этого пункта&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;
== Пункт 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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22137</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=22137"/>
		<updated>2017-02-04T21:49:59Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Математическое описание алгоритма */&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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&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>Лиджиев Данир Владимирович</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=22136</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=22136"/>
		<updated>2017-02-04T21:49:45Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Математическое описание алгоритма */&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;
Вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему. То есть основное время работы алгоритма приходится на следующие операции:&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>Лиджиев Данир Владимирович</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=22135</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=22135"/>
		<updated>2017-02-04T21:42:09Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Пункт 1.4 */&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;
== Пункт 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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22134</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=22134"/>
		<updated>2017-02-04T21:41:24Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Статья Участник: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;br /&gt;
&lt;br /&gt;
* В разделе 1.5 кроме кода нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Графы, приведённые в разделе 1.7, не являются информационными графами (направленный ациклический граф, вершины - операции, дуги - информационные зависимости). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:41, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=22038</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=22038"/>
		<updated>2017-02-02T07:27:18Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&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>Лиджиев Данир Владимирович</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:%D0%9B%D0%B8%D0%B4%D0%B6%D0%B8%D0%B5%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D1%80_%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B8%D1%87&amp;diff=22037</id>
		<title>Участник:Лиджиев Данир Владимирович</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:%D0%9B%D0%B8%D0%B4%D0%B6%D0%B8%D0%B5%D0%B2_%D0%94%D0%B0%D0%BD%D0%B8%D1%80_%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B8%D1%87&amp;diff=22037"/>
		<updated>2017-02-02T06:51:40Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: Новая страница: «Лиджиев Данир Владимирович, группа 604»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лиджиев Данир Владимирович, группа 604&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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:Lineprinter&amp;diff=13157</id>
		<title>Обсуждение участника:Lineprinter</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:Lineprinter&amp;diff=13157"/>
		<updated>2016-10-18T21:06:05Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Участник:Бобцов Борис/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]]&lt;br /&gt;
Выполняет: [[Участник:Бобцов Борис| Бобцов Борис]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]]&lt;br /&gt;
Выполняют: [[Участник:Greno4ka| Устинов Григорий ]] и [[ Лиджиев Данир ]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Кластеризация сетями Кохонена]]&lt;br /&gt;
Выполняют: [[Участник:Kravtsovkirill| Кравцов Кирилл]] и [[Участник:Emaksimov| Максимов Егор]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение собственных чисел квадратной матрицы методом QR разложения (2)]]&lt;br /&gt;
Выполняют: Баев Олег и Шевелев Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Стабилизированный метод биспоряженных градиентов (BiCGSTAB)]]&lt;br /&gt;
Выполняют: Гаврилов Алексей и Новиков Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм k-means]]&lt;br /&gt;
Выполняют: [[Участник:Бротиковская Данута|Данута Бротиковская]] и [[Участник:DennZo1993|Денис Зобнин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning Around Medoids (Алгоритм)]]&lt;br /&gt;
Выполняют: [[Участник:Denemmy| Галеев Данил]] и [[Участник:Ivan.Z| Запутляев Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняет: [[Участник:Lexaloris | Новоселов Алексей]], Выполняет: [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Участница:JuliaA|Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Участник:GlotovES| Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм С-средних (Fuzzy C-means)]]&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм C средних]]&lt;br /&gt;
Выполняют: [[Участник:Gkhazeeva|Гелана Хазеева]], [[Участник:Yushin|Павел Юшин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Плотностный алгоритм кластеризации DBSCAN]]&lt;br /&gt;
Выполняют: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Кластеризация Partitioning Around Medoids (PAM)]]&lt;br /&gt;
Выполняют:[[ Участник:Тодуа Антон| Тодуа Антон]], [[Участник:Гусева Юлия| Гусева Юлия]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Бугаков Юрий (613 группа), Кужамалиев Ернур (601 группа)/Построение матрицы Адамара произвольной размерности]]&lt;br /&gt;
Выполняют:[[ Участник:Бугаков Юрий| Бугаков Юрий]], [[Участник:Кужамалиев Ернур| Кужамалиев Ернур]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Nikita/Построение_матрицы_Адамара|Построение матрицы Адамара]]&lt;br /&gt;
Выполняют: [[Участник:Nikita|Иванов Никита]], [[Участник:Tsyganov Nikita|Цыганов Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Ньютона для решения систем нелинейных уравнений]]&lt;br /&gt;
Выполняют: [[Участник:Александр Чернышев|Александр Чернышев]], [[Участник:Захаров Никита|Захаров Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[BIRCH|Сбалансированный итеративный алгоритм редукции и кластеризации с использованием иерархий&lt;br /&gt;
(BIRCH)]]&lt;br /&gt;
Выполняют: [[Участник:Светлана Морозова|Морозова Светлана]], [[Участник:Smirnov.maxim|Смирнов Максим]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Плотностный_алгоритм_кластеризации|Плотностный_алгоритм_кластеризации]], Выполняют: [[Участник:Ramon93i7|Шемякин Роман]], [[Участник:Dadrik|Вашуров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм CLOPE кластеризации категориальных данных]].&lt;br /&gt;
Выполняют: [[Участник:Артем_Карпухин|Карпухин Артем]], [[Участник:Артем_Желтков|Желтков Артем]].&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Борис/Алгоритм_Рунге-Кутты]]&lt;br /&gt;
Выполняет: [[Участник:Борис| Савков Борис]] и Степанов Евгений.&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=12087</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=12087"/>
		<updated>2016-10-15T21:04:08Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* ЧАСТЬ. Литература */&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;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=12085</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=12085"/>
		<updated>2016-10-15T21:03:39Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Существующие реализации алгоритма */&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;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=11789</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=11789"/>
		<updated>2016-10-15T20:27:39Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Локальность данных и вычислений */&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>Лиджиев Данир Владимирович</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=11788</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=11788"/>
		<updated>2016-10-15T20:27:25Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* ЧАСТЬ. Свойства и структура алгоритмов */&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>Лиджиев Данир Владимирович</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=11755</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=11755"/>
		<updated>2016-10-15T20:21:06Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* = Общее описание алгоритма */&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;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=11752</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=11752"/>
		<updated>2016-10-15T20:20:45Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* ЧАСТЬ. Программная реализация алгоритма */&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;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=11726</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=11726"/>
		<updated>2016-10-15T20:16:50Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Общее описание алгоритма */&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;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=11724</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=11724"/>
		<updated>2016-10-15T20:15:56Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На примере задачи вычисления определенного интеграла от аналитически заданной функции рассматриваются алгоритмы, минимизирующие время решения задачи на многопроцессорной вычислительной системе. Их использование обеспечивает снижение времени решения задачи относительно «наилучшего» доступного последовательного алгоритма. Определение эффективности параллельного алгоритма относительно собственной же последовательной версии, как правило, не корректно. Обладающий высокой эффективностью параллельный алгоритм может по времени выполнения проигрывать лучшему из доступных последовательных алгоритмов решения той же задачи. Далее рассматриваются алгоритмы, минимизирующие именно&lt;br /&gt;
время решения задачи, оперирующей относительно небольшим объемом данных. Применяемые подходы могут быть полезны при решении&lt;br /&gt;
широкого круга проблем.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&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;/div&gt;</summary>
		<author><name>Лиджиев Данир Владимирович</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=11717</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=11717"/>
		<updated>2016-10-15T20:14:45Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На примере задачи вычисления определенного интеграла от аналитически заданной функции рассматриваются алгоритмы, минимизирующие время решения задачи на многопроцессорной вычислительной системе. Их использование обеспечивает снижение времени решения задачи относительно «наилучшего» доступного последовательного алгоритма. Определение эффективности параллельного алгоритма относительно собственной же последовательной версии, как правило, не корректно. Обладающий высокой эффективностью параллельный алгоритм может по времени выполнения проигрывать лучшему из доступных последовательных алгоритмов решения той же задачи. Далее рассматриваются алгоритмы, минимизирующие именно&lt;br /&gt;
время решения задачи, оперирующей относительно небольшим объемом данных. Применяемые подходы могут быть полезны при решении&lt;br /&gt;
широкого круга проблем.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;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>Лиджиев Данир Владимирович</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=11714</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=11714"/>
		<updated>2016-10-15T20:14:27Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На примере задачи вычисления определенного интеграла от аналитически заданной функции рассматриваются алгоритмы, минимизирующие время решения задачи на многопроцессорной вычислительной системе. Их использование обеспечивает снижение времени решения задачи относительно «наилучшего» доступного последовательного алгоритма. Определение эффективности параллельного алгоритма относительно собственной же последовательной версии, как правило, не корректно. Обладающий высокой эффективностью параллельный алгоритм может по времени выполнения проигрывать лучшему из доступных последовательных алгоритмов решения той же задачи. Далее рассматриваются алгоритмы, минимизирующие именно&lt;br /&gt;
время решения задачи, оперирующей относительно небольшим объемом данных. Применяемые подходы могут быть полезны при решении&lt;br /&gt;
широкого круга проблем.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;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>Лиджиев Данир Владимирович</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=5491</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=5491"/>
		<updated>2016-10-11T21:09:32Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* ЧАСТЬ. Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На примере задачи вычисления определенного интеграла от аналитически заданной функции рассматриваются алгоритмы, минимизирующие время решения задачи на многопроцессорной вычислительной системе. Их использование обеспечивает снижение времени решения задачи относительно «наилучшего» доступного последовательного алгоритма. Определение эффективности параллельного алгоритма относительно собственной же последовательной версии, как правило, не корректно. Обладающий высокой эффективностью параллельный алгоритм может по времени выполнения проигрывать лучшему из доступных последовательных алгоритмов решения той же задачи. Далее рассматриваются алгоритмы, минимизирующие именно&lt;br /&gt;
время решения задачи, оперирующей относительно небольшим объемом данных. Применяемые подходы могут быть полезны при решении&lt;br /&gt;
широкого круга проблем.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значение определенного интеграла:&lt;br /&gt;
&lt;br /&gt;
&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;
формула&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательные алгоритмы&lt;br /&gt;
&lt;br /&gt;
Метод трапеций&lt;br /&gt;
&lt;br /&gt;
Метод рекурсивного деления&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;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>Лиджиев Данир Владимирович</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=5406</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=5406"/>
		<updated>2016-10-11T17:40:38Z</updated>

		<summary type="html">&lt;p&gt;Лиджиев Данир Владимирович: /* ЧАСТЬ. Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
Свойства &lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;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>Лиджиев Данир Владимирович</name></author>
	</entry>
</feed>