Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / 1 / 2 / Unit1

.pas
Скачиваний:
24
Добавлен:
01.06.2015
Размер:
7.35 Кб
Скачать
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Grids;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
PaintBox1: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const
RowCount = 12; // количество строк таблицы StringGrid
HarmCount=8; // количество гармоник + 1

var
Form1: Tform1;
// дискретные значения времени
MasT: array[1..RowCount-1] of real;
// значения функции в точках разрыва
MasYl: array[1..RowCount-1] of real; // левые
MasYr: array[1..RowCount-1] of real; // правые

implementation

{$R *.dfm}

procedure FuncSpectr;

var
l,p: integer; // левый нижний угол области вывода
w,h: integer; // ширина и высота области вывода
t: real; // время
tmax: real; // верхняя граница времени
dt: real; // приращение
Ymax: real; // верхнее значение функции
N: integer; // количество точек задания функции
Harm1,Harm2: array[1..HarmCount] of real; // значения гармоник спектра
A,A1,A2,B,B1,B2,M: array [0..HarmCount] of real; // амплитуды гармоник
Q: array[0..HarmCount] of real; // фазы гармоник
f1: real; // частота первой гармоники
mt,mr: real; // масштабы
cx0,cy0: integer; // координаты начала координат графиков функции
chy0: array[0..HarmCount] of integer; // и спектра
cy: integer; // текущая Y-координата
z: real; // вспомогательные переменные
i,k: integer;

begin
// область вывода графиков
with Form1.PaintBox1 do
begin
Canvas.Pen.Color:=clBlack;
Canvas.Brush.Color:=clWhite;
Canvas.Rectangle(0,0,Width,Height);
l:=70; // X-координата левого верхнего угла
p:=Height-20; // Y-координата левого верхнего угла
h:=Height-50; // высота
w:=Width-85; // ширина
end;

// количество точек задания функции
N:=1;
while (MasT[N+1]>MasT[N]) and (N<RowCount-1) do
N:=N+1;

// спектральный анализ кусочно-линейной функции с разрывами
if N>1 then
begin
tmax:=MasT[N];
f1:=1/tmax;
dt:=(MasT[N]-MasT[1])/(N-1);
M[0]:=0;
for i:=1 to N do
M[0]:=M[0]+MasYl[i]+MasYr[i];
M[0]:=M[0]/2/N;
for k:=1 to HarmCount do
begin
z:=Pi*f1*k*dt;
A1[k]:=0; A2[k]:=0; B1[k]:=0; B2[k]:=0;
for i:=1 to N do
begin
A1[k]:=A1[k]+MasYl[i]*Sin(2*z*i)-MasYr[i]*Sin(2*z*(i-1));
A2[k]:=A2[k]+MasYl[i]-MasYr[i]*Sin(z*(2*i-1));
B1[k]:=B1[k]+MasYr[i]*Cos(2*z*(i-1))-MasYl[i]*Cos(2*z*i);
B2[k]:=B2[k]+MasYl[i]-MasYr[i]*Cos(z*(2*i-1));
end;
A[k]:=A1[k]/z/N-Sin(z)*A2[k]/Sqr(N)/N;
B[k]:=B1[k]/z/N+Sin(z)*B2[k]/Sqr(N)/N;
M[k]:=Sqrt(Sqr(A[k])+Sqr(B[k]));
if A[k]<>0 then Q[k]:=-ArcTan(B[k]/A[k]);
end;
end;

// максимальное значение функции
Ymax:=0;
for i:=1 to N do
begin
if Abs(MasYl[i]) > Ymax then Ymax:=Abs(MasYl[i]);
if Abs(MasYr[i]) > Ymax then Ymax:=Abs(MasYr[i]);
end;
// масштабы
mr:=(h-20)/(2+2*HarmCount); // относительных единиц по Y-координате // по Y-координате
if N>1 then mt:=(w-15)/tmax; // времени по X-координате

with Form1.PaintBox1.Canvas do
begin
// разметка осей для графика функции
// вертикальная ось
cx0:=l;
cy:=p-h;
TextOut(cx0+w div 4,cy-25,'Функция');
MoveTo(cx0,cy); LineTo(cx0,cy+Round(2*mr));
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
TextOut(cx0-20,cy-7,'+1');
cy0:=cy+Round(mr);
TextOut(cx0-63,cy0-10,'Y(t)/Ymax');
// горизонтальная ось
MoveTo(cx0,cy0); LineTo(cx0+w,cy0);
if N>1 then
for i:=1 to N do
begin
MoveTo(cx0+Round(MasT[i]*mt),cy0-3);
LineTo(cx0+Round(MasT[i]*mt),cy0+3);
if (i<>1) and (i mod 2 = 1) then
TextOut(cx0+Round(MasT[i]*mt)-7,cy0+2,FloatToStr(MasT[i]));
end;
TextOut(w+70,cy0+2,'t');
cy:=cy0+Round(mr);
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
TextOut(cx0-20,cy-7,'-1');

// разметка осей для графиков спектра
cy:=cy+30;
TextOut(cx0+w div 5,cy-20,'Спектр функции');
MoveTo(cx0,cy); LineTo(cx0,p+10);
for k:=0 to HarmCount do
begin
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
chy0[k]:=cy+Round(mr);
TextOut(cx0-45,chy0[k]-7,'Y'+IntToStr(k)+'/M1');
MoveTo(cx0,chy0[k]); LineTo(cx0+w,chy0[k]);
if N>1 then
begin
MoveTo(cx0+Round(tmax*mt),chy0[k]-3);
LineTo(cx0+Round(tmax*mt),chy0[k]+3);
end;
TextOut(w+70,chy0[k]+2,'t');
cy:=chy0[k]+Round(mr);
end;
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);

// построение графика функции
Pen.Color:=clRed;
Pen.Width:=2;
MoveTo(cx0,cy0);
if Ymax<>0 then
for i:=1 to N do
begin
LineTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYl[i]/Ymax)*mr));
MoveTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYl[i]/Ymax)*mr));
LineTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYr[i]/Ymax)*mr));
MoveTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYr[i]/Ymax)*mr));
end;
Pen.Width:=1;

// построение графиков спектра
t:=0;
dt:=0.001;
if (N>1) and (M[1]<>0) then
begin
MoveTo(cx0,chy0[0]-Round(M[0]/M[1]));
LineTo(cx0+Round(tmax*mt),chy0[0]-Round(M[0]/M[1]));
repeat
for k:=1 to HarmCount do
begin
Harm2[k]:=(M[k]/M[1])*cos(2*Pi*k*f1*t+Q[k]);
if t=0 then MoveTo(cx0+Round(t*mt),chy0[k]-Round(Harm2[k]*mr)) else
MoveTo(cx0+Round((t-dt)*mt),chy0[k]-Round(Harm1[k]*mr));
LineTo(cx0+Round(t*mt),chy0[k]-Round(Harm2[k]*mr));
Harm1[k]:=Harm2[k];
end;
t:=t+dt;
until (t>=tmax);
end;
end;

end;

procedure Tform1.FormCreate(Sender: Tobject);
var
i: integer;
begin
// количество столбцов таблицы StringGrid
StringGrid1.ColCount:= 3;
// разметка таблицы
StringGrid1.ColCount:= 3;
StringGrid1.Cells[0,0]:= ' t';
StringGrid1.Cells[1,0]:= ' Y(t-0) ';
StringGrid1.Cells[2,0]:= ' Y(t+0) ';
for i:=1 to RowCount-1 do
begin
// заполнение таблицы нулями
Form1.StringGrid1.Cells[0,i]:= '0';
Form1.StringGrid1.Cells[1,i]:= '0';
Form1.StringGrid1.Cells[2,i]:= '0';
// инициализация массивов нулевыми значениями
MasT[i]:=StrToFloat(Form1.StringGrid1.Cells[0,i]);
MasYl[i]:=StrToFloat(Form1.StringGrid1.Cells[1,i]);
MasYr[i]:=StrToFloat(Form1.StringGrid1.Cells[2,i]);
end;
end;

procedure Tform1.Button1Click(Sender: Tobject);
var
i:integer;
begin
for i:=1 to RowCount-1 do
begin
// обновление значений времени и функции
MasT[i]:=StrToFloat(Form1.StringGrid1.Cells[0,i]);
MasYl[i]:=StrToFloat(Form1.StringGrid1.Cells[1,i]);
MasYr[i]:=StrToFloat(Form1.StringGrid1.Cells[2,i]);
end;
FuncSpectr;
end;

procedure Tform1.PaintBox1Paint(Sender: Tobject);
begin
FuncSpectr;
end;

procedure Tform1.Button2Click(Sender: Tobject);
begin
Application.Terminate;
end;

end.


Соседние файлы в папке 2
  • #
    01.06.20152.66 Кб24Project1.dof
  • #
    01.06.2015284 б24Project1.dpr
  • #
    01.06.2015876 б24Project1.res
  • #
    01.06.201551 б24Unit1.ddp
  • #
    01.06.20151.38 Кб25Unit1.dfm
  • #
    01.06.20157.35 Кб24Unit1.pas