Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2014, 08:37   #1
Vnuchka
Новичок
Джуниор
 
Регистрация: 09.04.2014
Сообщений: 4
По умолчанию Аппроксимация тригонометрическим полиномом. C++

В общем, есть некая функция у = f(x), провели ряд измерений и получили n точек x и y.
Нужно найти аппроксимацию данной функции тригонометрическим полиномом. (Если я все правильно понимаю, каждую точку пересчитать с помощью неких формул).
Может кто-то уже сталкивался с подобным или есть какие примеры.
Буду благодарна за любую помощь.
Vnuchka вне форума Ответить с цитированием
Старый 09.04.2014, 10:26   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

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

Первая ж ссылка со всеми подробностями, что вам не хватило?
p51x вне форума Ответить с цитированием
Старый 09.04.2014, 10:42   #3
Vnuchka
Новичок
Джуниор
 
Регистрация: 09.04.2014
Сообщений: 4
По умолчанию

Насколько мне известно, интерполяция и аппроксимация - это немного разные вещи.
Собственно, помощь требуется в следующем. У меня уже есть написанная аппроксимация полиномом n степени. Можно ли его просто переделать в аппроксимацию тригономертическим полиномом.
То есть просто составить новую систему уравнений, только уже с синусами/косинусами, а вычислять коэф-ты, решая систему Методом Гаусса.
Или получится бред.
//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/////////////////////////////////

Последний раз редактировалось Vnuchka; 09.04.2014 в 10:54.
Vnuchka вне форума Ответить с цитированием
Старый 09.04.2014, 13:03   #4
Vnuchka
Новичок
Джуниор
 
Регистрация: 09.04.2014
Сообщений: 4
По умолчанию

Выше представленная аппроксимация считается по МНК. По сути, если я правильно все понимаю, нам не важно каким полиномом аппроксимировать? То есть я могу степенной полином заменить нужным мне тригонометрическим и все?
Vnuchka вне форума Ответить с цитированием
Старый 11.04.2014, 13:08   #5
Vnuchka
Новичок
Джуниор
 
Регистрация: 09.04.2014
Сообщений: 4
По умолчанию

Попробовала аппроксимировать рядом Фурье.
Что-то получается, но есть ошибки. а0 не верно считает, и возможно коэфф-ты не верны.
может что толкового посоветуете?
Код:
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(k*apr_x[ii])+b[jj2]*sin(jj2*apr_x[ii]);
		}
	
}
Vnuchka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с полиномом C# JinAnton Помощь студентам 12 07.06.2011 08:56
работа с полиномом! C# JinAnton Помощь студентам 0 04.06.2011 16:57
Интерполяция полиномом Ньютона Igolka6662 Помощь студентам 1 26.11.2010 19:22
CRC c полиномом MODBUS Gawwws Microsoft Office Excel 2 27.02.2010 00:10
Помогите....с полиномом! alisa87 Общие вопросы C/C++ 1 26.05.2009 16:13