<?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=Novikov+alexander</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=Novikov+alexander"/>
	<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/Novikov_alexander"/>
	<updated>2026-10-22T19:53:48Z</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=19112</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=19112"/>
		<updated>2016-11-24T12:56:04Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Novikov alexander|Александр Новиков (1.4, 1.6, 1.7, 2.4, 2.7, 3)]], [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
===Схема реализации последовательного алгоритма===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [2 : 16] с шагом 1;&lt;br /&gt;
*	размер матрицы [262144 : 11239424].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 60,00%;&lt;br /&gt;
*	максимальная эффективность реализации 98,33%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB Производительность.png|thumb|center|700px|Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB эффективность.png|thumb|center|700px|Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17465</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17465"/>
		<updated>2016-11-15T20:57:12Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Novikov alexander|Александр Новиков (1.4, 1.6, 1.7, 2.4, 2.7, 3)]], [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB Производительность.png|thumb|center|700px|Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB эффективность.png|thumb|center|700px|Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:Novikov_alexander&amp;diff=17429</id>
		<title>Участник:Novikov alexander</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:Novikov_alexander&amp;diff=17429"/>
		<updated>2016-11-15T20:24:22Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Новиков Александр Игоревич, группа 623&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17427</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17427"/>
		<updated>2016-11-15T20:23:46Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Novikov alexander|Александр Новиков (1.4, 1.6, 1.7, 2.4, 2.7, 3)]], [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB Производительность.png|thumb|center|700px|Рисунок 8. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB эффективность.png|thumb|center|700px|Рисунок 9. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17426</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17426"/>
		<updated>2016-11-15T20:23:21Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник:Alexander novikov|Александр Новиков (1.4, 1.6, 1.7, 2.4, 2.7, 3)]], [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB Производительность.png|thumb|center|700px|Рисунок 8. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB эффективность.png|thumb|center|700px|Рисунок 9. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17422</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17422"/>
		<updated>2016-11-15T20:19:00Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков (1.4, 1.6, 1.7, 2.7, 3), [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB Производительность.png|thumb|center|700px|Рисунок 8. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Масштабируемость параллельной реализации BiCGSTAB эффективность.png|thumb|center|700px|Рисунок 9. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17420</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17420"/>
		<updated>2016-11-15T20:17:47Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков (1.4, 1.6, 1.7, 2.7, 3), [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[file:Масштабируемость Параллельной реализации стабилизированного метода бисопряженных градиентов Производительность.png|thumb|center|700px|Рисунок 8. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
[[file:Холецкий масштабируемость эффективность2.png|thumb|center|700px|Рисунок 9. Параллельная реализация стабилизированного метода бисопряженных градиентов. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17419</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17419"/>
		<updated>2016-11-15T20:15:23Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков (1.4, 1.6, 1.7, 2.7, 3), [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации стабилизированного метода бисопряженных градиентов в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17418</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17418"/>
		<updated>2016-11-15T20:14:31Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков (1.4, 1.6, 1.7, 2.7, 3), [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/krylov/HYPRE_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17413</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=17413"/>
		<updated>2016-11-15T20:11:43Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков (1.4, 1.6, 1.7, 2.7, 3), [[Участник:EasyBreezy|Гаврилов Алексей (1.1 - 1.3, 1.5, 1.8, 1.9, 2.7, 3)]]&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом&amp;lt;ref&amp;gt;Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&amp;lt;/ref&amp;gt; в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|&amp;lt;center&amp;gt;Информационный граф.&amp;lt;/center&amp;gt;]]&lt;br /&gt;
На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
#Вычислительная мощность: &amp;lt;math&amp;gt;N/4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
Исследование масштабируемости реализации стабилизированного метода бисопряженных градиентов проводилось согласно [[Scalability methodology|методике]]  на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [4 : 256] с шагом 4;&lt;br /&gt;
*	размер матрицы [1024 : 5120].&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон [[Глоссарий#Эффективность реализации|эффективности реализации]] алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,11%;&lt;br /&gt;
*	максимальная эффективность реализации 2,65%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики [[Глоссарий#Производительность|производительности]] и эффективности выбранной реализации разложения Холецкого в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/LLNL/hypre/blob/master/src/parcsr_ls/F90_HYPRE_parcsr_bicgstab.c Исследованная параллельная реализация на языке C]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12343</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12343"/>
		<updated>2016-10-15T23:43:53Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма. Серым обозначено перемножение чисел, красным - умножение числа на вектор]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12336</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12336"/>
		<updated>2016-10-15T23:34:01Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;/math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12335</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12335"/>
		<updated>2016-10-15T23:33:48Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как &amp;lt;math&amp;gt;2 \sqrt n&amp;lt;\math&amp;gt;, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12332</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12332"/>
		<updated>2016-10-15T23:32:31Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \frac{p}{\log_2 p} &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как 2 \sqrt n, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12331</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12331"/>
		<updated>2016-10-15T23:32:08Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p= \sqrt n&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;\sqrt n&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = &amp;lt;math&amp;gt;\frac{n}{p}&amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как 2 \sqrt n, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12330</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12330"/>
		<updated>2016-10-15T23:30:59Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2 \sqrt n - 1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = \frac{n}{p}, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6 \sqrt n-3 + 4n + 3 + 1 + 3*\lceil \frac{n}{p} \rceil + 2* \lceil \frac{n}{p} \rceil = 6 \sqrt n + 4n + 5 \lceil \frac{n}{p} \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как 2 \sqrt n, если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12325</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12325"/>
		<updated>2016-10-15T23:28:12Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6 \sqrt n + 4n + 5 \lceil frac{n}{p} \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*\lceil n/p \rceil + 2* \lceil n/p \rceil = 6sqrt(n) + 4n + 5 \lceil n/p \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12324</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12324"/>
		<updated>2016-10-15T23:27:35Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; O(k*(6sqrt(n) + 4n + 5 \lceil n/p \rceil)) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; 2 \sqrt n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*\lceil n/p \rceil + 2* \lceil n/p \rceil = 6sqrt(n) + 4n + 5 \lceil n/p \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12323</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12323"/>
		<updated>2016-10-15T23:26:41Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; 6sqrt(n) + 4n + 5n/p &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*\lceil n/p \rceil + 2* \lceil n/p \rceil = 6sqrt(n) + 4n + 5 \lceil n/p \rceil + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12322</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12322"/>
		<updated>2016-10-15T23:24:13Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; 6sqrt(n) + 4n + 5n/p &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*⌈n/p⌉ + 2*⌈n/p⌉ = 6sqrt(n) + 4n + 5⌈n/p⌉ + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12320</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12320"/>
		<updated>2016-10-15T23:23:40Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; 6sqrt(n) + 4n + 5n/p &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*⌈n/p) + 2*⌈n/p⌉ = 6sqrt(n) + 4n + 5⌈n/p⌉ + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12317</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12317"/>
		<updated>2016-10-15T23:20:10Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; 6sqrt(n) + 4n + 5n/p &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*(n/p) + 2*n/p = 6sqrt(n) + 4n + 5n/p + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12299</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12299"/>
		<updated>2016-10-15T23:00:19Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; log(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ одной итерации алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*(n/p) + 2*n/p = 6sqrt(n) + 4n + 5n/p + 1&amp;lt;/math&amp;gt;, а ширину, как 2sqrt(n), если не брать в рассчет проверку критерия сходимости и упрощенности первой итерации по сравнению с остальными.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12298</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12298"/>
		<updated>2016-10-15T22:57:12Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; log(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
В конечном счете общую высоту ЯПФ алгоритма можно оценить, как &amp;lt;math&amp;gt;6sqrt(n)-3 + 4n + 3 + 1 + 3*(n/p) + 2*n/p = 6sqrt(n) + 4n + 5n/p + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12286</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12286"/>
		<updated>2016-10-15T22:48:01Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; log(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; p/\log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
Ширина и высота ЯПФ графа данного алгоритма напрямую зависит от конкретных реализаций макроопераций и входных данных.&lt;br /&gt;
&lt;br /&gt;
Для последовательно-параллельной реализации операции взятия скалярного произведения в наиболее оптимальном случае (&amp;lt;math&amp;gt;p=sqrt(n)&amp;lt;/math&amp;gt;) высота будет равна &amp;lt;math&amp;gt;2sqrt(n)-1&amp;lt;/math&amp;gt;, а ширина &amp;lt;math&amp;gt;sqrt(n)&amp;lt;/math&amp;gt;, где n - это длина вектора решения.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ простейшего алгоритма умножения матрицы на вектор равна 2n, а ширина m, где n - это уже упомянутая длина вектора(она же ширина матрицы), а m - высота матрицы.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции умножения вектора на число = n/p, а ширина p.&lt;br /&gt;
&lt;br /&gt;
Высота ЯПФ операции вычисления разности векторов = &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt;, а ширина p.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12186</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12186"/>
		<updated>2016-10-15T21:38:59Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: Александр Новиков, Алексей Гаврилов&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = BiCGSTAB&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность СЛАУ&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; log(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; ) и вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
| output_data       = вектор решения системы &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же умножения матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке [https://developer.nvidia.com/amgx/ NVIDIA AmgX]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
# Горбаченко В.И, Вычислительная линейная алгебра с примерами на MATLAB. — СПб.: БХВ-Петербург, 2011. — 320 с.: ил. — (Учебное пособие)&lt;br /&gt;
# Henk A. vander Vorst, Iterative Krylov Methods for Large Linear Systems, Cambridge University Press 2003, 230p&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12126</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12126"/>
		<updated>2016-10-15T21:15:25Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0)}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же при умножении матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12121</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12121"/>
		<updated>2016-10-15T21:12:49Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]] x 4 раза&lt;br /&gt;
# [[Умножение плотной матрицы на вектор ]] х 2 раза&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же при умножении матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12099</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12099"/>
		<updated>2016-10-15T21:06:24Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \log_2 p &amp;lt;/math&amp;gt; раз. Ускорение же при умножении матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12098</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12098"/>
		<updated>2016-10-15T21:06:05Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до &amp;lt;math&amp;gt; \log_2 p &amp;lt;\math&amp;gt; раз. Ускорение же при умножении матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12094</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12094"/>
		<updated>2016-10-15T21:05:07Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения, суммы векторов, а так же произведения матрицы на вектор. Каждая из операций вычисления скалярного произведения и суммы векторов, выполняемая на p процессорах, за счет метода сдваивания может ускориться до \log_2 p раз. Ускорение же при умножении матрицы на вектор может достигать p раз.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12061</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=12061"/>
		<updated>2016-10-15T20:59:06Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Основной прирост производительности параллельной версии алгоритма дает использование параллельных операций вычисления скалярного произведения. Каждая из них, выполняемая на p процессорах, за счет метода сдваивания может ускориться до \log_2 p раз. То же касается и параллельных сложений векторов.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11990</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11990"/>
		<updated>2016-10-15T20:51:53Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|800px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11985</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11985"/>
		<updated>2016-10-15T20:51:27Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|1366px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница] [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11980</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11980"/>
		<updated>2016-10-15T20:51:11Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|1366px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/ Официальная страница][https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c Исходный код]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке NVIDIA AmgX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11967</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11967"/>
		<updated>2016-10-15T20:49:40Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|1366px|Информационный граф. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
* Параллельная реализация алгоритма в бесплатной библиотеке, поддерживающей MPI и OpenMP, HYPRE: [http://acts.nersc.gov/hypre/]&lt;br /&gt;
  Исходный код: [https://github.com/LLNL/hypre/blob/master/src/krylov/bicgstab.c]&lt;br /&gt;
* Параллельная реализация алгоритма на CUDA в условно бесплатной библиотеке Nvidia AMGX: [https://developer.nvidia.com/amgx]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11921</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11921"/>
		<updated>2016-10-15T20:44:31Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|1366px|Рисунок 1. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*  Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11909</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=11909"/>
		<updated>2016-10-15T20:43:25Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства &amp;lt;math&amp;gt;R^n&amp;lt;/math&amp;gt;, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;&lt;br /&gt;
#Найти базис V пространства K и базис W пространства &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  &amp;lt;math&amp;gt;W^T AV^{-1}&amp;lt;/math&amp;gt; в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[file:BiCGStabIterations.jpg|thumb|center|1400px|Рисунок 1. На графе представлены связи между операциями, выполняющимися в первых трех итерациях метода. При выполнении большего, чем 3, количества итераций, структура каждой новой будет повторять структуру третьей. Связи между итерациями не представлены, т.к. они не важны для понимания параллельной структуры алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
:Входные данные&lt;br /&gt;
#Матрица &amp;lt;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
:Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*  Параллельная реализация алгоритма, предложенная MIT: [http://ab-initio.mit.edu/~meep/meep/src/bicgstab.cpp MIT BiCGSTAB]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=9790</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=9790"/>
		<updated>2016-10-15T13:55:49Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства R^n, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству L.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств K и L&lt;br /&gt;
#Найти базис V пространства K и базис W пространства L;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  W^T AV^{-1} в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;k^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной матрицы на вектор ]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(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;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=9787</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=9787"/>
		<updated>2016-10-15T13:54:28Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства R^n, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству L.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств K и L&lt;br /&gt;
#Найти базис V пространства K и базис W пространства L;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  W^T AV^{-1} в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;k^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
# Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
# Единожды [[Умножение плотной неособенной матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(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;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=9780</id>
		<title>Участник:EasyBreezy/Стабилизированный метод бисопряженных градиентов (BiCGSTAB)</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:EasyBreezy/%D0%A1%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%B8%D1%81%D0%BE%D0%BF%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_(BiCGSTAB)&amp;diff=9780"/>
		<updated>2016-10-15T13:52:33Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания:&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
:Стабилизированный метод бисопряженных градиентов, так же известный как BiCGSTAB (Biconjugate gradient stabilized method), был предложен голландским математиком Хенком ван дер Ворстом в 1992 году. Статья, в которой описывался метод, стала самым цитируемым научным трудом в области математики в 1990х годах.&lt;br /&gt;
&lt;br /&gt;
:Метод появился, как ответ на задачу о построении способа решения систем линейных алгебраических уравнений произвольного вида. На момент появления BiCGSTAB уже существовали методы решения СЛАУ произвольного типа, в том числе и в комплексном пространстве, например метод бисопряженных градиентов. Однако существующие на тот момент методы либо обладали недостаточной скоростью сходимости, либо использовали в вычислениях тяжелые операции, такие как транспонирования матрицы, которые усложняли распараллеливание на многопроцессорных машинах.&lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB является итерационным методом решения систем линейных алгебраических уравнений. Мощь метода заключается в том, что его можно применять к матрицам общего вида, в том числе с комплексными коэффициентами. В процессе выполнения BiCGSTAB не использует для вычисления плохо распараллеливаемых операций, не допускает накопления погрешностей округления и нестабильного поведения невязки. Эти факторы выгодно отличают его от предшественников: метода бисопряженных градиентов и квадратичного метода сопряженных градиентов, из которого BiCGSTAB фактически и вытекает. К преимуществам так же можно добавить более высокую в общем случае скорость сходимости относительно ближайших конкурентов. Тем не менее, для некоторых видов СЛАУ BiCGSTAB может уступать более простым методам.&lt;br /&gt;
&lt;br /&gt;
:Благодаря свойствам алгоритма область применения метода весьма широка. Фактически, он используется во всех задачах, где требуется решать СЛАУ, в том числе СЛАУ большой размерности, к которым сводится большое количество численных методов, применяемых при решении задач математического моделирования. &lt;br /&gt;
&lt;br /&gt;
:BiCGSTAB относится к классу так называемых проекционных методов. Основная идея методов данного класса: искать итерационным способом наилучшее приближение решения в некотором подпространстве пространства R^n, и чем шире подпространство, в котором ищется приближение решения, тем ближе будет приближенное решение к точному на каждой итерации. В качестве такого подпространства используются пространства Крылова, порожденные матрицей системы и невязкой первого приближения: &amp;lt;math&amp;gt;K^m (A, r^0) = span(r^0, Ar^0, A^2r^0, ..., A^{m-1} r^0).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Изложим основную идею любого проекционного метода, заложенную в том числе и в BiCGSTAB. Для простоты выкладок и рассуждений здесь и далее будем считать, что матрица системы и ее правая часть вещественны. Без ограничения общности все дальнейшие рассуждения могут быть перенесены и на комплексный случай. Итак, пусть решается система &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; с невырожденной матрицей  &amp;lt;math&amp;gt;A \in R^{n \times n}&amp;lt;/math&amp;gt; и ненулевым  вектором  &amp;lt;math&amp;gt;b \in R^n&amp;lt;/math&amp;gt;.  Имеются  два подпространства &amp;lt;math&amp;gt;K_n&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;L_n&amp;lt;/math&amp;gt;. Требуется найти вектор &amp;lt;math&amp;gt;x \in K_n&amp;lt;/math&amp;gt;, который обеспечивает решение  системы, оптимальное относительно подпространства  L, то есть требуется выполнение условия Петрова-Галеркина: &amp;lt;math&amp;gt;(Ax,z)=(b,z), \forall z \in L_n&amp;lt;/math&amp;gt;. В данном случае вектор x называется обобщенным решением системы. &lt;br /&gt;
&lt;br /&gt;
:Условие Петрова-Галеркина можно записать и через определение невязки. Пусть &amp;lt;math&amp;gt;r = b - Ax&amp;lt;/math&amp;gt; - невязка, тогда условие Петрова-Галеркина перепишется в виде: &amp;lt;math&amp;gt;(b - Ax, z)=(r, z),\forall z \in L_n&amp;lt;/math&amp;gt;. Это равносильно тому, что вектор невязки ортогонален пространству L.&lt;br /&gt;
&lt;br /&gt;
:Пусть для СЛАУ известно некоторое приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt; точного решения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;. Данное приближение требуется уточнить поправкой &amp;lt;math&amp;gt; \delta: b - Ax^0 + \delta \perp L&amp;lt;/math&amp;gt;. Невязка уточненного решения имеет вид: &amp;lt;math&amp;gt;r_{new} = b - Ax^0 + \delta = r^0- A\delta&amp;lt;/math&amp;gt;. Условие Петрова-Галеркина тогда можно переписать так: &amp;lt;math&amp;gt;(r_{new}, z)= r^0 - (A\delta, z) = 0, \forall z \in L&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Пусть  &amp;lt;math&amp;gt; dim K = dim L = m, V = (v_1, ..., v_n) \in R^{n \times m}, W = (w_1, ... w_n) \in R^{n \times m}&amp;lt;/math&amp;gt;, где V и W – матрицы, столбцы которых образуют базисы пространств K и L соответственно. Пусть так же &amp;lt;math&amp;gt; \delta = Vy, z = Wq&amp;lt;/math&amp;gt;, где y – коэффициенты разложения вектора поправки по базису пространства K, а q – коэффициенты разложения вектора z в пространстве L. Тогда новое приближение решения можно записать в виде: &amp;lt;math&amp;gt;x^1 = x^0 + \delta= x^0 + Vy&amp;lt;/math&amp;gt;. Из условия ортогональности Петрова-Галеркина получаем, что: &amp;lt;math&amp;gt;(r - AVy, Wq) = (W^Tr^0 - AVy, q) = 0&amp;lt;/math&amp;gt;. Поскольку &amp;lt;math&amp;gt;q \neq 0&amp;lt;/math&amp;gt;, то получаем СЛАУ для вектора y: &amp;lt;math&amp;gt;W^TAVy = W^Tr^0&amp;lt;/math&amp;gt;. Если предположить, что матрица &amp;lt;math&amp;gt;W^TAVy&amp;lt;/math&amp;gt; невырождена, то вектор y однозначно определяется и равен: &amp;lt;math&amp;gt;y = W^TAV^{-1}W^Tr^0&amp;lt;/math&amp;gt;. Подставляя найденные коэффициенты разложения в выражение для первого приближения получаем: &amp;lt;math&amp;gt;x^1 = x^0 + \delta = x^0 + W^TAV^{-1}W^Tr^0y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог. Общий порядок шагов любого проекционного метода следующий:&lt;br /&gt;
#Выбрать пару подпространств K и L&lt;br /&gt;
#Найти базис V пространства K и базис W пространства L;&lt;br /&gt;
#Вычислить невязку&lt;br /&gt;
#Найти &amp;lt;math&amp;gt;y = W^T AV^{-1} W^T r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положить &amp;lt;math&amp;gt;x = x + Vy&amp;lt;/math&amp;gt;&lt;br /&gt;
#Если не достигнут критерий остановки итерационного процесса, то повторить алгоритм, начиная с первого шага.&lt;br /&gt;
&lt;br /&gt;
:Как будет показано далее, в BiCGSTAB не требуется вычислять матрицу  W^T AV^{-1} в явном виде.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
:Рассмотрим СЛАУ с вещественными коэффициентами:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;Ax = b, A \in R^{N \times N}, b \in R^N&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:В основу алгоритма ложиться идея проекционного метода и использование свойства A-бисопряженности системы векторов, а именно: векторы &amp;lt;math&amp;gt;p^1, p^2, ...&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\overline p^1, \overline p^2, ...&amp;lt;/math&amp;gt; бисопряжены, если &amp;lt;math&amp;gt;(Ap^i,p^j ) = 0,&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i \neq j&amp;lt;/math&amp;gt;. Фактически, данное условие эквивалентно биортогональности относительно энергетического скалярного произведения. &lt;br /&gt;
 &lt;br /&gt;
:Общая концепция проекционных методов предписывает нам выбрать два подпространства. В нашем случае подпространства мы выберем два подпространства, задаваемые матрицей системы А, вектором невязки на нулевой итерации &amp;lt;math&amp;gt;r^0&amp;lt;/math&amp;gt; и вектором &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;. который выбирается из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;K = K^k(A, r^0), L = K^k(A, \overline r^0)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Метод основан на построении биортогонального базиса &amp;lt;math&amp;gt;p^0, p^1, ... p^k .. &amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;K^k (A, r^0) &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;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;x^{k + 1} = x^k + \alpha_k p_k + \omega_k s_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;p^{k + 1} = r^{k + 1} + \beta_k p_k - \omega_k Ap_k&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
:где:&lt;br /&gt;
#&amp;lt;math&amp;gt;x^{k + 1}&amp;lt;/math&amp;gt; - приближение на следующей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;x^k&amp;lt;/math&amp;gt; - приближение на предыдущей итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;p_k&amp;lt;/math&amp;gt; - базисный вектор подпространства Крылова, порожденного матрице СЛАУ и невязкой&lt;br /&gt;
#&amp;lt;math&amp;gt;\alpha_k, \omega_k&amp;lt;/math&amp;gt; - вспомогательные скаляры, определяемые для каждого шага итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; - вспомогательный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;p^{k + 1}&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ый базисный вектор&lt;br /&gt;
#&amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt; - невязка &amp;lt;math&amp;gt;k + 1&amp;lt;/math&amp;gt;-ой итерации&lt;br /&gt;
#&amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt; - вспомогательный коэффициент&lt;br /&gt;
&lt;br /&gt;
:Вспомогательный вектор выражается следующим образом:&lt;br /&gt;
*&amp;lt;math&amp;gt;s_k = r^k - \alpha_k Ap_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Вспомогательные коэффициенты вычисляются по формулам:&lt;br /&gt;
*&amp;lt;math&amp;gt;\alpha_k = \frac{(r^k, \overline r^0}{(Ap_k, \overline r^0)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\omega_k = \frac{(As_k, s_k)}{(As_k, As_k)}&amp;lt;/math&amp;gt;&lt;br /&gt;
*&amp;lt;math&amp;gt;\beta_k = \frac{(r^{k + 1}, \overline r^0)}{(r^k, \overline r^0}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Подведем итог и запишем итерационный процесс&lt;br /&gt;
:Подготовительный этап:&lt;br /&gt;
#Выбирается некоторое начальное приближение &amp;lt;math&amp;gt;x^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#По выбранному приближению находится невязка &amp;lt;math&amp;gt;r^0 = b - Ax^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Из условия &amp;lt;math&amp;gt;(r^0, \overline r^0) \neq 0&amp;lt;/math&amp;gt; выбирается вектор &amp;lt;math&amp;gt;\overline r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Положим &amp;lt;math&amp;gt;p^0 = r^0&amp;lt;/math&amp;gt;&lt;br /&gt;
#Устанавливаем счетчик итераций: &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
:Итерационный процесс:&lt;br /&gt;
#Находим &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;\alpha_k&amp;lt;/math&amp;gt; вычисляем &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#По найденному &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\omega_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Находится новое приближение &amp;lt;math&amp;gt;x{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется невязка &amp;lt;math&amp;gt;r^{k + 1}&amp;lt;/math&amp;gt;. Если выполнено условие &amp;lt;math&amp;gt;\parallel r^{k + 1} \parallel &amp;lt; \epsilon&amp;lt;/math&amp;gt;, то алгоритм завершается.&lt;br /&gt;
#Вычисляется вспомогательный коэффициент &amp;lt;math&amp;gt;\beta_k&amp;lt;/math&amp;gt;&lt;br /&gt;
#Вычисляется новый базисный вектор: &amp;lt;math&amp;gt;k^{k + 1}&amp;lt;/math&amp;gt;&lt;br /&gt;
#Увеличивается номер итерации: &amp;lt;math&amp;gt;n = n + 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;
1. Трижды [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]]&lt;br /&gt;
2. Единожды [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)]]&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
:Всего в вычислительном блоке алгоритма присутствует 20 трудоемких операций: 2 операции умножения матрицы на вектор, 6 скалярных произведений и 6 сложений/вычитаний векторов и 6 умножений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Каждое скалярное произведение требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение, то есть &amp;lt;math&amp;gt;2n - 1&amp;lt;/math&amp;gt; операции. Скалярных произведений всего 6 штук (включая поиск нормы), что дает нам &amp;lt;math&amp;gt;12n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Умножение матрицы размерности &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор эквивалентно взятию еще &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; скаляров, и так как таких операций в вычислительном ядре 2, то дополнительно имеется еще &amp;lt;math&amp;gt;2n(2n - 1)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Наконец, сложение или вычитание векторов требует &amp;lt;math&amp;gt;6n&amp;lt;/math&amp;gt; соотвествующих операций. Столько же требует 6 произведений вектора на число.&lt;br /&gt;
&lt;br /&gt;
:Итого: &amp;lt;math&amp;gt;2n(2n - 1) + 12n - 6 + 6n + 6n = 4n^2 + 22n - 6&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
:Нетрудоемкие операции, вроде извлечение квадратного корня и деление вещественных чисел друг на друга, не принимаются в расчет, так как они не влияют на итоговый результат. Окончательно можно заключить, что последовательная сложность алгоритма эквивалента &amp;lt;math&amp;gt;O(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;math&amp;gt;A \in R^{N \times N}&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^{N \times N}&amp;lt;/math&amp;gt; )&lt;br /&gt;
#Вектор правой части &amp;lt;math&amp;gt;b \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
#Вектор решения СЛАУ &amp;lt;math&amp;gt;x \in R^N&amp;lt;/math&amp;gt; ( &amp;lt;math&amp;gt;C^N&amp;lt;/math&amp;gt; )&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
:BiCGSTAB хорошо зарекомендовал себя для решения систем линейных алгебраический уравнений, поскольку обладает некоторыми важными свойствами:&lt;br /&gt;
#Благодаря применению подхода Петрова-Галеркина и техники ортогонализации, он численно устойчив&lt;br /&gt;
#Не меняется вид матрицы в процессе решения&lt;br /&gt;
#Эффективен для решения систем большой размерности с разреженной матрицей, поскольку в методе самая трудоемкая операция - умножение матрицы на вектор&lt;br /&gt;
#Лучше подходит под распределенные системы, поскольку не содержит операции транспонирования матрицы&lt;br /&gt;
#Применим для решения систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
===== Анализ на основе теста Apex-Map =====&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Novikov alexander</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=9770</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=9770"/>
		<updated>2016-10-15T13:48:19Z</updated>

		<summary type="html">&lt;p&gt;Novikov alexander: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
Статья: [[Нечеткий_алгоритм_С_средних]]&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 | Новоселов Алексей]], Выполняет: [[Участник:pahom | Кочетков Павел]]&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|Шатков С.А.]], [[Антохина Ю.А.]]&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| Валуйская Яна]], [[Глотов Евгений]]&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;/div&gt;</summary>
		<author><name>Novikov alexander</name></author>
	</entry>
</feed>