1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 90

Аппроксимация

03.10.2024, 16:53. Показов 1043. Ответов 0
Метки c++, gsl, qt (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!
Опишу процесс аппроксимации: есть два списка x и y, которые содержат "сырые" точки, которые нужно аппроксимировать. Допустим, количество точек 200. Я делю эти 200 точек на 10 равных участков, добавляю к началу текущего участка 2 последние точки предыдущего участка (если это не первый участок) и к концу текущего участка 2 первые точки следующего участка (если это не последний десятый участок). В итоге получается размер первого отрезка 22, второго - 24, третьего - 24, ... , десятого - 22. Далее произвожу аппроксимацию для каждого отрезка.
Хочу сразу предупредить, что аппроксимация работает правильно.
Но при сшивании отрезков получается наложение "крючков" (миниатюра 1). Красная линия - изначальная (сырая) функция, жёлтая - аппроксимация, чёрная линия - то, как идут точки аппроксимации конца предыдущего отрезка, белая линия - то, как идут точки аппроксимации начала следующего отрезка.
Можно конечно убрать пересечения участков в более чем одной точке, но тогда будет такая ситуация (рисунок 1).
Поэтому я делаю аппроксимацию отрезков с пересечением двух точек (рисунок 2). Но при таком способе происходит наложение аппроксимирующих функций. Вот, собственно, и хочу правильно их "склеить", чтобы была красивая гладкая функция (рисунок 3). Причем интересно то, что каждый раз количество точек пересечения одинаково, но всегда меняется количество точек справа и слева (миниатюра 2).

P.S. На использование библиотеки GSL не обращайте внимание, она просто ищет аппроксимирующий полином

C++ (Qt) Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    x1.clear(); // лист с точками аппроксимации по абциссе 
    y1.clear(); // лист с точками аппроксимации по ординате
 
    int degree=10; // количество участков на которое делится первоначальная функция
    int partSize=x.size()/degree; // размер участка
 
    for (int p=0;p<degree;p++)
    {
        double diskret=1./1e4; // дискретизация аппроксимирующей функции
        int additional=2; // количество точек первоначальной функции, которое добавляется с каждой стороны дополнительно к основному отрезку
        int start=(p==0) ? p*partSize : p*partSize-additional;
        int end=(p==degree-1) ? x.size() : (p+1)*partSize+additional;
 
        QList <double> x_part(x.begin()+start,x.begin()+end); // лист с дополнителными точками
        QList <double> y_part(y.begin()+start,y.begin()+end); // лист с дополнителными точками
 
        ///////////// поиск аппроксимирующего полинома
        int n=x_part.size();
        gsl_matrix *X=gsl_matrix_alloc(n,6);
        gsl_vector *yv=gsl_vector_alloc(n);
        gsl_vector *c=gsl_vector_alloc(6);
        gsl_matrix *cov=gsl_matrix_alloc(6,6);
 
        for (int i=0;i<n;i++)
        {
            for (int j=0;j<=5;j++)
            {
                gsl_matrix_set(X,i,j,pow(x_part[i],j));
            }
            gsl_vector_set(yv,i,y_part[i]);
        }
        {
            double chisq;
            gsl_multifit_linear_workspace *work=gsl_multifit_linear_alloc(n,6);
            gsl_multifit_linear(X,yv,c,cov,&chisq,work);
            gsl_multifit_linear_free(work);
        }
        ///////////// 
 
        for (double i=x_part.first();i<=x_part.last();i+=diskret) // построение аппроксимации по полиному
        {
            double y_val=0;
            for (int j=0;j<=5;j++)
            {
                y_val+=gsl_vector_get(c,j)*pow(i,j);
            }
            x1.append(i);
            y1.append(y_val);
        }
 
        gsl_matrix_free(X);
        gsl_vector_free(yv);
        gsl_vector_free(c);
        gsl_matrix_free(cov);
    }
Миниатюры
Аппроксимация   Аппроксимация  
Изображения
   
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2024, 16:53
Ответы с готовыми решениями:

Построение графика по координатам из .txt файла и его линейная аппроксимация (Qt)
Приветствую! По заголовку, необходимо написать программу на С++(желательно в Qt), которая выгружает из .txt файла координаты (данные в виде...

Аппроксимация...
Проблема в следующем...управляю 2-мя шаговыми двигателями...первый выполняет передвижение каретки по горизонтали, второй по...

Аппроксимация
Подскажите или дайте теорию по Аппроксимаци методом наименьших квадратов (графика не нужна) Жду....:(

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2024, 16:53
Помогаю со студенческими работами здесь

Аппроксимация
Ребята помоги с задание, завтра контрольная не могу решить как написать это все в матлабе?:))...

Аппроксимация
Почему при использовании в качестве базиса функций Лагерра, в большинстве случаях погрешность аппроксимации получается больше на краях...

Аппроксимация
Проблема с поиском начальных точек и конечным графиком в Mathcad

Аппроксимация
Здравствуйте, форумчане! Подскажите, пожалуйста, что можно придумать... Есть зависимость I(V) ( ток от напряжения), которая меняется...

Аппроксимация С++
Здравствуйте товарищи программисты. Нужна помощь с курсовиком. Выполнить аппроксимацию в С++ методом левых прямоугольников....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

Новые блоги и статьи
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 03.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер