Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аппроксимация методом наименьших квадратов с использованием сингулярного разложения на Haskell.docx
Скачиваний:
0
Добавлен:
02.01.2026
Размер:
1.01 Mб
Скачать

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_).