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

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

03.10.2024, 16:53. Показов 1009. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2024, 16:53
Ответы с готовыми решениями:

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

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

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

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

0
03.10.2024, 16:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2024, 16:53
Помогаю со студенческими работами здесь

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

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

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

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

Аппроксимация
Допустим, имеем два датчика холла, один из которых формирует импульсы с шестерни первичного вала,...

Аппроксимация
Задача:аппроксимировать заданную табличную зависимость x__ y 1.0_ 3.1 2.0_ 3.8 3.0_ 3.7 4.0_...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru