Скачиваний:
18
Добавлен:
01.05.2014
Размер:
5.8 Кб
Скачать
unit UMain;

{=====================================================================}INTERFACE

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

const DATA_SIZE = 30;

type float = double;
type TfrmMain = class(TForm)
GBGenerate: TGroupBox;
CBDataType: TComboBox;
btnGetData: TButton;
PBGen: TProgressBar;
GBAnalysis: TGroupBox;
MLog: TMemo;
SBDataSize: TScrollBar;
btnRun: TButton;
lblDataSize: TLabel;
PBAnal: TProgressBar;
procedure SBDataSizeChange(Sender: TObject);
procedure btnGetDataClick(Sender: TObject);
procedure btnRunClick(Sender: TObject);
procedure CBDataTypeChange(Sender: TObject);
private
Data: array[1..DATA_SIZE]of float;
DistrIndex: integer;
public
procedure Log(const S: string);
end;

var
frmMain: TfrmMain;
DistrName: array[0..2]of String = ('Regular', 'Exponential', 'Ralley');
{================================================================}IMPLEMENTATION

{$R *.dfm}
function MyRand : float;
BEGIN
randomize;
Result := (random(1000) + 1) / 1000;
END;

procedure TFrmMain.Log(const S: string);
BEGIN
MLog.Lines.Add(S);
END;

procedure TfrmMain.SBDataSizeChange(Sender: TObject);
begin
lblDataSize.Caption := IntToStr(SBDataSize.Position);
PBAnal.Position := PBAnal.Min;
end;

procedure TfrmMain.CBDataTypeChange(Sender: TObject);
begin
PbGen.Position := PBGen.Min;
end;

procedure TfrmMain.btnGetDataClick(Sender: TObject);
var i,J: integer; Temp: float;
begin
PBGen.Position := PBGen.Min;
try
for i:=1 to DATA_SIZE do begin
case CBDataType.ItemIndex of
0: Data[I] := MyRand() * 20;
1: Data[I] := - 10 * Ln( MyRand() );
2: Data[I] := 8 * sqrt( -2 * Ln( MyRand() ) );
end;
end;
// According to last update from Bob The Dyer, we sort our data
for I:=1 to DATA_SIZE do begin
for J:=I to DATA_SIZE do
if (Data[i] > Data[j]) then begin
Temp := Data[i];
Data[i] := Data[j];
Data[j] := Temp;
end;
PBGen.Position := PBGen.Position + 1;
end;

except
MessageBox(Handle,'Data generation failed!','Error',MB_OK);
Exit;
end;
DistrIndex := CBDataType.ItemIndex;
btnRun.Enabled := TRUE;
end;

procedure TfrmMain.btnRunClick(Sender: TObject);
var n,m: integer; i: integer; SumX, SumiX, A, Alim: float;
f,g,Res,ResLst: float; K: float; B, ErrNum: integer; Xf,Tim: float;
begin
//-----------------------------------------------[ Memo log greetings ]
PBAnal.Position := PBAnal.Min;
MLog.Clear;
Log('Analysis started at ' + TimeToStr(Time));

//--------------------------------------[ Outputing initial work data ]
n := SBDataSize.Position;

Log('');
Log('[INITIAL DATA]');
Log('Variable distribution: ' + #9 + DistrName[DistrIndex]);
Log('Variables at use: ' + #9 + IntToStr(n) + ' (' + FloatToStrF(n*3.33,ffFixed,3,3) + '%)');
Log('');
for I:=1 to n do Log(IntToStr(I) + ':' + #9 + FloatToStrF(Data[i],ffFixed,4,4));

//-------------------------------------------[ Auxiliary Calculations ]
SumX := 0; for I:=1 to n do SumX := SumX + Data[I];
SumiX := 0; for I:=1 to n do SumiX := SumiX + Data[I] * I;
A := SumiX / SumX;
Alim := (n+1)/2;

Log('');
Log('[AUXILIARY PARAMETERS]');
Log(' Summ(X[i]) = ' + FloatToStrF(SumX,ffFixed,4,4));
Log('Summ(iX[i]) = ' + FloatToStrF(SumiX,ffFixed,4,4));
Log(' A = ' + FloatToStrF(A,ffFixed,4,4));
Log(' (n+1)/2 = ' + FloatToStrF(Alim,ffFixed,4,4));
Log('');

if (A > Alim) then begin
Log('Validating condition (A > (n+1)/2) = TRUE');
Log('Solution exists (Parameter "A" qualifies)')
end else begin
Log('Validating condition (A > (n+1)/2) = FALSE');
Log('Solution does not exist (Parameter "A" fails)');
btnGetData.SetFocus;
exit; // time to give up ?
end;

//----------------------------------------[ Resolve function Analysis]
Log('');
Log('[BOUND FUNCTION RESOLVE]');

Res := 100.0; ResLst := Res + 1.0; m := n+1;
while (ResLst > Res)and(m <= 10000) do begin // :)
ResLst := Res;
f := 0; for i:=1 to n do f := f + 1 / (m - i);
g := n / (m - A);
Res := abs(f - g);
Log('m = ' + IntToStr(m));
Log('f = ' + floattostrf(f,fffixed,4,4) + #9 + 'g = ' + floattostrf(g,fffixed,4,4) + #9 + '|f-g| = ' + floattostrf(Res,fffixed,8,8));
inc(m);
PBAnal.Position := PBAnal.Position + 1;
end;

//-------------------------------------------------[ B and K resolve ]
B := m - 3;
K := n / ( (B+1)*SumX - SumiX );

Log('');
Log('[BOUND FUNCTION RESULTS]');
Log('Resulting B = ' + IntToStr(B));
Log('Resulting K = ' + FloatToStrf(K,ffFixed,8,8));

//---------------------------------------------[ Future Time Resolve ]
ErrNum := B - n;

Log('');
Log('[FORWARD ANALYSIS]');
Log('Errors to be located: ' + IntToStr(ErrNum));

Tim := 0;
for I:=n+1 to B do begin
Xf := 1 / (K * (B - I + 1));
Tim := Tim + Xf;
Log(IntToStr(I) + ':' + #9 + FloatToStrF(Xf,ffFixed,4,4));
end;

for I:=1 to n do Tim := Tim + Data[i];

Log('');
Log('Time for complete testing: ' + FloatToStrF(Tim,ffFixed,4,4));

//--------------------------------------------------[ Final Message ]
Log('');
Log('Analysis complete at ' + TimeToStr(Time));
Log('Results are saved to "Log.txt"');
MLog.Lines.SaveToFile('Log.txt');
end;


end.
Соседние файлы в папке Lab4
  • #
    01.05.20141.22 Кб19Log.txt
  • #
    01.05.2014426 б18Moranda.cfg
  • #
    01.05.2014193 б18Moranda.dpr
  • #
    01.05.2014876 б18Moranda.res
  • #
    01.05.20143.68 Кб18UMain.dfm
  • #
    01.05.20145.8 Кб18UMain.pas