//--------------------------------------------------------------------------//Подпрограмма вычесляющая коэфициенты ряда Фурье при синусах
float Sim_s(float Em,float T,float f(float t,float Em,float T),int i);
//--------------------------------------------------------------------------//Подпрограмма вычесляющая коэфициенты ряда Фурье при косинусах
float Sim_c(float Em,float T,float f(float t,float Em,float T),int i);
//--------------------------------------------------------------------------//Главная программа
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,k,n;
String st;
float x,y,t=0,e,T,Em,point_t[37],point_e[37];
//Очисткаграфика
Series1->Clear();
Series2->Clear();
//Ввод данных
st=Edit2->Text;
n=StrToInt(st);
st='\0';
st=Edit1->Text;
T=StrToInt(st);
st='\0';
st=Edit3->Text;
Em=StrToInt(st);
st='\0';
StaticText1->Caption="Состояние:";
//Проверка входных параметров
if (T<=0||Em<=0||n<=0||n>100)
{
//Вывод сообщения об ошибке
MessageBox(NULL,"Какой-либо из входных параметров отрицательный."
"Либо число гармоник слишком велико."
"Введите верние параметры(N<=100).","Ошибка",MB_ICONWARNING|MB_OK);
}
else
{
Form1->Cursor=crAppStart;
Button1->Cursor=crAppStart;
StringGrid1->Cursor=crAppStart;
ProgressBar1->Position=0;
ProgressBar1->Max=n;
//Вычисление точек графика импульса
for(i=0;i<=36;i++)
{
point_t[i]=(i*10*T)/360;
point_e[i]=f(point_t[i],Em,T);
}
//Постоение графика импульса
for(i=0;i<=36;i++)
{
Series1->AddXY(point_t[i],point_e[i],"",clRed);
}
//РазложениеврядФурье
float C[100],B[100],sc,sb,pi,f1,E0;
int j;
pi=3.1415926535897932384626433832795;
f1=1/T;
//Вычисление коэффициентов ряда
E0=(2/T)*Sim_0(Em,T,f);
for(j=1;j<=n;j++)
{ProgressBar1->StepBy(1);
C[j]=(2/T)*Sim_s(Em,T,f,j);
B[j]=(2/T)*Sim_c(Em,T,f,j);
}
//Вычисление точек и построение графика ряда Фурье
for (i=0;i<=36;i++)
{sc=sb=0;
point_t[i]=(i*10*T)/360;
for (j=1;j<=n;j++)
{sc=sc+C[j]*sin((2*pi*j*f1)*(i*10*T)/360);
sb=sb+B[j]*cos((2*pi*j*f1)*(i*10*T)/360);
}
point_e[i]=E0/2+sc+sb;
Series2->AddXY(point_t[i],point_e[i],"",clGreen);
}
//Запись значений в таблицу
for(i=0;i<=36;i++)
{StringGrid1->Cells[0][i+1]=IntToStr(i);
StringGrid1->Cells[1][i+1]=FloatToStr(point_t[i]);
StringGrid1->Cells[2][i+1]=FloatToStr(point_e[i]);
}
Chart1->Enabled=true;
}
Form1->Cursor=crArrow;
Button1->Cursor=crArrow;
StringGrid1->Cursor=crArrow;
ProgressBar1->Position=0;
StaticText1->Caption="Завершено.";
}
//--------------------------------------------------------------------------//Подпрограмма вычесляющая нулевой коэфициент ряда Фурье
float Sim_0(float Em,float T,float f(float t,float Em,float T))
{
int k,n=1000;
float h, Int,s1=0,s2=0;
h=(T-0)/(2*n);
for(k=0;k<2*n;k++)
{s1=s1+f(2*k*h,Em,T);
s2=s2+f(2*k*h,Em,T);}
Int=((2*h)/3)*((f(0,Em,T)+f(T,Em,T))/2+s1+2*s2);
return Int;
}
//--------------------------------------------------------------------------//Подпрограмма вычесляющая коэфициенты ряда Фурье при синусах
float Sim_s(float Em,float T,float f(float t,float Em,float T),int i)
{
int k,n=30000;
float h, Int,s1=0,s2=0,pi,f1;
pi=3.1415926535897932384626433832795;
f1=1/T;
h=(T-0)/(2*n);
for(k=0;k<2*n;k++)
{s1=s1+f(2*k*h,Em,T)*sin(2*pi*i*f1*2*k*h);
s2=s2+f(2*k*h,Em,T)*sin(2*pi*i*f1*2*k*h);}
Int=((2*h)/3)*((f(0,Em,T)*sin(0)+f(T,Em,T)*sin(2*pi*i*f1*T))/2+s1+2*s2);
return Int;
}
//--------------------------------------------------------------------------//Подпрограмма вычесляющая коэфициенты ряда Фурье при косинусах
float Sim_c(float Em,float T,float f(float t,float Em,float T),int i)
{
int k,n=30000;
float h, Int,s1=0,s2=0,pi,f1;
pi=3.1415926535897932384626433832795;
f1=1/T;
h=(T-0)/(2*n);
for(k=0;k<2*n;k++)
{s1=s1+f(2*k*h,Em,T)*cos(2*pi*i*f1*2*k*h);
s2=s2+f(2*k*h,Em,T)*cos(2*pi*i*f1*2*k*h);}
Int=((2*h)/3)*((f(0,Em,T)*cos(0)+f(T,Em,T)*cos(2*pi*i*f1*T))/2+s1+2*s2);
return Int;
}
//--------------------------------------------------------------------------Конец прогррамы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.