Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
- StdCtrls, Spin;
- type
- Vector = array [0..1000] of Real; // для створення масивів із координатами графіків
- Vec = array [0..50] of Real; // для створення масивів із коефіцієнтами ряду Фур’є
- { TForm1 }
- TForm1 = class(TForm)
- Button1: TButton;
- Button2: TButton;
- Edit1: TEdit;
- Edit2: TEdit;
- Edit3: TEdit;
- Edit4: TEdit;
- GroupBox1: TGroupBox;
- Image1: TImage;
- Label1: TLabel;
- Label10: TLabel;
- Label11: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- Label5: TLabel;
- Label6: TLabel;
- Label7: TLabel;
- Label8: TLabel;
- Label9: TLabel;
- SpinEdit1: TSpinEdit;
- SpinEdit2: TSpinEdit;
- SpinEdit3: TSpinEdit;
- SpinEdit4: TSpinEdit;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- procedure Image1Click(Sender: TObject);
- private
- public
- end;
- var
- Form1: TForm1;
- Xe, Ye : Vector; // Масиви для зберігання координат нашої періодичної функції
- Xg, Yg : Vector; // Масиви для зберігання координат протабульованого ряду Фур'є
- a, b, c : Vec; // Масиви для зберігання коефіцієнтів ряду Фур'є
- Ne, Ngr, Ng : Integer; // Ne = Ngr кількість точок обох графіків
- al, bl, Tp : Real; // Область визначення функції та її період : Tp = bl – al
- implementation
- {$R *.lfm}
- Function f(x : Real) : Real; // Опис нашої періодичної функції
- Begin
- Tp := bl - al;
- if x < TP / 2 then
- f:= 2 else
- if(x >= TP / 2) and (x < 3 * TP / 4) then
- f := 4 * (TP - 2 * x) / TP
- else
- f := 8 * (x - TP) / TP;
- end;
- Procedure TabF(var Xe: Vector; var Ye: Vector);// Процедура табулювання періодичної функції
- Var h : Real;
- i : Integer;
- Begin
- h := (bl - al) / Ne;
- Xe[0]:= al;
- For i := 0 to Ne - 1 do
- Begin
- Ye[i] := f(Xe[i]) ;
- Xe[i+1] := Xe[i] + h;
- End;
- End;
- // Процедура побудови і табулювання ряду Фур’є згідно з алгоритмом, що є на рис. 4.
- Procedure Furje(Xe, Ye : Vector; Ne : Integer; var Yg : Vector);
- Var i, k : Integer;
- w, KOM, S, G, D : Real;
- Begin
- Ng := StrToInt(Form1.Edit2.text); // Вводимо кількість гармонік
- TP := bl - al; // TP – період нашої функції
- // Обчислення коефіцієнтів ряду Фур'є
- w := 2 * Pi / TP;
- For k := 1 to Ng do
- Begin
- KOM := k * w;
- G := 0.0;
- D := 0.0;
- For i :=1 to Ne do
- Begin
- S := KOM * Xe[i];
- G := G + Ye[i] * Cos(S);
- D := D + Ye[i] * Sin(S);
- End;
- a[k] := 2 * G / Ne;
- b[k] := 2 * D / Ne;
- c[k] := Sqrt(Sqr(a[k]) + Sqr(b[k]));
- End;
- a[0] := 0.0;
- For i := 1 to Ne do
- a[0] := a[0] + Ye[i];
- a[0] := a[0] / Ne;
- For i := 0 to Ne - 1 do // Побудова і табулювання суми ряду Фур’є
- Begin
- S := 0;
- D := Xe[i] * w;
- For k:=1 to Ng do
- Begin
- KOM := k * D;
- S := S + b[k] * Sin(KOM) + a[k] * Cos(KOM);
- End;
- Yg[i] := a[0] + S;
- End;
- End;
- { TForm1 }
- procedure TForm1.Image1Click(Sender: TObject);
- begin
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- Var p,zx,zy,ay,bx,krx,kry,xx,yy,Gx,Gy : Real;
- i,j,krokx,kroky,drv,drm,visx,visy : Integer;
- l:Integer;
- minYg,maxYg,maxx,maxy,minx,miny,kx,ky:real;
- Procedure Garm(Ng : Integer; c:Vec);
- Var i , Krokx, x : Integer;
- MaxC, Ky, W : Real;
- Begin
- Krokx := (Image1.ClientWidth - 2 * L) div Ng;
- MaxC := c[1];
- For I := 2 to Ng do
- If c[i] > MaxC then MaxC := c[i];
- Ky := (Image1.ClientHeight div 2) / MaxC;
- With Image1.Canvas do
- Begin
- Pen.Color := clHighlight;
- Pen.Width := 2;
- MoveTo(L, L + 20 );
- LineTo(L + 10, L + 10);
- LineTo(L + 20, L + 20);
- MoveTo(L + 10, L + 10);
- LineTo(L + 10, Image1.ClientHeight - 50);
- LineTo(Image1.ClientWidth-20, Image1.ClientHeight-50);
- MoveTo(Image1.ClientWidth-40, Image1.ClientHeight-60);
- LineTo(Image1.ClientWidth-20, Image1.ClientHeight-50);
- LineTo(Image1.ClientWidth-40, Image1.ClientHeight-40);
- TextOut(L - 2, L ,'C');
- TextOut(ClientWidth - 50, ClientHeight - 25 ,'W');
- Pen.Color := clFuchsia;
- Pen.Width := 2;
- x := KrokX + 20;
- w := 2 * Pi /(bl - al);
- For i:= 1 to Ng do
- Begin
- MoveTo(Round(x)+3,Image1.ClientHeight-50);
- LineTo(Round(x)+3,Image1.ClientHeight-50-Round(ky*c[i]));
- TextOut(round(x),Image1.ClientHeight - Round(ky*c[i])-65, FloatToStrF(x,ffGeneral,0,0));
- Ellipse(round(x),Image1.ClientHeight-53,round(x)+5,Image1.ClientHeight-48);
- Ellipse(Round(x)+1,Image1.ClientHeight-50-Round(ky*c[i]),Round(x)+7,
- Image1.ClientHeight-50-Round(ky*c[i])+5);
- x := x + KrokX;
- End;
- x := KrokX + 19;
- TextOut(round(x),Image1.ClientHeight - 30,'W='+FloatToStrF(w,ffGeneral,0,0));
- End;
- End;
- // Процедура візуалізації гармонік
- begin
- // Початок виконуваної частини процедури TForm1.Button1Click
- Begin
- Ne := StrToInt(Edit1.Text);
- Ngr:= Ne;
- al := StrToFloat(Form1.Edit3.Text);
- bl := StrToFloat(Form1.Edit4.Text);
- TabF( Xe, Ye); // Табулюємо задану нами періодичну функцію
- Furje(Xe,Ye,Ne,Yg); // Обчислюємо коефіцієнти ряду Фур'є і табулюємо суму ряду
- // Будуємо графіки обох функцій Ye(Xe) та Yg(Xe)
- L:=40; // Відступ від країв компоненти TImage
- With Form1.Image1 do
- Begin
- Canvas.Pen.Width := 2;
- Canvas.Pen.Color := clBlue;
- Canvas.Pen.Style := psSolid;
- Canvas.Rectangle(1, 1, Width - 1, Height - 1);
- MinYg:=Yg[0]; MaxYg:=Yg[0];
- For i := 1 to Ngr - 1 do
- Begin
- If MaxYg < Yg[i] then MaxYg := Yg[i];
- If MinYg > Yg[i] then MinYg := Yg[i];
- End;
- MinX := Xe[0]; MaxX := Xe[Ne-1];
- MinY := Ye[0]; MaxY := Ye[0];
- For i := 1 to Ne - 1 do
- Begin
- If MaxY< Ye[i] then MaxY := Ye[i];
- If MinY> Ye[i] then MinY := Ye[i];
- End;
- If MaxY < MaxYg then MaxY := MaxYg;
- If MinY > MinYg then MinY := MinYg;
- // Обчислюємо зачення коефіцієнтів масштабування
- Kx := (Width - 2 * L) /(MaxX - MinX);
- Ky := (Height - 2 * L) /(MinY - MaxY);
- Zx := (Width * MinX - L * (MinX + MaxX)) / (MinX - MaxX);
- Zy := (Height * MaxY - L * (MinY + MaxY)) / (MaxY - MinY);
- End;
- // Обчислюємо розташування плаваючих осей
- If MinX * MaxX <= 0.0 then Gx := 0.0;
- If (MinX * MaxX > 0.0) then Gx := MinX;
- If (MinX * MaxX > 0.0) then Gx := MinX;
- If (MinX * MaxX > 0.0) and (MinX < 0.0) then Gx := MaxX;
- If MinY * MaxY <= 0.0 then Gy := 0.0;
- If (MinY * MaxY > 0.0) and (MinY > 0.0) then Gy := MinY;
- If (MinY * MaxY > 0.0) and (MinY < 0.0) then Gy := MaxY;
- With Form1.Image1.Canvas do // ------------------------
- Begin
- Pen.Color := clSilver;
- Pen.Width := SpinEdit3.Value;
- KrokX := (Width - 2 * L) div 10;
- KrokY := (Height - 2 * L) div 10;
- For i := 0 to 10 do
- Begin
- MoveTo(L, Round(Ky * Gy + Zy) + i * KrokY);
- LineTo(Width - L, Round(Ky * Gy + Zy) + i * KrokY);
- MoveTo(L, Round(Ky * Gy + Zy) - i * KrokY);
- LineTo(Width - L, Round(Ky * Gy + Zy) - i * KrokY);
- MoveTo(Round(Kx * Gx + Zx) + i * KrokX,L);
- LineTo(Round(Kx * Gx + Zx) + i * KrokX, Height - L);
- MoveTo(Round(Kx * Gx + Zx) - i * KrokX, L);
- LineTo(Round(Kx * Gx + Zx) - i * KrokX, Height - L);
- End;
- // Виведення підписів осей координат---------------------------------
- xx := MinX; yy := MaxY;
- KrX := (MaxX - MinX) / 10.0;
- KrY := (MaxY - MinY) / 10.0;
- For i:=0 to 9 do
- Begin
- TextOut(L + 4 + i * KrokX,
- Round(Ky * Gy + Zy) - L + 43,
- FloatToStrF(XX, ffGeneral, 2, 5));
- TextOut(Round(Kx*Gx+Zx)-L+10,
- L + i * KrokY - 5,
- FloatToStrF(YY, ffGeneral, 2, 5));
- Pen.Color:=clFuchsia;
- XX := XX + KrX;
- yy := yy - KrY;
- End;
- Pen.Style := psSolid;// Малюємо плаваючі осі----------
- Pen.Color := clGreen;
- Pen.Width := SpinEdit2.Value;
- MoveTo(L, Round(Ky * Gy + Zy));
- LineTo(Round(Width - L), Round(Ky * Gy + Zy));
- MoveTo(Round(Kx * Gx + Zx), L);
- LineTo(Round(Kx * Gx + Zx), Round( Height - L));
- Pen.Width:=SpinEdit1.Value;
- Pen.Color:=clFuchsia;
- MoveTo(Round(Kx * Xe[0]+Zx), Round(Ky * Ye[0] + Zy));
- For i := 0 to Ne - 1 do
- LineTo(Round(Kx * Xe[i]+Zx), Round(Ky * Ye[i] + zy));
- Pen.Width:=SpinEdit4.Value;
- Pen.Color:=clGreen;
- MoveTo(Round (Kx*Xe[0]+Zx),Round(Ky*Yg[0]+Zy));
- For i:=0 to Ne-1 do
- LineTo(Round (Kx*Xe[i]+Zx),Round(Ky*Yg[i]+Zy));
- end;
- ShowMessage('Показати гармоніки ?');
- Garm(Ng, c);
- end;
- end;
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- Close();
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement