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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2011, 22:54   #1
Lyt
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 12
Лампочка разложение в ряд фурье(С/С++)

Собственно делаю курсач. тема - аппроксимация данного сигнала. сигнал дан в виде равнобедренной трапеции. Требования к реализации несколько диковаты - интерфейс(окошечки, кнопочки) надо сделать на Матлабе. Из программы на матлабе параметры (амплитуда,период,длительность сигнала) записываются в текстовой файл, после чего запускается программа на С/С++(работаю в 6 visual studio), которая считывает эти параметры из текстового файла, и раскладывает этот сигнал в гармонический ряд.Т.е. на выходе я должен получить массив из значений этого гармонического ряда, который надо записать в очередной текстовой файл.После этого продолжает свою работу прога на матлабе, которая считывает этот массив из файла и используя его строит график аппроксимации. Почему нельзя все сделать просто на матлабе?!
Я сделал первую часть на матлабе. приступил ко второй - к проге на Си. пока добился только считывания с файла параметров сигнала. Далее надо делить этот сигнал на 3 куска, и раскладывать в фурье каждый кусок. и вроде за пару дней я осознал как это делать, но чо то оно не работает, бред выдает в итоге
вот код всего что я сделал на Си. По-хорошему, после выполнения, я должен получить в массиве appr_znach[] значения по которым строится график для 1 куска сигнала (т.е. для наклонного куска трапеции / )
Код:
#include <iostream.h>
#include <fstream.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>

double integ(double,double,double,double,double,double,double,int);

double main()
{
	int i=0;
	double mas[3],A,T,t;
	char s[31];
	//открываем файл parametrs.txt с параметрами данного сигнала
	FILE*f;
	f=fopen("parametrs.txt","rt");
	while (!feof(f))
	{
		fgets(s,30,f);
		mas[i]=atof(s);
		i++;
	}
	fclose(f);
	//полученные параметры из файла:
	A=mas[0];
	T=mas[1];
	t=mas[2];
	cout<<A<<endl<<T<<endl<<t<<endl;
	getch();

	//appr_znach - массив значений аппроксимации
	double appr_znach[500];
	t=t/3;
	//для 1 части сигнала
	for(double x=T-3*t;x<(T-2*t);x+=0.01)
	{
		double a=T-3*t,b=T-2*t,sum=0;
		sum+=(1/t)*integ(A,T,t,a,b,1,10,1);
		cout<<sum<<endl; //sum=a0/2
		getch();

		for(int k=1;k<=3;k++) //k - кол-во членов в сумме ряда
		{
			sum+=(1/t)*cos(x*k*3.14/t)*integ(A,T,t,a,b,k,10,2);
		}
		appr_znach[i]=sum;// получили массив значений для 1 части сигнала
		i++;
	}
	for(int q=0;q<=100;q++)
	cout<<endl<<appr_znach[q];
getch();

}

double integ(double A,double T,double t,double a,double b,double k,double n, int flag)
{
	// a,b -начало и конец отрезка для интегрирования, n - число точек
	// flag - условие выбора функции для интегрирования
	double s=0,h=(b-a)/n,xx;
	
	for (xx=a; xx<=b; xx+=h)
 	{
	 switch(flag)
	 {
	 case 1:
		 s+=(A*xx/t+3*A-T*A/t) * h;
		 break;
	 case 2:
		 s+= (A*xx/t+3*A-T*A/t)*cos(xx*k*3.14/t)*h;
		 break;
	 case 3:
		 s+=A*h;
		 break;
	 case 4:
		 s+=A*cos(xx*k*3.14/t)*h;
		 break;
	 case 5:
		 s+=(-A*xx/t+T*A/t)*h;
		 break;
	 case 6:
		 s+=(-A*xx/t+T*A/t)*cos(xx*k*3.14/t)*h;
		 break;
	 }
	 return s;
	 }
}
Приветствуется любая помощь Хотелось бы понять что я делаю не так. Если предложите более легкие варианты решения задачи в целом, - буду только рад,так как программист из меня так себе)
Lyt вне форума Ответить с цитированием
Старый 19.12.2011, 23:01   #2
Lyt
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 12
По умолчанию

Да, в Output'e вылезает следующее:
Цитата:
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
The thread 0xFC8 has exited with code -1073741510 (0xC000013A).
The thread 0x540 has exited with code -1073741510 (0xC000013A).
The program 'C:\Program Files\Microsoft Visual Studio\MyProjects\kurs\Debug\approc simationC.exe' has exited with code -1073741510 (0xC000013A).
А вот здесь
Код:
cout<<sum<<endl; //sum=a0/2
почему то получаю нули

Последний раз редактировалось Lyt; 19.12.2011 в 23:09.
Lyt вне форума Ответить с цитированием
Старый 19.12.2011, 23:38   #3
Lyt
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 12
По умолчанию

да, никакие дискретные и быстрые преобразования фурье мне не нужны
мне нужно просто подсчитать сумму из ряда с определенным числом членов
Lyt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ряд Фурье (Паскаль) МартинИ Помощь студентам 5 05.06.2011 16:28
ряд Фурье radiokarazinec Помощь студентам 0 02.03.2011 17:36
Тригонометрический ряд Фурье в Matlab VIKusiK91 Помощь студентам 0 10.06.2010 14:29
ряд Фурье(Delphi,график) menX Помощь студентам 1 23.04.2009 21:26
Разложение в ряд Маклорена Mari Помощь студентам 2 03.02.2008 23:23