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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2017, 17:49   #1
S.Geopgiy
Новичок
Джуниор
 
Регистрация: 23.11.2017
Сообщений: 2
По умолчанию С++ Ряд фурье

Проблема с разложением в ряд функции.
Задача: Задавать линейную функцию вручную и нажатием кнопки раскладывать в ряд фурье с отрисовкой.
Проблема: Ряд не соответствует "приблизительно реальному", функция ряда не останавливает прорисовку после конечного значения Х(от 50 до 550)
Работаю в программе RAD Studio XE8
Буду благодарен какой-либо помощи) ;D
Код программы:
Код:
#include <vcl.h>
#pragma hdrstop
#include "math.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int X0,Y0,X1,Y1;
float pi,S,A[11],B[11],F;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
		: TForm(Owner)
{ int i;
Form1->Image1->Canvas->Brush->Color=RGB(255,255,255);
Form1->Image1->Canvas->FillRect(Rect(0,0,Form1->Image1->Width, Form1->Image1->Height));
Form1->Image1->Canvas->Pen->Color=RGB(0,0,0);
Form1->Image1->Canvas->MoveTo(50,50);
Form1->Image1->Canvas->LineTo(50,450);
Form1->Image1->Canvas->MoveTo(50,250);
Form1->Image1->Canvas->LineTo(550,250);
Form1->Image1->Canvas->Font->Color=RGB(0,0,0);
Form1->Image1->Canvas->Pen->Color=RGB(70,70,70);
for (int x=1;x<=5;x++)
		{
		Form1->Image1->Canvas->MoveTo(50,250-40*x);
        Form1->Image1->Canvas->LineTo(550,250-40*x);
        Form1->Image1->Canvas->MoveTo(50,250+40*x);
		Form1->Image1->Canvas->LineTo(550,250+40*x);
		Form1->Image1->Canvas->TextOutW(20,240-40*x, FloatToStrF(x/5.0,ffGeneral,2,2));
		Form1->Image1->Canvas->TextOutW(20,240+40*x, FloatToStrF(-x/5.0,ffGeneral,2,2));
		}
Form1->Image1->Canvas->TextOutW(20,240,"0");
for (int x=1;x<=10;x++){
		Form1->Image1->Canvas->MoveTo(50+50*x,50);
        Form1->Image1->Canvas->LineTo(50+50*x,450);
	    Form1->Image1->Canvas->TextOutW(40+50*x,260, FloatToStrF(x/10.0,ffGeneral,2,2)+"*T");
		}
Form1->Image1->Canvas->Pen->Color=RGB(255,0,0);
X0=50;
Y0=250;
for (i=1; i <= 11; i++)
{
A[i]=0;
B[i]=0;
}
S=0;
F=0;
pi=3.141592654;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
		  int Y)
{
X1=X;
Y1=Y;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
		  int X, int Y)
{
int i;
if (X0>=X1)
		return;
Form1->Image1->Canvas->MoveTo(X0,Y0);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->Ellipse(X1-3,Y1-3,X1+3,Y1+3);
Form1->Memo1->Lines->Clear();
Form1->Memo2->Lines->Clear();
Form1->Memo3->Lines->Clear();
for (X=X0;X<X1;X++)
	{
	S=S+(X-X0)*((-Y1+250)/200.0-(-Y0+250)/200.0)/(X1-X0)+(-Y0+250)/200.0;
	}
for (i=1; i <= 11; i++)
	{
	for (X=X0;X<X1;X++)
		{
		A[i]=A[i]+((X-X0)*((-Y1+250)/200.0-(-Y0+250)/200.0)/(X1-X0)+(-Y0+250)/200.0)*sin(i*2.0*pi*(X-50)/(500.0));
		B[i]=B[i]+((X-X0)*((-Y1+250)/200.0-(-Y0+250)/200.0)/(X1-X0)+(-Y0+250)/200.0)*cos(i*2.0*pi*(X-50)/(500.0));
		}
	}
Form1->Memo2->Lines->Add(FloatToStrF(S*1.0/((X1-50.0)),ffGeneral,2,2));
Form1->Memo3->Lines->Add(FloatToStrF(S*1.0/((X1-50.0)),ffGeneral,2,2));
for (i=1; i <= 11; i++)
	{
	Form1->Memo2->Lines->Add(FloatToStrF(A[i]*2.0/(X1-50.0),ffGeneral,2,2));
	Form1->Memo3->Lines->Add(FloatToStrF(B[i]*2.0/(X1-50.0),ffGeneral,2,2));
	}
for (i=0;i<=11;i++)
		{
		Form1->Memo1->Lines->Add(IntToStr(i));
		}
X0=X1;
Y0=Y1;


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int X,i;
int x0,y0,x1,y1;
x0=50;
y0=250;
Form1->Image1->Canvas->Pen->Width=3;
Form1->Image1->Canvas->Pen->Color=RGB(0,255,0);
for (X=x0; X <=X1; X++)
		{
		for (i=1; i <= 11; i++)
		{
		F=F+A[i]*sin(i*2.0*pi*(X-50.0)/(500))+B[i]*cos(i*2.0*pi*(X-50.0)/(500));
		}
		F=(-F-S)+250;
		Form1->Image1->Canvas->MoveTo(x0,y0);
		Form1->Image1->Canvas->LineTo(X,F);
		x0=X;
		y0=F;
		F=0;
		}

}
//---------------------------------------------------------------------------
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 23.11.2017 в 18:20.
S.Geopgiy вне форума Ответить с цитированием
Старый 23.11.2017, 18:01   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Начните с того, что все массивы нумеруются с 0.
p51x вне форума Ответить с цитированием
Старый 23.11.2017, 19:07   #3
S.Geopgiy
Новичок
Джуниор
 
Регистрация: 23.11.2017
Сообщений: 2
По умолчанию

Изменил, но это не повлияло на работу программы, и не должно было просто значения теперь считаются для массива от 0 до 10. а раньше просто не был задействован 0 номер массива.. В чем-то еще серьезная ошибка, и не понимание языка.
S.Geopgiy вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разложение в ряд фурье(С/С++) Lyt Помощь студентам 2 19.12.2011 23:38
Ряд Фурье (Паскаль) МартинИ Помощь студентам 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