Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии
Кафедра Программной инженерии
Лабораторная работа 5
По дисциплине: Разработка приложений искусственного интеллекта в киберфизических системах
Выполнил студент: Яковлев М. А. ИКПИ-32
Принял работу: Ерофеев С. А.
Дата выполнения:
«14» декабря 2025 г.
Санкт-Петербург
2025 г.
Постановка задачи
Разработать программу на Haskell для определения собственных значений обобщённой проблемы Ax = λBx методом итераций в подпространстве.
Алгоритм программы
Для достижения данной цели необходимо выполнить следующие задачи:
1. Загрузка данных: считать матрицы A и B из файлов.
2. Проверка корректности: убедиться, что матрицы квадратные и одинакового размера (N > 0), а B — обратима.
3. Приведение к стандартной форме: преобразовать задачу к виду Mx = λx, где M = B^{-1} * A.
4. Решение методом итераций в подпространстве:
· Выбрать начальное приближение для подпространства собственных векторов (например, единичную матрицу).
· Итерационно уточнять подпространство, умножая его на матрицу M и проводя ортогонализацию (процесс Грамма-Шмидта).
5. Вычисление собственных значений: после сходимости вычислить собственные значения.
Алгоритм итераций
1. Выбираются несколько нормированных и взаимно ортогональных векторов. Эти вектора удобно представить себе в виде матрицы. Например, единичной матрицы S:
S
=
2. Выполняется итерация, которая в данном случае представляет собой умножение исследуемой матрицы М на матрицу S.
В этот момент проверяется сходимость. Если отношения элементов первого столбца C и соответствующих элементов первого столбца S одинаковы (в реальных вычислениях очень близки), то первый столбец есть собственный вектор, соответствующий наибольшему собственному значению матрицы. Само же это отношение и будет искомым собственным значением:
3. Столбцы полученной матрицы C ортонормируют (процесс Грамма-Шмидта). Полученную матриц обозначаем S и ее столбцы рассматриваем как очередное приближение собственных векторов.
4. Переход ко второму шагу алгоритма и продолжение итераций до достижения сходимости. Алгоритм итераций в подпространстве используется, когда надо определить несколько собственных значений и соответствующих векторов.
Процесс Грамма-Шмидта
Из набора векторов V выбирается один и нормируется, например, V2:
Полученный нормированный вектор V2 служит основой для удаления компоненты из других векторов, например, из V1. V1 — это исходный вектор (Vj), из которого удаляется проекция на V2. В результате получается V3 — вектор V1 без проекции на V2.
Удаление проекции осуществляется по формуле:
В контексте алгоритма Грамма-Шмидта:
1. Сначала выбирается первый вектор и нормируется.
2. Затем из всех остальных векторов удаляется компонента вдоль этого нормированного вектора.
3. После этого выбирается следующий вектор, нормируется, и процесс повторяется.
Перечень функций
epsilon — константа для сравнения чисел с нулём.
safeDiv — деление двух чисел.
dotProduct — скалярное произведение двух векторов.
vectorNorm — евклидова норма вектора.
vectorNormalization — нормализация вектора до единичной длины.
addRows — поэлементное сложение двух векторов.
multRowNum — умножение вектора на скаляр.
absElem — модуль числа.
isRealZero — проверка, является ли число нулем.
isRealsEqual — проверка равенства двух вещественных чисел с учётом точности.
divReal — безопасное поэлементное деление векторов.
extractRowElement — извлечение элемента из вектора по индексу.
extractMatrixElement — извлечение элемента матрицы по индексам строки и столбца.
extractRow — извлечение строки матрицы.
modRowInMatrix — замена строки в матрице.
exchangeRowsInMatrix — перестановка двух строк в матрице.
transposeMatrix — транспонирование матрицы.
multMatrixElem — элемент произведения двух матриц.
multMatrixRow — произведение матрицы на строку другой матрицы.
multMatrix — умножение двух матриц.
eyeMatrix — единичная матрица заданного размера.
findMaxAbsInColumn — поиск строки с максимальным по модулю элементом в столбце.
eliminateColumn — исключение столбца в алгоритме Гаусса.
invGaussIterDiv — итерация деления ведущего элемента в Гауссе-Жордане.
invGaussIter — итерация алгоритма Гаусса-Жордана с выбором главного элемента.
invGauss — вычисление обратной матрицы методом Гаусса-Жордана.
inv — вспомогательная функция для функции invGauss.
minElementOfVector — минимальный элемент вектора.
maxElementOfVector — максимальный элемент вектора.
isEigenvectorStable — проверка устойчивости собственного вектора.
isEigenvectorsStable — проверка устойчивости набора собственных векторов.
calcEigenvalue — вычисление собственного значения по вектору и матрице.
calcEigenvalues — вычисление собственных значений для набора векторов.
removeComponent — удаление компоненты одного вектора из другого.
removeComponentFromVectors — удаление компоненты из набора векторов.
grammSchmidt — ортогонализация Грамма-Шмидта.
processCandidates — обработка кандидатов на собственные векторы.
generateBetterInitialVectors — генерация улучшенных начальных векторов.
findEigenvectorsLimited — поиск собственных векторов с ограничением итераций.
findEigenvectors — основной алгоритм поиска собственных векторов методом итерации.
isMatrixSymmetric — проверка симметричности матрицы.
checkDimensions — проверка корректности размерностей матриц.
prettyPrintMatrix — вывод матрицы.
readMatrixFromFile — чтение матрицы из текстового файла.
Схема
Рисунок 1. Блок схема основной программы
Рисунок 2. Вычисление обратной матрицы
Рисунок 3. Нахождение собственных векторов
Рисунок 4. Алгоритм Грамма-Шмидта
