Скачиваний:
2
Добавлен:
12.01.2026
Размер:
2.24 Mб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)

Факультет Информационных технологий и программной инженерии

Кафедра Программной инженерии

Лабораторная работа 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. Алгоритм Грама-Шмидта