Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 3

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

09.04.2014, 13:54. Показов 5592. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи программисты! Очень надеюсь на вашу помощь, так как диплом на носу, а этот кусок очень поможет получить заветное "Отл".
В общем, есть некая функция у = 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/////////////////////////////////
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2014, 13:54
Ответы с готовыми решениями:

Аппроксимация полиномом второй степени, используя МНК
Здравствуйте. В университете прохожу курс чисельных методов и в одной из лабораторных поставлена такая задача: Аппроксимировать табличные...

Аппроксимация НЕ полиномом
Здравствуйте, мне нужно аппроксимировать экспериментальные данные ф-цией вида A*x+B*(x^1/2), поэтому функция polyfit не подходит. Скажите,...

Аппроксимация полиномом
Доброе время суток, возникла задача аппроксимации полиномом n-степени. У меня есть набор точек, нужно подобрать кривую которая описывала...

4
76 / 78 / 41
Регистрация: 23.03.2011
Сообщений: 148
09.04.2014, 14:26
не факт что будет правильно апроксимировать, нужно смотреть сам метод и допустимо ли там смена вида базисных функций
в вашем случае можно к примеру апроксимировать рядом фурье, все данные для него у вас есть, только следует учитывать что квадратурную формулу для вычисления коэфицентов нужно строить по полученным ранее узлами (xi,yi)
1
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 3
09.04.2014, 14:52  [ТС]
Спасибо за ответ.
Возник еще один глупый вопрос.
Аппроксимировать тригонометрическими функциями (рядом Фурье) можно же только периодические функции?

Добавлено через 16 минут
Вопрос отпал. Еще раз спасибо за ответ.
0
0 / 0 / 0
Регистрация: 09.04.2014
Сообщений: 3
11.04.2014, 13:12  [ТС]
Попробовала аппроксимировать рядом Фурье.
Что-то получается, но есть ошибки. а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%B5.htm
0
0 / 0 / 0
Регистрация: 09.07.2015
Сообщений: 34
08.11.2015, 22:00
Vnuchka, можно взглянуть на код целиком?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.11.2015, 22:00
Помогаю со студенческими работами здесь

Аппроксимация степенным полиномом
Всем доброго времени суток! помогите пожалуйста написать код по формуле что-то не получается H=p1B+p2B^3 B=q1H+q2H^3 Аппроксимация...

Точная аппроксимация полиномом
Подскажите пожалуйста, как аппроксимировать экспериментальные данные полиномом, чтобы он проходил через все точки. При этом стоит задача...

Аппроксимация функции полиномом
У меня дана приближающая функция y=x/(a*x+b), и массив иксов и игреков(таблично заданная функция) Нужно самому расписать эту...

Аппроксимация полиномом 3-й степени
Помогите, пожалуйста, переписать программу, не используя встроенную функцию 'spline' t=; p=; x=t; y=p; plot(x,y,'o'); ...

Аппроксимация полиномом Чебышева
Всем привет. Прежде чем написать сюда, потратил почти сутки на поиск информации. Нашел много чего но понял - мало... интересует...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru