Форум программистов, компьютерный форум CyberForum.ru

Аппроксимация тригонометрическим полиномом - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Vnuchka
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 3
09.04.2014, 13:54     Аппроксимация тригонометрическим полиномом #1
Здравствуйте, товарищи программисты! Очень надеюсь на вашу помощь, так как диплом на носу, а этот кусок очень поможет получить заветное "Отл".
В общем, есть некая функция у = f(x), провели ряд измерений и получили n точек x и y.
Нужно найти аппроксимацию данной функции тригонометрическим полиномом. (Если я все правильно понимаю, каждую точку пересчитать с помощью неких формул). Так как раньше никогда не сталкивалась с данного рода задачами, возникли трудности в реализации, точнее даже не знаю с чего начать.
Может кто-то уже сталкивался с подобным или есть какие примеры.
Буду благодарна за любую помощь.

Добавлено через 5 часов 27 минут
Есть вот аппроксимация полиномом n степени по МНК. По сути, если я правильно все понимаю, нам не важно каким полиномом аппроксимировать? То есть я могу степенной полином заменить нужным мне тригонометрическим и все?
Или так не получится?

C++
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
//apprrrrrrrrrrrrr///////////////////////////////
 
double *apr_b, *apr_x, *apr_y, **apr_sums;
int apr_N;
//N - кол-во шагов
//K - степень
 
void allocmatrix(){
 
int i,j;
apr_a = new double[apr_K+1];
apr_b = new double[apr_K+1];
apr_sums = new double*[apr_K+1];
 
for(i=0; i<apr_K+1; i++){
apr_sums[i] = new double[apr_K+1];
 
}
for(i=0; i<apr_K+1; i++){
apr_a[i]=0;
apr_b[i]=0;
for(j=0; j<apr_K+1; j++){
apr_sums[i][j] = 0;
}
}
 
}
 
 
 
void readmatrix(){
int i=0,j=0, k=0;
 
for(i=0; i<apr_K+1; i++){
for(j=0; j<apr_K+1; j++){
apr_sums[i][j] = 0;
for(k=0; k<apr_N; k++){
apr_sums[i][j] += pow(apr_x[k], i+j); то есть эту строку поменять
}
}
}
for(i=0; i<apr_K+1; i++){
for(k=0; k<apr_N; k++){
apr_b[i] += pow(apr_x[k], i) * apr_y[k]; эту тоже
}
}
}
 
 
void diagonal(){
int i, j, k;
float temp=0;
for(i=0; i<apr_K+1; i++){
if(apr_sums[i][i]==0){
for(j=0; j<apr_K+1; j++){
if(j==i) continue;
if(apr_sums[j][i] !=0 && apr_sums[i][j]!=0){
for(k=0; k<apr_K+1; k++){
temp = apr_sums[j][k];
apr_sums[j][k] = apr_sums[i][k];
apr_sums[i][k] = temp;
}
temp = apr_b[j];
apr_b[j] = apr_b[i];
apr_b[i] = temp;
break;
}
}
}
}
}
 
 
void approxn1(){
int i=0,j=0, k=0;
allocmatrix();
//read data from file
readmatrix();
//check if there are 0 on main diagonal and exchange rows in that case
diagonal();
 
for(k=0; k<apr_K+1; k++){
for(i=k+1; i<apr_K+1; i++){
double M = apr_sums[i][k] / apr_sums[k][k];
for(j=k; j<apr_K+1; j++){
apr_sums[i][j] -= M * apr_sums[k][j];
}
apr_b[i] -= M*apr_b[k];
}
}
 
for(i=(apr_K+1)-1; i>=0; i--){
double s = 0;
for(j = i; j<apr_K+1; j++){
s = s + apr_sums[i][j]*apr_a[j];
}
apr_a[i] = (apr_b[i] - s) / apr_sums[i][i]; 
}
 
}
 
//end apprrrr/////////////////////////////////
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2014, 13:54     Аппроксимация тригонометрическим полиномом
Посмотрите здесь:

Аппроксимация С++ C++
Кусочно-линейная аппроксимация C++
C++ Кусочно-линейная аппроксимация
Интерполяция полиномом Лагранжа C++
C++ Аппроксимация.Линейная интерполяция
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kiborgdelto
70 / 72 / 27
Регистрация: 23.03.2011
Сообщений: 141
09.04.2014, 14:26     Аппроксимация тригонометрическим полиномом #2
не факт что будет правильно апроксимировать, нужно смотреть сам метод и допустимо ли там смена вида базисных функций
в вашем случае можно к примеру апроксимировать рядом фурье, все данные для него у вас есть, только следует учитывать что квадратурную формулу для вычисления коэфицентов нужно строить по полученным ранее узлами (xi,yi)
Vnuchka
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 3
09.04.2014, 14:52  [ТС]     Аппроксимация тригонометрическим полиномом #3
Спасибо за ответ.
Возник еще один глупый вопрос.
Аппроксимировать тригонометрическими функциями (рядом Фурье) можно же только периодические функции?

Добавлено через 16 минут
Вопрос отпал. Еще раз спасибо за ответ.
Vnuchka
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 3
11.04.2014, 13:12  [ТС]     Аппроксимация тригонометрическим полиномом #4
Попробовала аппроксимировать рядом Фурье.
Что-то получается, но есть ошибки. а0 не верно считает, и возможно коэфф-ты не верны.
Посмотрите/помогите пожалуйста, может кто сталкивался с подобным.
C++
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
apr_x, apr_y - координаты по х и y.
NSteps - кол-во шагов;
double l=(10+10)/2 период;
pa-степень аппроксимации.
const double pi = 3.1415926535897932384626433832795;
double a[12],b[12];
int ia,ja,ka,pa=6;
for (ka=1;ka<pa;ka++)
{
    a[ka]=0;b[ka]=0;
    for(ia=0;ia<NSteps;ia++)
    {   
        a[ka]=a[ka]+apr_y[ia]*cos(2*ka*pi*ia/(NSteps-1));
        b[ka]=b[ka]+apr_y[ia]*sin(2*ka*pi*ia/(NSteps-1));
    }
    a[ka]=2*a[ka]/(NSteps+1);
    b[ka]=2*b[ka]/(NSteps+1);
}
a[0]=0;
for(ia=0;ia<NSteps;ia++)
{
    a[0]=a[0]+apr_y[ia];
}
a[0]=a[0]/(NSteps+1);
 
for (ii = 0; ii< NSteps; ii++)
{
    apr_y_res[ii] = 0; 
    
    apr_y_res[ii] =a[0]/2;
    for (int jj2=1;jj2<pa;jj2++)
        {
            apr_y_res[ii] = apr_y_res[ii] + a[jj2]*cos(jj2*apr_x[ii])+b[jj2]*sin(jj2*apr_x[ii]);
        }
    
}
Добавлено через 19 часов 13 минут
алгоритм брала отсюда: http://shpora.gixx.ru/shpory/%D0%A1%...1%8C%D0%B5.htm
Exclusive048
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 34
08.11.2015, 22:00     Аппроксимация тригонометрическим полиномом #5
Vnuchka, можно взглянуть на код целиком?
Yandex
Объявления
08.11.2015, 22:00     Аппроксимация тригонометрическим полиномом
Ответ Создать тему
Опции темы

Текущее время: 01:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru