Добавил:
coffee4ek
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Отчёты Ерофеев / Лабы / Отчёт3
.pdf
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет информационных технологий и программной инженерии (ИТПИ)
Кафедра программной инженерии и вычислительной техники (ПИиВТ)
Дисциплина: «Алгоритмические основы программной инженерии»
Лабораторная работа №3.
Выполнил: Студент группы ИКПИ-41
Летягина Е. А.
Подпись
Принял: Доцент кафедры ПИиВТ
Ерофеев Сергей Анатольевич
Подпись
«_____»________ 2025
г. Санкт-Петербург
2025 г.

1. Постановка задачи
Разработать программу аппроксимации методом наименьших
квадратов на базе полиномов Лаггера. Из файла считываются пары
координат:
x1 y1
x2 y2
...
xn yn,
которые сортируются бинарными вставками по возрастанию x, после чего
пользователю предлагается задать (старший) порядок полинома Лаггера,
который необходимо получить. На выходе коэффициенты полинома
записываются в файл, строится график.
2. Техническое задание
1. Маршрут основной программы
a) Инициализация и ввод данных
Программа начинает свою работу с запроса у пользователя имени
входного файла, содержащего исходные данные. Далее осуществляется
открытие указанного файла для чтения.
b) Чтение данных из файла
Из открытого файла последовательно считываются пары чисел (x, y),
каждая пара сохраняется в массив структур Point. В процессе считывания
подсчитывается количество прочитанных точек (num_points). Если файл
оказался пустым или не содержал корректных пар координат, программа
завершает выполнение с соответствующим сообщением об ошибке.
c) Сортировка точек по возрастанию значения x
Массив точек подвергается сортировке по возрастанию значения
координаты x. Для этой цели используется алгоритм бинарных вставок.
d) Ввод порядка полинома Лаггера
Пользователю предлагается указать порядок полинома Лаггера, который
будет использоваться для аппроксимации. Введённое значение проверяется
на допустимость: порядок должен быть неотрицательным и строго меньше
количества точек (0 ≤ order < num_points).
e) Вычисление коэффициентов аппроксимирующего полинома
С использованием метода наименьших квадратов вычисляются
коэффициенты полинома Лаггера заданного порядка.
f) Запись результатов аппроксимации в файл
Вычисленные коэффициенты записываются в выходной файл
coefficients.txt.
g) Генерация данных для построения графика
Создаётся файл plot_data.txt, содержащий исходные точки и значения
аппроксимирующей функции.
h) Построение графика

Программа пытается автоматически запустить утилиту gnuplot для
построения графиков. На графике отображаются исходные точки в виде
маркеров и аппроксимирующая кривая в виде непрерывной линии.
i) Завершение работы программы
Осуществляется освобождение всей динамически выделенной памяти.
Программа завершает выполнение с кодом успешного завершения (return 0).
2. Маршруты подпрограмм
a) Функция вычисления значение полинома Лаггера
На вход подаются порядок полинома k и вещественная координата x.
Если порядок равен 0 или 1, функция возвращает заранее заданные
значения: L₀(x) = 1 и L₁(x) = (1 – x) соответственно.
Для более высоких порядков функция реализует рекуррентное
вычисление полиномов по следующей формуле:
𝐿(𝑥)=
()
()()
()
.
Результат — значение полинома Lk(x), которое возвращается как тип
double.
b) Функция бинарного поиска позиции вставки
На вход подается указатель на массив точек, текущая точка для
вставки, а также нижняя и верхняя границы диапазона поиска.
Функция сравнивает текущую точку со средним элементом в интервале
и определяет, в какой половине диапазона продолжать поиск. Поиск
продолжается до тех пор, пока не будет найдена подходящая позиция для
вставки элемента. Возвращаемое значение — индекс позиции, на которую
следует вставить элемент.
c) Функция сортировки массива точек
На вход подается указатель на массив точек и количество точек n.
Проход осуществляется по всему массиву начиная со второго элемента.
Для каждого элемента с помощью функции бинарного поиска находится
позиция для вставки в уже отсортированную часть массива. Элементы справа
от найденной позиции сдвигаются вправо, освобождая место для вставки
текущего элемента. После обработки всех элементов массив становится
полностью отсортированным по возрастанию x.
d) Функция решения системы линейных уравнений методом
Гаусса
На вход подается матрица коэффициентов A, вектор свободных членов
b, размер системы n и выходной массив решений x.
На этапе прямого хода выполняется преобразование матрицы к
верхнетреугольному виду:

1. На каждом шаге ищем строку с максимальным по модулю элементом в
текущем столбце (для устойчивости к нулевым элементам).
2. Меняем текущую строку со строкой, содержащей ведущий элемент.
3. Делим всю строку на ведущий элемент, чтобы получить 1 на
диагонали.
4. Вычитаем текущую строку из всех нижележащих строк с
коэффициентом, чтобы обнулить элементы под диагональю.
На этапе обратного хода:
1. Начинаем с последней строки, где осталась только одна переменная:
𝑏
𝑎
,
− 𝑎
,
𝑎
,
∙ 𝑥
2. Подставляем найденные 𝑥,𝑥
𝑥
=
𝑥=
, … в вышестоящие строки:
𝑏
3. Повторяем до первой строки.
e) Функция вычисления коэффициентов аппроксимирующего
полинома Лаггера методом наименьших квадратов
Метод наименьших квадратов (МНК) минимизирует сумму квадратов
отклонений между теоретическими (модельными) значениями и реальными
(экспериментальными) данными:
𝑎 𝐿(𝑥))
𝑆(𝑎,𝑎,…, 𝑎
)
=
(𝑦−
1. Формируется система уравнений из условия
𝐿(𝑥)(𝑦−
𝑎𝐿(𝑥)) =0
→𝑚𝑖𝑛
= 0 для всех k:
2. Получаем СЛАУ:
𝑎
〈
𝐿,𝐿
〉
= 〈𝑦, 𝐿
〉
, 𝑘=0, …, 𝑚
где:
〈
𝐿,𝐿
〉
=
𝐿(𝑥)𝐿(𝑥)
〈
𝑦, 𝐿
3. Полученная система имеет вид:
〉
=
𝑦𝐿(𝑥)

〈
𝑎
𝐿,𝐿
〈
𝑎
𝐿,𝐿
〉
〉
+ 𝑎
+ 𝑎
〈
〈
𝐿,𝐿
𝐿,𝐿
〉
+ ⋯+ 𝑎
〉
+ ⋯+ 𝑎
〈
𝐿,𝐿
〈
𝐿,𝐿
〉
= 〈𝑦, 𝐿
〉
= 〈𝑦, 𝐿
…
𝑎
〈
𝐿,𝐿
〉
+ 𝑎
〈
𝐿,𝐿
〉
+ ⋯+ 𝑎
〈
𝐿,𝐿
〉
= 〈𝑦, 𝐿
В матричной форме:
𝐺𝑎=𝑏
где:
G – матрица Грама с элементами 𝐺= 〈𝐿,𝐿
b – вектор правой части с элементами 𝑏= 〈𝑦, 𝐿
〉
〉
a – вектор искомых коэффициентов (𝑎,𝑎,…, 𝑎)
4. Решаем систему методом Гаусса (через функцию решения системы
уравнений методом Гаусса)
3. Описание переменных
〉
〉
〉
Наименование Функциональное
значение
points Указатель на массив точек
(x, y)
num_points Количество точек int 0 до 2 147
order Порядок полинома int 0 до 2 147
coefficients Массив коэффициентов
аппроксимирующего
полинома
input_filename Буфер для хранения имени
входного файла
coefficients_filename Имя файла для сохранения
коэффициентов
Тип Диапазон
типа
Point* — 16 байт
483 647
483 647
double* — 8 байт
char -128 до 127 1 байт
char -128 до 127 1 байт
Ёмкость
переменной
4 байта
4 байта
plot_data_filename Имя файла для данных
графика
input_file Указатель на открытый
файл с исходными данными
x, y Временные переменные для
чтения координат из файла
k Порядок текущего
полинома Лаггера
char -128 до 127 1 байт
FILE* — —
double -1,7×10
1,7×10
int 0 до
2 147 483 64
7
308
+308
до
8 байт
4 байта

x (в laguerre) Точка, в которой
вычисляется полином
double -1,7×10
1,7×10
308
+308
до
8 байт
L0, L1, Lk Промежуточные значения
полиномов при
рекуррентном вычислении
low, high, mid Индексы для реализации
бинарного поиска
item Элемент, который
вставляется в
отсортированную часть
массива
A Матрица системы
уравнений для МНК
b
n
Вектор правой части
системы уравнений
Размерность системы
уравнений
double
-1,7×10
1,7×10
int 0 до
2 147 483 64
7
Point —
double** —
double*
int
—
0 до
2 147 483 64
7
308
+308
8 байт
до
4 байта
16 байт
8 байт (на
указатель)
8 байт
4 байта
max_row
Индекс строки с
максимальным элементом в
столбце
factor Коэффициент для
исключения переменной в
Гауссе
file
Указатель на файл для
записи результатов
3. Блок-схемы
int
double
FILE*
0 до
2 147 483 64
7
-1,7×10
1,7×10
308
+308
до
—
4 байта
8 байт
8 байт

Блок-схема основной программы main()

Нет
Нет

Блок-схема подпрограммы laguerre(k, x)
Блок-схема подпрограммы binary_search(*points, item, low, high)

Блок-схема подпрограммы binary_insertion_sort(*points, n)
Соседние файлы в папке Лабы
