<?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=Kiseliov</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=Kiseliov"/>
	<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/Kiseliov"/>
	<updated>2026-10-23T01:49:17Z</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29333</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29333"/>
		<updated>2022-11-03T10:38:06Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к графику времени работы алгоритма. На графике по оси Ox, Oy откладывается длина одной стороны изображения в пикселях (т.е. это - число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, если всё изображение - матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;) и количество нитей OpenMP (нити запускаются параллельно, если доступно необходимое количество ресурсов). По оси Oz откладывается время работы в секундах для каждой точки &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Временем работы здесь является время работы функции, применяющей метод регуляризации Тихонова к изображению и ядру и заполняющей выходную матрицу. Время чтения/записи файлов, а также время выполнения прочих служебных функций не учитывалось.&lt;br /&gt;
Количество нитей задаётся следующей последовательностью: &amp;lt;math&amp;gt;1, 4, 8, 12, 16, 20, ..., 128&amp;lt;/math&amp;gt;. А длина стороны изображения в пикселях задаётся такой последовательностью: &amp;lt;math&amp;gt;128, 128+16, ..., 256, 256+32, ..., 4096&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes4.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Автору такие не известны. Поиск в открытых источниках результата не дал.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29332</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29332"/>
		<updated>2022-11-03T10:28:53Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к графику времени работы алгоритма. На графике по оси Ox, Oy откладывается длина одной стороны изображения в пикселях (т.е. это - число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, если всё изображение - матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;) и количество нитей OpenMP (нити запускаются параллельно, если доступно необходимое количество ресурсов). По оси Oz откладывается время работы в секундах для каждой точки &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Временем работы здесь является время работы функции, применяющей метод регуляризации Тихонова к изображению и ядру и заполняющей выходную матрицу. Время чтения/записи файлов, а также время выполнения прочих служебных функций не учитывалось.&lt;br /&gt;
Количество нитей задаётся следующей последовательностью: &amp;lt;math&amp;gt;1, 4, 8, 12, 16, 20, ..., 128&amp;lt;/math&amp;gt;. А длина стороны изображения в пикселях задаётся такой последовательностью: &amp;lt;math&amp;gt;128, 128+16, ..., 256, 256+32, ..., 4096&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes4.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29331</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29331"/>
		<updated>2022-11-03T10:23:57Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к графику времени работы алгоритма. На графике по оси Ox, Oy откладывается длина одной стороны изображения в пикселях (т.е. это - число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, если всё изображение - матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;) и количество нитей OpenMP (нити запускаются параллельно, если доступно необходимое количество ресурсов). По оси Oz откладывается время работы в секундах для каждой точки &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Временем работы здесь является время работы функции, применяющей метод регуляризации Тихонова к изображению и ядру и заполняющей выходную матрицу. Время чтения/записи файлов, а также время выполнения прочих служебных функций не учитывалось.&lt;br /&gt;
Количество нитей задаётся степенью двойки. Длина стороны изображения в пикселях задаётся следующей последовательностью: &amp;lt;math&amp;gt;128, 128+16, ..., 256, 256+32, ..., 4096&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes4.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes4.png&amp;diff=29330</id>
		<title>Файл:TikhonovRegularizationTimes4.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes4.png&amp;diff=29330"/>
		<updated>2022-11-03T10:21:02Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;График времени работы алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29329</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29329"/>
		<updated>2022-11-02T14:08:08Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к графику времени работы алгоритма. На графике по оси Ox, Oy откладывается длина одной стороны изображения в пикселях (т.е. это - число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, если всё изображение - матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;) и количество процессоров (именно процессоров; это связано с особенностями технологии OpenMP). По оси Oz откладывается время работы в секундах для каждой точки &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Временем работы здесь является время работы функции, применяющей метод регуляризации Тихонова к изображению и ядру и заполняющей выходную матрицу. Время чтения/записи файлов, а также время выполнения прочих служебных функций не учитывалось.&lt;br /&gt;
Количество процессоров задаётся степенью двойки. Длина стороны изображения в пикселях задаётся следующей последовательностью: &amp;lt;math&amp;gt;128, 128+16, ..., 256, 256+32, ..., 4096&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes3.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes3.png&amp;diff=29328</id>
		<title>Файл:TikhonovRegularizationTimes3.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes3.png&amp;diff=29328"/>
		<updated>2022-11-02T14:07:01Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;График времени работы алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29327</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29327"/>
		<updated>2022-11-02T14:05:37Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к графику времени работы алгоритма. На графике по оси Ox, Oy откладывается длина одной стороны изображения в пикселях (т.е. это - число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, если всё изображение - матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;) и количество процессоров (именно процессоров; это связано с особенностями технологии OpenMP). По оси Oz откладывается время работы в секундах для каждой точки &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Временем работы здесь является время работы функции, применяющей метод регуляризации Тихонова к изображению и ядру и заполняющей выходную матрицу. Время чтения/записи файлов, а также время выполнения прочих служебных функций не учитывалось.&lt;br /&gt;
Количество процессоров задаётся степенью двойки. Длина стороны изображения в пикселях задаётся следующей последовательностью: &amp;lt;math&amp;gt;128, 128+16, ..., 256, 256+32, ..., 4096&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes2.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29326</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29326"/>
		<updated>2022-11-02T14:04:02Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к графику времени работы алгоритма. На графике по оси Ox, Oy откладывается размер одной стороны изображения в пикселях (т.е. это - число &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, если всё изображение - матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;) и количество процессоров (именно процессоров; Это связано с особенностями технологии OpenMP). По оси Oz откладывается время работы в секундах для каждой точки &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Временем работы здесь является время работы функции, выполняющей метод регуляризации Тихонова над изображением и ядром и заполняющей выходную матрицу. Время чтения/записи файлов, а также время выполнения прочих служебных функций не учитывалось.&lt;br /&gt;
Количество процессоров задаётся степенью двойки. Длина стороны изображения в пикселях задаётся следующей последовательностью: &amp;lt;math&amp;gt;128, 128+16, ..., 256, 256+32, ..., 4096&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes2.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes2.png&amp;diff=29325</id>
		<title>Файл:TikhonovRegularizationTimes2.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes2.png&amp;diff=29325"/>
		<updated>2022-11-02T14:03:40Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;График времени работы алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29324</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29324"/>
		<updated>2022-11-02T13:14:28Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 5,505 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,478 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 730&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores &lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 64 384&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1487 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| Центральный процессор || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Графический ускоритель || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к замерам времени работы алгоритма.&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes1.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29323</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29323"/>
		<updated>2022-10-27T18:22:24Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 2,962 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,1 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 472&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 42 688&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на стойку || 16 Тбайт&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Расчетная производительность || 2,5 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Максимальное число процессоров в стойке || 256&lt;br /&gt;
|-&lt;br /&gt;
| Максимальное число графических ускорителей в стойке || 256&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1504 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| GPU || 1x Tesla K40s&lt;br /&gt;
|-&lt;br /&gt;
| CPU || 1x Intel Xeon E5-2697 v3 2.60GHz&lt;br /&gt;
|-&lt;br /&gt;
| CPU-ядер || 14&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Перейдём к замерам времени работы алгоритма.&lt;br /&gt;
[[Файл:TikhonovRegularizationTimes1.png|center|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Время выполнения параллельной реализации метода регуляризации Тихонова в секундах.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes1.png&amp;diff=29322</id>
		<title>Файл:TikhonovRegularizationTimes1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationTimes1.png&amp;diff=29322"/>
		<updated>2022-10-27T18:19:33Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;График времени работы алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29321</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29321"/>
		<updated>2022-10-26T19:47:56Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Все запуски программы проводились на с/к Ломоносов 2. Для распараллеливания использовалась технология OpenMP.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ Характеристики системы&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Пиковая производительность || 2,962 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Производительность на тесте Linpack || 2,1 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Число вычислительных узлов || 1 472&lt;br /&gt;
|-&lt;br /&gt;
| Основной тип процессора || Intel Haswell-EP E5-2697v3, 2.6 GHz, 14 cores&lt;br /&gt;
|-&lt;br /&gt;
| Тип ускорителя || NVidia Tesla K40M&lt;br /&gt;
|-&lt;br /&gt;
| Общее число ядер || 42 688&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на узел || 64 GB&lt;br /&gt;
|-&lt;br /&gt;
| Оперативная память на стойку || 16 Тбайт&lt;br /&gt;
|-&lt;br /&gt;
| Проектная мощность || 10 МВт&lt;br /&gt;
|-&lt;br /&gt;
| Расчетная производительность || 2,5 Пфлопс&lt;br /&gt;
|-&lt;br /&gt;
| Максимальное число процессоров в стойке || 256&lt;br /&gt;
|-&lt;br /&gt;
| Максимальное число графических ускорителей в стойке || 256&lt;br /&gt;
|-&lt;br /&gt;
| Операционная система || CentOS 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Конфигурация системы в разделе compute (в котором производились запуски программы):&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+ 1504 узлов со следующими характеристиками&lt;br /&gt;
|-&lt;br /&gt;
! Характеристика || Значение&lt;br /&gt;
|-&lt;br /&gt;
| Объём памяти на GPU || 11.56 GB&lt;br /&gt;
|-&lt;br /&gt;
| GPU || 1x Tesla K40s&lt;br /&gt;
|-&lt;br /&gt;
| CPU || 1x Intel Xeon E5-2697 v3 2.60GHz&lt;br /&gt;
|-&lt;br /&gt;
| CPU-ядер || 14&lt;br /&gt;
|-&lt;br /&gt;
| ОЗУ || 64 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29320</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29320"/>
		<updated>2022-10-25T18:03:55Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на псевдокоде в стиле C:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
tikhonov_regularization(N, *image, *kernel, R, alpha, r, *restored)&lt;br /&gt;
{&lt;br /&gt;
    // ДельтаX в формуле (логично посчитать эти значения единожды)&lt;br /&gt;
    delta_x = (4 * R) / N;&lt;br /&gt;
    delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Это выражение - константа, и его логично посчитать заранее. CONSTANT_PI - число пи&lt;br /&gt;
    constant = (CONSTANT_PI / (2 * R)) * (CONSTANT_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // Цикл по позициям (i, j)&lt;br /&gt;
    for (i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Предполагается, что матрицы хранятся в виде 1D массива, поэтому нужно вычислить правильный индекс&lt;br /&gt;
            index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Мы сдвигаем центр системы координат в центр изображения&lt;br /&gt;
            m = i - N / 2;&lt;br /&gt;
            n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Вычисление формулы. Предполагается, что pow возводит число в степень, conj возвращает сопряжённое комплексное число,&lt;br /&gt;
            // .real() и .imag() - получение действительной или мнимой частей комплексного числа соответственно.&lt;br /&gt;
            upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            m_pow2 = m * m;&lt;br /&gt;
            n_pow2 = n * n;&lt;br /&gt;
            down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29319</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29319"/>
		<updated>2022-10-21T17:14:43Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt; - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29318</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29318"/>
		<updated>2022-10-21T17:13:52Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Две матрицы размера - спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Матрица размера - спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29317</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29317"/>
		<updated>2022-10-19T12:05:37Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph3.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationGraph3.png&amp;diff=29316</id>
		<title>Файл:TikhonovRegularizationGraph3.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationGraph3.png&amp;diff=29316"/>
		<updated>2022-10-19T12:05:15Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Граф алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29315</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29315"/>
		<updated>2022-10-19T11:25:33Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph2.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationGraph2.png&amp;diff=29314</id>
		<title>Файл:TikhonovRegularizationGraph2.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationGraph2.png&amp;diff=29314"/>
		<updated>2022-10-19T11:25:07Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Граф алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29313</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29313"/>
		<updated>2022-10-19T11:12:44Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29312</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29312"/>
		<updated>2022-10-19T11:12:26Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29311</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29311"/>
		<updated>2022-10-19T10:49:39Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительным ядром являются вычисления по формуле из пункта 1.2 в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt;, поскольку формула применяется к позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; независимо от других точек.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29310</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29310"/>
		<updated>2022-10-18T11:38:26Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода. Рёбра в графе отсутствуют в связи с отсутствием связей по данным.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29309</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29309"/>
		<updated>2022-10-18T11:34:39Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph.png|center|thumb|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Информационный граф метода регуляризации Тихонова. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции выхода]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29308</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29308"/>
		<updated>2022-10-18T11:23:18Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
В информационном графе отсутствуют связи, так как нет зависимости по данным.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
[[Файл:TikhonovRegularizationGraph.png|обрамить|центр|Граф алгоритма. Вершины означают применение формулы из пункта 2 к &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; позиции входа для получения &amp;lt;math&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции выхода)]]&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationGraph.png&amp;diff=29307</id>
		<title>Файл:TikhonovRegularizationGraph.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:TikhonovRegularizationGraph.png&amp;diff=29307"/>
		<updated>2022-10-18T11:20:32Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Граф алгоритма&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29276</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29276"/>
		<updated>2022-10-11T20:50:28Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29275</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29275"/>
		<updated>2022-10-11T20:48:42Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int threads, const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // Set number of threads&lt;br /&gt;
    omp_set_num_threads(threads);&lt;br /&gt;
&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29274</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29274"/>
		<updated>2022-10-05T15:09:49Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;long double&amp;gt;* image, const complex&amp;lt;long double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;long double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    double delta_x = (4 * R) / double(N);&lt;br /&gt;
    long double delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    long double delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // Constant part in formula, that can be precomputed&lt;br /&gt;
    long double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            complex&amp;lt;long double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;long double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29273</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29273"/>
		<updated>2022-10-05T14:10:37Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;double&amp;gt;* image, const complex&amp;lt;double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    int delta_x = (4 * R) / N;&lt;br /&gt;
    complex&amp;lt;double&amp;gt; delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    complex&amp;lt;double&amp;gt; delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
            complex&amp;lt;double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29272</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29272"/>
		<updated>2022-10-05T10:11:22Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Реализация указанного алгоритма на C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define _USE_MATH_DEFINES&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
#include &amp;lt;complex&amp;gt;&lt;br /&gt;
#include &amp;lt;complex.h&amp;gt;&lt;br /&gt;
#include &amp;lt;omp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int TikhonovReg(const int N, const complex&amp;lt;double&amp;gt;* image, const complex&amp;lt;double&amp;gt;* kernel, const int R, const double alpha, const int r, complex&amp;lt;double&amp;gt;* restored)&lt;br /&gt;
{&lt;br /&gt;
    // DeltaX in formula (we want to compute this values once)&lt;br /&gt;
    int delta_x = (4 * R) / N;&lt;br /&gt;
    complex&amp;lt;double&amp;gt; delta_x_pow2 = delta_x * delta_x;&lt;br /&gt;
    complex&amp;lt;double&amp;gt; delta_x_pow4 = delta_x_pow2 * delta_x_pow2;&lt;br /&gt;
&lt;br /&gt;
    // For loop gets parallel. Each step of loop for point (i, j) is executed separately&lt;br /&gt;
    #pragma omp parallel for collapse(2) num_threads(8)&lt;br /&gt;
    for (int i = 0; i &amp;lt; N; i++)&lt;br /&gt;
        for (int j = 0; j &amp;lt; N; j++)&lt;br /&gt;
        {&lt;br /&gt;
            // Index (i, j) in 1d mass&lt;br /&gt;
            long index = i * N + j;&lt;br /&gt;
&lt;br /&gt;
            // Move coordonate system center to the center of image&lt;br /&gt;
            int m = i - N / 2;&lt;br /&gt;
            int n = N / 2 - j;&lt;br /&gt;
            &lt;br /&gt;
            // Calculating formula&lt;br /&gt;
            complex&amp;lt;double&amp;gt; upper_part = conj(kernel[index]) * image[index] * delta_x_pow2;&lt;br /&gt;
            complex&amp;lt;double&amp;gt; kernel_squared_module = kernel[index].real() * kernel[index].real() + kernel[index].imag() * kernel[index].imag();&lt;br /&gt;
            complex&amp;lt;double&amp;gt; down_part1 = kernel_squared_module * delta_x_pow4;&lt;br /&gt;
            int m_pow2 = m * m;&lt;br /&gt;
            int n_pow2 = n * n;&lt;br /&gt;
            double constant = (M_PI / (2 * R)) * (M_PI / (2 * R));&lt;br /&gt;
            complex&amp;lt;double&amp;gt; down_part2 = alpha * pow(constant * (m_pow2 + n_pow2), r);&lt;br /&gt;
            complex&amp;lt;double&amp;gt;down_part = down_part1 + down_part2;&lt;br /&gt;
            restored[index] = upper_part / down_part;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29271</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29271"/>
		<updated>2022-10-05T07:51:31Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 0.5&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29270</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29270"/>
		<updated>2022-10-04T17:07:55Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\times N&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29269</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29269"/>
		<updated>2022-10-04T17:06:33Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\timesN&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29268</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29268"/>
		<updated>2022-10-04T17:06:16Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\timesN&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз. Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29267</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29267"/>
		<updated>2022-10-04T17:05:50Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это квадратные матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N\timesN&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В  реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29266</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29266"/>
		<updated>2022-10-04T17:02:46Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{ij}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{ij}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, то есть &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29265</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29265"/>
		<updated>2022-10-04T17:02:02Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Поскольку в каждой позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо, то ресурс параллелизма будет равен размеру матриц, то есть &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29264</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29264"/>
		<updated>2022-10-04T16:57:26Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - 15 операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29263</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29263"/>
		<updated>2022-10-04T16:56:20Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt; операций. Формулы применяется независимо в каждой точке &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\Rightarrow&amp;lt;/math&amp;gt; вычислительная сложность ядра алгоритма - &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29262</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29262"/>
		<updated>2022-10-04T16:56:10Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, всего получим &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
В пункте 1.3 мы получили, что число операций, необходимых для вычисления формулы, равно &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt;. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, в последовательном варианте сложность составит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29261</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29261"/>
		<updated>2022-10-04T16:49:16Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, всего получим &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктура алгоритма представляет собой проход по всем точкам &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; и вычисление &amp;lt;math/&amp;gt;(i, j)&amp;lt;math/&amp;gt; позиции результирующей матрицы по формуле, указанной в пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29260</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29260"/>
		<updated>2022-10-04T16:44:18Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, всего получим &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29259</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29259"/>
		<updated>2022-10-04T16:43:58Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого, 15 операций. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;). Итого, всего получит &amp;lt;math&amp;gt;15 * N^2&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29258</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29258"/>
		<updated>2022-10-04T16:42:29Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{ij} =\frac{(\bar K_{ij})^*\bar u_{ij} (\vartriangle x)^2}{\bigl|\bar K_{ij}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(i^2+j^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{ij})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого 15 операций. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29257</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29257"/>
		<updated>2022-10-04T16:42:07Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{nm} =\frac{(\bar K_{nm})^*\bar u_{nm} (\vartriangle x)^2}{\bigl|\bar K_{nm}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(n^2+m^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{nm})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt; (наиболее подходящие параметры в нашем случае).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
В данном методе вычислительное ядро совпадает с алгоритмом, так как в позиции &amp;lt;math&amp;gt;(i, j)&amp;lt;/math&amp;gt; вычисления производятся независимо по формуле, указанной пункте 1.2.&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность формулы - 3 умножения в числителе, 9 умножений, 2 сложения в знаменателе и одно общее деление (возведение в степень не считаем, так как положили &amp;lt;math&amp;gt;r = 1&amp;lt;/math&amp;gt;). Итого 15 операций. Всего формула будет применена &amp;lt;math&amp;gt;N^2&amp;lt;/math&amp;gt; раз (здесь учтено &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29256</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29256"/>
		<updated>2022-10-04T16:33:36Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{nm} =\frac{(\bar K_{nm})^*\bar u_{nm} (\vartriangle x)^2}{\bigl|\bar K_{nm}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(n^2+m^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{nm})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 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;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29255</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29255"/>
		<updated>2022-10-04T16:32:16Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{nm} =\frac{(\bar K_{nm})^*\bar u_{nm} (\vartriangle x)^2}{\bigl|\bar K_{nm}\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(n^2+m^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{nm})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 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;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29254</id>
		<title>Участник:Kiseliov/Метод регуляризации Тихонова</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:Kiseliov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0&amp;diff=29254"/>
		<updated>2022-10-04T16:22:02Z</updated>

		<summary type="html">&lt;p&gt;Kiseliov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Киселёв Е. И.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод регуляризации Тихонова заключается в следующем:&lt;br /&gt;
&lt;br /&gt;
Нам дано некоторое искажённое изображение (в нашем случае мы рассматриваем статические аберрации). Фактически, некоторое изображение искажается при помощи свёртки с так называемым ядром. То есть, мы имеем уравнение Фредгольма первого рода типа свертки вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;K \circledast z =\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}K(x_1-s_1,x_2-s_2 )z(s_1,s_2 )ds_1\,ds_2 = u(x_1,x_2 ),   -\infty&amp;lt;x_1,x_2&amp;lt;\infty&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;K(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – аппаратная функция прибора (ядро), &amp;lt;math&amp;gt;u(x_1,x_2 )∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt; – искаженное изображение, а &amp;lt;math&amp;gt;z(x_1,x_2 )&amp;lt;/math&amp;gt; – искомое реконструируемое изображение.&lt;br /&gt;
&lt;br /&gt;
Наша задача - восстановить исходное изображение, зная параметры ядра. Метод регуляризации Тихонова говорит о том, что решение имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z(x_1 ,x_2 ) = \frac{1}{4\pi^2}\textstyle\int\limits_{-\infty}^{\infty}\textstyle\int\limits_{-\infty}^{\infty}\frac{\bar K (-\omega_1,-\omega_2)\bar u (\omega_1,\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}e^{i(\omega_1x_1 + \omega_2x_2)}d\omega_1\,d\omega_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\bar K (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр ядра, &amp;lt;math&amp;gt;\bar u (x_1,x_2 )&amp;lt;/math&amp;gt; – спектр искаженного изображения, а &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; – заданная четная функция, обладающая следующими свойствами:&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; кусочно-непрерывна в любой конечной области&lt;br /&gt;
# &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;lt;/math&amp;gt; неотрицательна: &amp;lt;math&amp;gt;M(0,0)\ge0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;M(\omega_1,\omega_2)&amp;gt;0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;\omega_1,\omega_2\neq0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для достаточно больших &amp;lt;math&amp;gt;|\omega_1|,|\omega_2| \Rightarrow M(\omega_1,\omega_2)\ge C&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
# для &amp;lt;math&amp;gt;\forall \alpha &amp;gt;0 \Rightarrow \frac{\bar K (-\omega_1,-\omega_2)}{|\bar K (\omega_1,\omega_2 )|^2+\alpha M(\omega_1,\omega_2)}∈L_2 (\mathbb{R}^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Пусть нам даны спектры искажённого изображения &amp;lt;math&amp;gt;\bar u_{nm}&amp;lt;/math&amp;gt; и ядра &amp;lt;math&amp;gt;\bar K_{nm}&amp;lt;/math&amp;gt; - это матрицы, состоящие из комплексных чисел, размера &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;. Тогда спектр исходного изображения находится по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\bar z_{nm} =\frac{\bar K_{nm}\bar u_{nm} (\vartriangle x)^2}{\bigl|(\bar K_{nm})^*\bigl|^2(\vartriangle x)^4+\alpha \bigl(\bigl(\frac{\pi}{2R}\bigl)^2(n^2+m^2)\bigl)^r}&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\vartriangle x=\frac{4R}{N}&amp;lt;/math&amp;gt;, где R - один из параметров ядра (известная, наперёд заданная величина).&amp;lt;math&amp;gt;(\bar K_{nm})^*&amp;lt;/math&amp;gt; - сопряжение спектра ядра. &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - параметры метода.&lt;br /&gt;
В нашем модельном случае будем считать изображение симметричным, т. е. &amp;lt;math&amp;gt;M=N&amp;lt;/math&amp;gt;. Также в реализации будем считать &amp;lt;math&amp;gt;\alpha = 10000&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r = 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;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Спектр искажённого изображения и спектр ядра свёртки. Обычно дано искажённое изображение (от которого берётся преобразование Фурье). Мы считаем параметры ядра известными. Оно генерируется, и затем от него берётся преобразование Фурье (получается спектр).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Спектр исходного изображения. Спектр можно преобразовать в изображение с помощью обратного преобразования Фурье.&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
* Тихонов А.Н., Арсенин В.Я. Методы решения некорректных задач. – М.: Наука, 1979.&lt;br /&gt;
* Тихонов А.Н., Гончарский А.В., Степанов В.В., Ягола А.Г. Численные методы решения некорректных задач. – М.: Наука, 1990.&lt;br /&gt;
* Гудмен Дж. Введение в фурье‐оптику. – М.: Мир, 1970. 364 с.&lt;/div&gt;</summary>
		<author><name>Kiseliov</name></author>
	</entry>
</feed>