program Pafnuty; Uses Wiskunde; begin test; end. ---------------------------------------------------- program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. ---------------------------------------------------- Unit Wiskunde; { This software has been designed and is CopyLefted by Han de Bruijn (===) @-O^O-@ #/_\# ### All I ask is to be credited when it is appropriate. Tchebyshev Polynomials with Matrix Method ========================================= } INTERFACE { Chebyshev Polynomial of the First Kind } function T(n : integer; x : double) : double; { Just a Test } procedure test; IMPLEMENTATION type matrix = array[0..1,0..1] of double; function een : matrix; { Unity } var E : matrix; begin E[0,0] := 1; E[1,1] := 1; E[1,0] := 0; E[0,1] := 0; een := E; end; function maal(A,B : matrix) : matrix; { Multiplication } var C : matrix; begin C[0,0] := A[0,0]*B[0,0] + A[0,1]*B[1,0]; C[0,1] := A[0,0]*B[0,1] + A[0,1]*B[1,1]; C[1,0] := A[1,0]*B[0,0] + A[1,1]*B[1,0]; C[1,1] := A[1,0]*B[0,1] + A[1,1]*B[1,1]; maal := C; end; function macht(x : matrix; n : integer) : matrix; { Power x^n } var m : integer; p,y : matrix; begin m := n; y := x; p := een; while m > 0 do begin if (m and 1) > 0 then p := maal(p,y); m := m shr 1; y := maal(y,y); end; macht := p; end; function T(n : integer; x : double) : double; { Chebyshev polynomial of the first kind } var M,P : matrix; u : double; begin u := 1; if n = 1 then u := x; if n > 1 then begin M[0,0] := 2*x; M[0,1] := -1; M[1,0] := 1 ; M[1,1] := 0 ; P := macht(M,n-1); u := P[0,0]*x + P[0,1]; end; T := u; end; function hand(n : integer; x : double) : double; { Known already } var u : double; begin u := 0; case n of 0 : u := 1; 1 : u := x; 2 : u := 2*sqr(x) - 1; 3 : u := 4*sqr(x)*x - 3*x; 4 : u := 8*sqr(x)*sqr(x) - 8*sqr(x) + 1; end; hand := u; end; procedure test; { Just a Test } var n,k : integer; begin for n := 0 to 4 do begin Writeln(n); for k := 0 to 10 do begin Writeln(T(n,k/10),' = ',hand(n,k/10)); end; Writeln; end; end; END. ---------------------------------------------------- unit Unit1; INTERFACE uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Wiskunde; type TForm1 = class(TForm) Image1: TImage; procedure tekenen(Sender: TObject); procedure starten(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; IMPLEMENTATION {$R *.dfm} const LIM : integer = 7; palet : array[0..7] of TColor = ($000000, $0000FF, $00FF00, $00FFFF, $FF0000, $FF00FF, $FFFF00, $FFFFFF); var soort : integer; procedure ClearDevice(W,H : integer); { Clear Screen } var rechthoek : TRect; begin rechthoek := Rect(0,0,W,H); with Form1.Image1.Canvas do begin Brush.Color := clWhite; FillRect(rechthoek); end; end; function ArcSin(x : double) : double; begin ArcSin := ArcTan(x/Sqrt(1-x*x)); end; { ArcSin(x) + ArcCos(x) = Pi/2 ==> ArcCos(x) } function ArcCos(x : double) : double; begin ArcCos := Pi/2 - ArcTan(x/Sqrt(1-x*x)); end; procedure eerste; { Polynomial Space } const Del : integer = 10; var W,H,n,k,i : integer; x,y,theta : double; begin W := Form1.Image1.Width-1; H := Form1.Image1.Height-1; ClearDevice(W,H); for n := 0 to LIM do begin with Form1.Image1.Canvas do Pen.Color := palet[n]; x := 2*0/W-1; y := T(n,x); i := Round(H*(1-(y+1)/2)); with Form1.Image1.Canvas do MoveTo(0,i); for k := 0 to W do begin x := 2*k/W-1; y := T(n,x); i := Round(H*(1-(y+1)/2)); with Form1.Image1.Canvas do LineTo(k,i); end; end; with Form1.Image1.Canvas do begin Pen.Color := clGray; MoveTo(0,H div 2); LineTo(W,H div 2); for k := 0 to W div Del do begin theta := Pi*k*Del/W-Pi; x := cos(theta); i := Round(W*(x+1)/2); MoveTo(i,(H div 2)); LineTo(i,(H div 2) - Del); end; end; end; procedure Tweede; { Cosine Space } const Del : integer = 10; var W,H,n,k,i : integer; x,y : double; begin W := Form1.Image1.Width-1; H := Form1.Image1.Height-1; ClearDevice(W,H); for n := 0 to LIM do begin with Form1.Image1.Canvas do Pen.Color := palet[n]; x := Pi*0/W-Pi; y := cos(n*x); i := Round(H*(1-(y+1)/2)); with Form1.Image1.Canvas do MoveTo(0,i); for k := 0 to W do begin x := Pi*k/W-Pi; y := cos(n*x); i := Round(H*(1-(y+1)/2)); with Form1.Image1.Canvas do LineTo(k,i); end; end; with Form1.Image1.Canvas do begin Pen.Color := clGray; MoveTo(0,H div 2); LineTo(W,H div 2); for k := 1 to W div Del do begin MoveTo(k*Del,(H div 2)); LineTo(k*Del,(H div 2) - Del); end; end; end; procedure TForm1.tekenen(Sender: TObject); begin if soort = 0 then eerste; if soort = 1 then tweede; soort := (soort + 1) mod 2; end; procedure TForm1.starten(Sender: TObject); begin soort := 0; end; END. ----------------------------------------------------