Использование ПК для разложения несинусоидального импульса в ряд Фурье. Описание метода Симпсона, страница 3

//--------------------------------------------------------------------------//Подпрограмма вычесляющая коэфициенты ряда Фурье при синусах

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;

}

//--------------------------------------------------------------------------Конец прогррамы.