Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии
Кафедра Программной инженерии
Лабораторная работа 2
По дисциплине: Разработка приложений искусственного интеллекта в киберфизических системах
Выполнил студент: Яковлев М. А. ИКПИ-32
Принял работу: Ерофеев С. А.
Дата выполнения:
«21» ноября 2025 г.
Санкт-Петербург
2025 г.
Постановка задачи
Разработать программу на Turbo Prolog 2.0 для определения собственных значений обобщённой проблемы 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. После этого выбирается следующий вектор, нормируется, и процесс повторяется.
Перечень предикатов
1. Предикаты ввода-вывода и управления
· goal - Основной предикат, запускающий программу. Задаёт количество искомых собственных значений, загружает матрицы, проверяет данные и запускает вычислительный процесс.
· load_matrix_from_file(Filename, Rows, Cols, Matrix) - Загружает матрицу из файла. Файл должен содержать количество строк, столбцов и затем числа.
2. Предикаты проверки корректности и подготовки данных
· check_dimensions(ARows, ACols, BRows, BCols, EigenvalsToFind) - Проверка корректности: убедиться, что матрицы квадратные и одинакового размера. Проверяет, что количество искомых собственных значений не превышает размерность матриц.
· is_matrix_symmetric(Rows, Cols, Matrix) - Проверка симметричности матрицы.
3. Предикаты базовых операций
· inv(N, A, InvA) - Вычисляет обратную матрицу InvA для матрицы A размера N методом Гаусса-Жордана.
· inv_gauss(N, A, B, A1, B1) - Вспомогательный предикат для реализации метода Гаусса-Жордана.
· mult_matrix(R1, R2, R3, M1, M2, M3) - Умножает матрицы M1 (размер R1 на R2) и M2 (размер R2 на R3), результат — M3 .
· transpose_matrix(Rows, Cols, M, M1) - Транспонирует матрицу M, результат — M1.
· eye_matrix(N, C, M) - Генерирует единичную матрицу M. Используется для создания начального подпространства.
4. Предикаты метода итераций в подпространстве
· find_eigenvectors(N, K, M, X, Eigenvectors) - Основной управляющий предикат метода итераций.
· N - размерность матрицы.
· K - количество искомых собственных значений.
· M - матрица, M = B^{-1}A .
· X - текущее приближение подпространства (на входе — начальное).
· Eigenvectors - результирующее подпространство собственных векторов.
· process_candidates(N, K, M, X, MX) - умножает подпространство X на матрицу M , результат — MX .
· find_eigenvectors2(N, K, M, X, MX, Eigenvectors) - Предикат проверки сходимости и продолжения итераций. Если подпространство сошлось, возвращает его, иначе — ортогонализует MX и рекурсивно запускает find_eigenvectors.
· is_eigenvectors_stable(X, MX) - Проверяет сходимость всех векторов в подпространстве. Для этого используется is_eigenvector_stable(X_i, MX_i).
· is_eigenvector_stable(X, AX) - Проверяет сходимость одного вектора. Вычисляет отношения компонент AX/X. Если разность между максимальным и минимальным отношением меньше заданного допуска, вектор считается сошедшимся.
· calc_eigenvalues(Eigenvectors, MEigenvectors, Eigenvals) - Вычисляет собственные значения по сошедшимся векторам.
5. Предикаты ортогонализации Грамма-Шмидта
· gramm_shmidt(Vects, OrthoVects) - Принимает список векторов Vects и возвращает список ортонормированных векторов OrthoVects.
· vector_normalization(V, NormV) - Нормирует вектор V , возвращает NormV .
· remove_component(V1, V2, V3) - Удаляет проекцию вектора V2 из вектора V1.
· remove_component_from_vectors(Vects, NormVector, Vects1) - Удаляет проекцию вектора NormVector из всех векторов в списке Vects.
· dot_product(V1, V2, Result) - Вычисляет скалярное произведение векторов.
6. Вспомогательные предикаты
· extract_matrix_element(Row, Col, Matrix, Elem) - Извлекает элемент матрицы.
· extract_row(RowIndex, Matrix, Row) - Извлекает строку матрицы.
· min_element_of_vector(Vector, Min), max_element_of_vector(Vector, Max) - Находят минимальный и максимальный элемент в векторе.
Схема
Рисунок 1. Блок схема основной программы
Рисунок 2. Вычисление обратной матрицы
Рисунок 3. Нахождение собственных векторов
Рисунок 4. Алгоритм Грама-Шмидта
