- •Федеральное государственное бюджетное образовательное учреждение высшего образования "Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М.А. Бонч-Бруевича"
- •По лабораторной работе №7
- •Постановка задачи
- •1. Структура данных и функциональные компоненты
- •2. Загрузка и предварительная обработка данных
- •3. Сортировка данных
- •4. Выбор степени аппроксимирующего полинома
- •5. Аппроксимация методом наименьших квадратов
- •6. Оценка качества аппроксимации
- •7. Генерация точек для построения графика
- •Перечень функций
- •1. Функции чтения и разбора входных данных
- •Блок-схемы
- •Проверка функционала программы
- •Код программы
2. Загрузка и предварительная обработка данных
Программа считывает данные из файла, имя которого вводится пользователем. Алгоритм обработки входного файла включает:
построчное чтение данных;
преобразование строк в пары чисел;
игнорирование некорректных строк.
Далее выполняется удаление дубликатов:
если точки имеют одинаковое значение и одинаковое
,
они считаются полными дубликатами и
игнорируются;если значения совпадают, но различаются — фиксируется неоднозначность, и такая точка исключается с выводом предупреждения.
3. Сортировка данных
После удаления дубликатов точки сортируются по возрастанию координаты . Для сортировки используется метод сортировки перемешиванием (shaker sort), который является двунаправленной модификацией пузырьковой сортировки и обеспечивает корректную упорядоченность данных.
4. Выбор степени аппроксимирующего полинома
Пользователь
вводит степень полинома
.
Программа выполняет проверку корректности
ввода:
степень должна быть неотрицательной;
выполняется условие
,
где
—
количество точек;при слишком высокой степени выводится предупреждение о возможной некорректной аппроксимации.
Максимально
допустимая степень полинома определяется
как
.
5. Аппроксимация методом наименьших квадратов
Для
вычисления коэффициентов аппроксимирующего
полинома используется метод наименьших
квадратов. Формируется матрица Вандермонда
,
где каждый элемент определяется как
.
Вектор правых частей содержит значения
.
Система уравнений решается с использованием сингулярного разложения (SVD), что обеспечивает устойчивость вычислений и позволяет корректно работать даже при плохо обусловленных данных.
Результатом является вектор коэффициентов полинома:
6. Оценка качества аппроксимации
Для оценки точности аппроксимации вычисляются следующие характеристики:
SSE — сумма квадратов ошибок;
MSE — среднеквадратичная ошибка;
RMSE — корень из MSE.
Также выводится сравнение исходных значений функции и аппроксимированных значений в заданных точках.
7. Генерация точек для построения графика
Пользователь задаёт количество точек, которые необходимо вычислить на интервале от минимального до максимального значения . Для равномерно распределённых значений аргумента вычисляются соответствующие значения аппроксимирующего полинома. Полученные точки сохраняются в файл для последующего построения графика во внешних программах (например, Excel).
Перечень функций
Для реализации программы были определены следующие функции, разделенные по функциональным группам:
1. Функции чтения и разбора входных данных
readPoints :: FilePath -> IO [Point] Считывает пары координат из файла и возвращает список точек.
Вспомогательные функции (локальные, но реализованы явно):
parseLines :: [String] -> [Point] — преобразует список строк в список точек;
parseLine :: String -> Maybe Point — разбирает одну строку файла;
mapMaybe :: (a -> Maybe b) -> [a] -> [b] — фильтрация и отображение списка.
2. Обработка дубликатов и неоднозначности
removeDuplicates :: [Point] -> IO [Point] - удаляет дубликаты по , контролирует неоднозначность значений .
Вспомогательные функции:
processPoint — пошаговая обработка очередной точки;
findSimilarX :: Double -> [Point] -> Maybe Point — поиск точки с тем же (с учётом погрешности).
3. Сортировка перемешиванием
shakerSort :: [Point] -> [Point] - сортировка точек по возрастанию координаты .
Вспомогательная функция:
shakerSort' — рекурсивная реализация алгоритма сортировки.
4. Проверка корректности аппроксимации
canApproximate :: Int -> Int -> Bool - проверка возможности аппроксимации при заданной степени полинома.
maxPossibleDegree :: Int -> Int - вычисляет максимально допустимую степень полинома.
5. Аппроксимация методом наименьших квадратов (SVD)
leastSquaresSVD :: [Point] -> Int -> Vector Double - вычисляет коэффициенты аппроксимирующего полинома методом наименьших квадратов с использованием SVD.
6. Работа с полиномом
evalPolynomial :: Vector Double -> Double -> Double - вычисляет значение аппроксимирующего полинома в заданной точке.
7. Генерация точек для построения графика
generateGrid :: Double -> Double -> Int -> [Double] - генерирует равномерную сетку значений аргумента.
createGraphPoints :: Vector Double -> Double -> Double -> Int -> [(Double, Double)] - формирует точки для визуализации аппроксимации.
8. Форматирование и вывод результатов
formatPoints :: [(Double, Double)] -> String - преобразует список точек в текстовый формат для сохранения в файл.
9. Управляющие и служебные функции
main :: IO () - главная функция программы, управляющая логикой выполнения.
forM_ :: Monad m => [a] -> (a -> m b) -> m () - вспомогательная функция для последовательного выполнения действий (аналог стандартной forM_).
