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

ООП / 1 / 3 / Unit1

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

interface

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

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
UpDown1: TUpDown;
GroupBox3: TGroupBox;
Label1: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
UpDown2: TUpDown;
UpDown3: TUpDown;
UpDown4: TUpDown;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
CheckBox1: TCheckBox;
Button1: TButton;
PaintBox1: TPaintBox;
RadioGroup1: TRadioGroup;
procedure PaintBox1Paint(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure EditChange(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

const
Ymax=100; // верхняя граница ПХ системы
Xmax=10; // верхняя граница воздействия

var
Form1: Tform1;
TypCharact: integer; // тип ПХ системы
p: integer; // параметр ПХ
X0,Xm: real; // смещение и амплитуда воздействия
f: integer; // частота воздействия

implementation

{$R *.dfm}

// передаточная характеристика системы
function TransCharact(x: real): real;
var
y: real;
begin
case TypCharact of
0: y:=p*x;
1: y:=0.1*p*Sqr(x);
2: y:=Ymax*(1-Exp(-0.1*p*x));
end;
TransCharact:=y;
end;

// воздействие
function Influence(t: real): real;
begin
Influence:=X0+Xm*Cos(2*Pi*f*t);
end;


// спектр реакции системы
procedure SpectrReact;
const
tmax=1; // верхняя граница времени
N=100; // количество интервалов дискретизации времени

var
l,b: integer; // кординаты левого нижнего угола области вывода
w,h: integer; // ширина и высота области вывода
x: real; // аргумент ПХ
t: real; // время
fmax: integer; // верхнее значение частоты воздействия
A: array[1..5] of real; // амплитуды спектра
Amax: real; // верхнее значение амплитуды
dx,dt,df: real; // приращения
MasY: array[0..N] of real; // дискретные значения ПХ
cx0: integer; // X-координатa начала координат графиков
cy0: array[1..3] of integer; // Y-координаты начала координат графиков
mx,mt,mf,mr: real; // масштабы
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:=40; // X-координатa левого верхнего угла
b:=Height-20; // Y-координатa левого верхнего угла
h:=Height-50; // высота
w:=Width-80; // ширина
end;

if f<>0 then fmax:=5*f else fmax:=1;
// масштабы
mr:=(h-140)/4; // относительных единиц по Y-координате
mx:=(w-20)/Xmax; // аргумента ПХ по X-координате
mt:=(w-20)/tmax; // времени по X-координате
mf:=(w-20)/fmax; // частоты по X-координате
with Form1.PaintBox1.Canvas do
begin
// разметка осей для графика ПХ
// вертикальная ось
cx0:=l;
cy:=b-h;
TextOut(cx0+w div 3,cy-20,'ПХ системы');
TextOut(cx0+7,cy-15,'Y(X)');
for i:=0 to 4 do
begin
MoveTo(cx0,cy); LineTo(cx0+3,cy);
TextOut(cx0-25,cy-7,FloatToStr(Ymax-(Ymax/5)*i));
MoveTo(cx0,cy); LineTo(cx0,cy+Round(0.2*mr));
cy:=cy+Round(0.2*mr);
end;
TextOut(cx0-17,cy-7,'0');
// горизонтальная ось
cy0[1]:=cy;
MoveTo(cx0,cy0[1]); LineTo(cx0+Round(Xmax*mx)+1,cy0[1]);
dx:=Xmax/5;
for i:=1 to 5 do
begin
MoveTo(cx0+Round(i*dx*mx),cy0[1]-3);
LineTo(cx0+Round(i*dx*mx),cy0[1]);
TextOut(cx0+Round(i*dx*mx)-3,cy0[1]+2,FloatToStr(i*dX));
end;
TextOut(w+40,cy0[1]+2,'X [ед]');

// разметка осей для графика воздействия
// вертикальная ось
cy:=cy+50;
TextOut(cx0+w div 3,cy-20,'Воздействие');
TextOut(cx0+7,cy-15,'X(t)');
for i:=0 to 4 do
begin
MoveTo(cx0,cy); LineTo(cx0+3,cy);
TextOut(cx0-20,cy-7,FloatToStr(Xmax-(Xmax/5)*i));
MoveTo(cx0,cy); LineTo(cx0,cy+Round(0.2*mr));
cy:=cy+Round(0.2*mr);
end;
TextOut(cx0-17,cy-7,'0');
// горизонтальная ось
cy0[2]:=cy;
MoveTo(cx0,cy0[2]); LineTo(cx0+Round(tmax*mt)+1,cy0[2]);
dt:=tmax/5;
for i:=1 to 5 do
begin
z:=i*dt;
MoveTo(cx0+Round(z*mt),cy0[2]-3);
LineTo(cx0+Round(z*mt),cy0[2]);
TextOut(cx0+Round(z*mt)-5,cy0[2]+2,FloatToStr(z));
end;
TextOut(w+40,cy0[2]+2,'t [c]');

// разметка осей для графика спектра
// вертикальная ось
cy:=cy+50;
TextOut(cx0+w div 4,cy-15,'Спектр реакции');
TextOut(cx0+7,cy-7,'А');
cy:=cy+10;
Amax:=Ymax div 2;
for i:=0 to 10 do
begin
MoveTo(cx0,cy); LineTo(cx0+3,cy);
TextOut(cx0-20,cy-7,FloatToStr(Amax-(Amax/5)*i));
if i<>10 then
begin
MoveTo(cx0,cy);
LineTo(cx0,cy+Round(0.2*mr));
cy:=cy+Round(0.2*mr);
end;
if i=4 then cy0[3]:=cy;
end;
// горизонтальная ось
MoveTo(cx0,cy0[3]); LineTo(cx0+Round(fmax*mf)+1,cy0[3]);
df:=fmax/5;
for i:=1 to 5 do
begin
z:=i*df;
MoveTo(cx0+Round(z*mf),cy0[3]-3);
LineTo(cx0+Round(z*mf),cy0[3]);
TextOut(cx0+Round(z*mf)-7,cy0[3]+5,FloatToStr(i)+'f');
end;
TextOut(w+40,cy0[3]+5,'[Гц]');

// построение графика ПХ
Pen.Color:=clRed;
x:=0;
dx:=Xmax/N;
MoveTo(cx0,cy0[1]-Round((TransCharact(0)/Ymax)*mr));
for i:=1 to N do
begin
z:=i*dx;
LineTo(cx0+Round(z*mx),cy0[1]-Round((TransCharact(z)/Ymax)*mr));
MoveTo(cx0+Round(z*mx),cy0[1]-Round((TransCharact(z)/Ymax)*mr));
end;

// построение графика воздействия
t:=0;
dt:=tmax/N;
MasY[0]:=TransCharact(Influence(0));
MoveTo(cx0,cy0[2]-Round((Influence(0)/Xmax)*mr));
for i:=1 to N do
begin
z:=i*dt;
MasY[i]:=TransCharact(Influence(z));
LineTo(cx0+Round(z*mt),cy0[2]-Round((Influence(z)/Xmax)*mr));
MoveTo(cx0+Round(z*mt),cy0[2]-Round((Influence(z)/Xmax)*mr));
end;

// построение графика спектра
if f<>0 then
begin
for k:=1 to 5 do
begin
A[k]:=0;
z:=Pi*f*k*dt;
for i:=1 to N do
A[k]:=A[k]+(MasY[i]-MasY[i-1])*Sin(z*(2*i-1));
z:=Sin(z)/Sqr(z)/N;
A[k]:=-A[k]*z;
MoveTo(cx0+Round(k*f*mf),cy0[3]);
LineTo(cx0+Round(k*f*mf),cy0[3]-Round((A[k]/Amax)*mr));
MoveTo(cx0+Round(k*f*mf)-2,cy0[3]-Round((A[k]/Amax)*mr));
LineTo(cx0+Round(k*f*mf)+2,cy0[3]-Round((A[k]/Amax)*mr));
end;
// коэффициент гармоник
if Form1.CheckBox1.Checked and (A[1]<>0) then
TextOut(cx0,cy+10,'Коэффициент гармоник: '+
FloatToStrF(Sqrt(Sqr(A[2])+Sqr(A[3])+Sqr(A[4])+Sqr(A[5]))/A[1],
ffFixed,3,2));
end;
end;
end;

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

procedure Tform1.RadioGroup1Click(Sender: Tobject);
begin
// изменение типа ПХ
TypCharact:=RadioGroup1.ItemIndex;
SpectrReact;
end;

procedure Tform1.EditChange(Sender: Tobject);
var
i: integer;
s: string;
begin
i:=(Sender as Tedit).Tag;
s:=(Sender as Tedit).Text;
// обновление параметров ПХ и воздействия
case i of
1: p:=StrToInt(s);
2: X0:=StrToFloat(s);
3: Xm:=StrToFloat(s);
4: f:=StrToInt(s);
end;
SpectrReact;
end;

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

procedure Tform1.CheckBox1Click(Sender: Tobject);
begin
SpectrReact;
end;


end.
Соседние файлы в папке 3
  • #
    01.06.2015188 б24Project1.dpr
  • #
    01.06.2015876 б24Project1.res
  • #
    01.06.2015214 б24Project1.~dpr
  • #
    01.06.201551 б24Unit1.ddp
  • #
    01.06.20154.25 Кб24Unit1.dfm
  • #
    01.06.20157.93 Кб25Unit1.pas