LazStats: Add tests.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7925 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2020-12-05 19:03:07 +00:00
parent 7800484f54
commit 21484fc4bd
29 changed files with 1767 additions and 0 deletions

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="TAChartLazarusPkg"/>
</Item>
<Item>
<PackageName Value="LMath"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="Project1.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,66 @@
program Project1;
uses
SysUtils,
spe,
MathUnit;
const
w = 15;
// Numerical recipes
function gammln(x: double): Double;
{ gibt den Log der vollständigen Gamma-Funktion zurück (x>0).
Gamma(x) = integral ( t^(x-1) * exp(-t) dt ) (von 0 bis Unendlich)
(Log, um Floating Point Underflow zu vermeiden). }
const
stp = 2.50662827465;
var
xx,tmp,ser : extended;
begin
if x<=0 then
raise Exception.Create('Argument für GammaLn ist negativ.');
if (x>1) then begin
xx := x - 1.0;
tmp := xx + 5.5;
tmp := (xx+0.5) * ln(tmp) - tmp;
ser := 1.0 + 76.18009173 /(xx+1.0) - 86.50532033/(xx+2.0)
+ 24.01409822 /(xx+3.0) - 1.231739516/(xx+4.0)
+ 0.120858003E-2/(xx+5.0) - 0.536382E-5/(xx+6.0);
result := tmp + ln(stp*ser);
end else
if (x<1) then
result := GammaLn(x+1.0) - ln(x)
else
if (x=1) then
result := 0.0;
end;
function Beta(a,b: Double) : Double;
begin
Result := exp(gammln(a) + gammln(b) - gammln(a+b));
end;
procedure Test(a, b: Double);
var
y_lazStats, y_numlib, y_numrecip: Double;
begin
y_numlib := spe.beta(a, b);
y_lazstats := mathunit.beta(a, b);
y_numrecip := beta(a, b);
WriteLn(a:w:5, b:w:5, y_lazstats:w:5, y_numlib:w:5, y_numrecip:w:5);
end;
begin
WriteLn('Beta function');
WriteLn;
WriteLn('a':w, 'b':w, 'y(lazstats)':w, 'y(numlib)':w, 'y(Num.Recip)':w);
Test(0.5, 0.5);
Test(1.1, 2.3);
Test(2.3, 1.1);
Test(2.9, 0.1);
Test(5.1, 2.5);
ReadLn;
end.

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="TAChartLazarusPkg"/>
</Item>
<Item>
<PackageName Value="LMath"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="Project1.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,107 @@
program Project1;
uses
SysUtils,
spe,
MathUnit;
// Numerical recipes
function BetaCf(a,b,x: Double) : Double;
{ Kettenbruch-Entwicklung der unvollständigen Beta-Funktion }
const
ItMax = 100;
EPS = 1E-9;
var
tem, em, d : Double;
qap, qam, qab : Double;
bz, bpp, BP, bm : Double;
az, app, am, aold, ap : Double;
m : integer;
begin
am := 1.0;
bm := 1.0;
az := 1.0;
qab := a+b;
qap := a+1.0;
qam := a-1.0;
bz := 1.0 - qab*x/qap;
for m:=1 to ItMax do begin
em := m;
tem := em+em;
d := em*(b-m)*x/((qam+tem)*(a+tem));
ap := az + d*am;
BP := bz + d*bm;
d := -(a+em)*(qab+em)*x/((a+tem)*(qap+tem));
app := ap + d*az;
bpp := BP + d*bz;
aOld:= az;
am := ap/bpp;
bm := BP/bpp;
az := app/bpp;
bz := 1.0;
if abs(az-aOld) < EPS*abs(az) then begin
result := az;
Exit;
end;
end;
raise Exception.Create('Kettenbruchentwicklung der unvollst.Beta-Funktion divergiert.');
// a oder b zu groß, oder ItMax zu klein
end;
function BetaI(a,b,x: Double): Double;
{ berechnet die Unvollständige Beta-Funktion Ix(a,b) = Bx(a,b)/B(a,b),
/x a-1 b-1
wobei Bx(a,b) = | t * (1-t) dt
/0
}
var
bt : Double;
begin
if (x<0.0) then
raise EMathError.Create('Argument der unvollst.Beta-Funktion ist <0.');
if (x>1.0) then
raise EMathError.Create('Argument der unvollst.Beta-Funktion ist >1.');
if (x=0.0) or (x=1.0) then
bt := 0.0
else
bt := exp(GammaLn(a+b) - GammaLn(a) - GammaLn(b) + a*ln(x) + b*ln(1.0-x));
if x < (a+1.0)/(a+b+2.0)
then result := bt * BetaCf(a,b,x)/a
else result := 1.0 - bt*BetaCf(b,a,1.0-x)/b;
end;
const
xmin = 0.0;
xmax = 1.0;
dx = 0.2;
procedure Test(a, b: Double);
var
i: Integer;
x, y_lazStats, y_numlib, y_numrecip: Double;
begin
WriteLn('a = ', a:0:3, ' b = ', b:0:3);
WriteLn;
WriteLn('x':20, 'y(lazstats)':20, 'y(numlib)':20, 'y(Num.Recip)':20);
x := xmin;
while (x <= xmax) do begin
y_numlib := spe.betai(a, b, x);
y_lazstats := mathunit.betai(a, b, x);
y_numrecip := betai(a, b, x);
WriteLn(x:20:5, y_lazstats:20:5, y_numlib:20:5, y_numrecip:20:5);
x := x + dx;
end;
end;
begin
WriteLn('incomplete beta function');
WriteLn;
Test(0.5, 0.5);
Test(1.0, 2.0);
Test(2.0, 1.0);
ReadLn;
end.

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="TAChartLazarusPkg"/>
</Item>
<Item>
<PackageName Value="LMath"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="Project1.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,64 @@
program Project1;
uses
SysUtils,
spe,
MathUnit;
// Numerical recipes
function GammaLn(x: double): Double;
{ gibt den Log der vollständigen Gamma-Funktion zurück (x>0).
Gamma(x) = integral ( t^(x-1) * exp(-t) dt ) (von 0 bis Unendlich)
(Log, um Floating Point Underflow zu vermeiden). }
const
stp = 2.50662827465;
var
xx,tmp,ser : extended;
begin
if x<=0 then
raise Exception.Create('Argument für GammaLn ist negativ.');
if (x > 1) then begin
xx := x - 1.0;
tmp := xx + 5.5;
tmp := (xx+0.5) * ln(tmp) - tmp;
ser := 1.0 + 76.18009173 /(xx+1.0) - 86.50532033/(xx+2.0)
+ 24.01409822 /(xx+3.0) - 1.231739516/(xx+4.0)
+ 0.120858003E-2/(xx+5.0) - 0.536382E-5/(xx+6.0);
result := tmp + ln(stp*ser);
end else
if (x < 1) then
result := GammaLn(x+1.0) - ln(x)
else
if (x=1) then
result := 0.0;
end;
const
xmin = 1e-3;
xmax = 5.0;
procedure Test;
var
i: Integer;
x, y_lazStats, y_numlib, y_numrecip: Double;
begin
WriteLn('x':20, 'y(lazstats)':20, 'y(numlib)':20, 'y(Num.Recipies)':20);
x := xmin;
while (x <= xmax) do begin
y_numlib := 1.0 - spelga(x);
y_lazstats := MathUnit.gammaln(x);
y_numrecip := gammaln(x);
WriteLn(x:20:6, y_lazstats:20:5, y_numlib:20:5, y_numrecip:20:5);
x := x*1.25
// x := x + dx;
end;
end;
begin
WriteLn('GammaLn function');
WriteLn;
Test;
ReadLn;
end.

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Distributions"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="Distributions.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Distributions"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,25 @@
program Distributions;
uses
SysUtils, Math;
const
MEAN = 56;
STDDEV = 12;
N = 5000;
var
F: TextFile;
i: Integer;
x: Double;
begin
AssignFile(F, '../../data/dists.csv');
Rewrite(F);
WriteLn(F, 'Index,Group,Value');
for i := 0 to N-1 do begin
x := RandG(MEAN, STDDEV);
WriteLn(F, i, ',', i div 5, ',', x:0:6);
end;
CloseFile(F);
end.

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="NormalDist"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="NormalDist.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="NormalDist"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,24 @@
program NormalDist;
uses
SysUtils, Math;
const
MEAN = 56;
STDDEV = 12;
N = 5; //200;
var
F: TextFile;
i: Integer;
x: Double;
begin
AssignFile(F, '../../data/normal_dist_5.csv');
Rewrite(F);
WriteLn(F, 'Index,Value');
for i := 1 to N do begin
x := RandG(MEAN, STDDEV);
WriteLn(F, i, ',', x:0:6);
end;
CloseFile(F);
end.

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="MatrixTest"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="MatrixTest.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="MatrixTest"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,51 @@
program MatrixTest;
uses
MatrixUnit;
var
A: TDblMatrix;
B: TDblMatrix;
procedure WriteMatrix(A: TDblMatrix; AName: String);
var
n, m, i, j: Integer;
begin
WriteLn(AName, ' = ');
MatSize(A, n,m);
for i := 0 to n-1 do
begin
for j := 0 to m-1 do
Write(A[i, j]:10:3);
WriteLn;
end;
WriteLn;
end;
begin
SetLength(A, 3, 3);
A[0, 0] := 1.0; A[0, 1] := 3.0; A[0, 2] := 4.0;
A[1, 0] := -1.0; A[1, 1] := 2.0; A[1, 2] := -3.0;
A[2, 0] := 0.0; A[2, 1] := -1.0; A[2, 2] := 1.0;
WriteMatrix(A, 'A');
SetLength(B, 3, 3);
B[0, 0] := -1.0; B[0, 1] := -3.0; B[0, 2] := 1.0;
B[1, 0] := +1.0; B[1, 1] := 2.0; B[1, 2] := -3.0;
B[2, 0] := 0.0; B[2, 1] := -2.0; B[2, 2] := 2.0;
WriteMatrix(B, 'B');
WriteMatrix(A*B, 'A*B');
WriteMatrix(MatInverse(A), 'inv(A)');
WriteMatrix(A*MatInverse(A), 'A*inv(A)');
WriteLn('det(A) = ');
WriteLn(MatDeterminant(A):10:3);
WriteLn;
WriteLn('Press ENTER to quit...');
ReadLn;
end.

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="BasicStats_test"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="BasicStats_test.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="BasicStats_test"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,26 @@
program BasicStats_test;
uses
MatrixUnit;
var
v: TDblVector;
mu, variance, sig: Double;
begin
SetLength(v, 5);
v[0] := 1.2;
v[1] := -4.3;
v[2] := 5.9;
v[3] := -9.6;
v[4] := 5.3;
VecMeanVarStdDev(v, mu, variance, sig);
WriteLn('Mean: ', mu:10:3);
WriteLn('Variance: ', variance:10:3);
WriteLn('Std.Dev.: ', sig:10:3);
ReadLn;
end.

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="multiple_regression"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="multiple_regression.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="multiple_regression"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,100 @@
program multiple_regression;
uses
SysUtils, Classes,
Globals, MatrixUnit, RegressionUnit;
var
L: TStrings;
xCols: IntDyneVec = nil;
yCol: Integer;
xData: TDblMatrix = nil;
yData: TDblVector = nil;
i, j: Integer;
sa: TStringArray = nil;
RegressionRes: TMultipleRegressionResults;
Labels: StrDyneVec = nil;
const
W = 20;
D = 3;
procedure WriteMatrix(A: TDblMatrix; RowLabels, ColLabels: StrDyneVec);
var
i,j: Integer;
n, m: Integer;
begin
MatSize(A, n,m);
Write('':W);
for j := 0 to High(ColLabels) do
Write(ColLabels[j]:W);
WriteLn;
for i := 0 to n-1 do
begin
Write(RowLabels[i]:W);
for j := 0 to m-1 do
Write(A[i,j]:W:D);
WriteLn;
end;
end;
begin
DefaultFormatSettings.DecimalSeparator := '.';
SetLength(xCols, 2);
xCols[0] := 0;
xCols[1] := 1;
yCol := 5;
SetLength(Labels, Length(xCols) + 1);
Labels[High(Labels)] := 'Intercept';
L := TStringList.Create;
try
L.LoadFromFile('..\..\data\cansas.tab');
sa := L[0].Split(#9);
for j := 0 to High(xCols) do
Labels[j] := sa[xCols[j]];
SetLength(xData, L.Count-1, 2);
SetLength(yData, L.Count-1);
for i:=1 to L.Count-1 do
begin
sa := L[i].Split(#9);
for j := 0 to High(xCols) do
xData[i-1, xCols[j]] := StrToFloat(sa[xCols[j]]);
yData[i-1] := StrToFloat(sa[yCol]);
end;
Write('Index':10);
for j := 0 to High(xCols) do
Write(Labels[j]:10);
WriteLn(sa[yCol]:10);
//WriteLn('Index':10, sa[0]:10, sa[1]:10, sa[yCol]:10);
for i := 0 to High(yData) do
begin
Write(i:10);
for j := 0 to High(xCols) do
Write(xdata[i, j]:10:3);
WriteLn(yData[i]:10:3);
end;
WriteLn;
finally
L.Free;
end;
MultipleRegression(xData, yData, 0.95, RegressionRes);
for i := 0 to High(Labels) do
WriteLn('B[' + Labels[i] + '] =':20, RegressionRes.Coeffs[i]:W:D);
WriteLn;
WriteLn('Variance-Covariance Matrix');
WriteMatrix(RegressionRes.VarCovar, Labels, Labels);
ReadLn;
end.

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="NormalDist_Test"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="NormalDist_Test.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="NormalDist_Test"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,26 @@
program NormalDist_Test;
uses
MathUnit;
const
dx = 0.2;
Range = 3.0;
var
i: Integer;
x, p, z: Double;
begin
WriteLn('x':20, 'p':20, 'z':20);
x := -Range;
while x <= Range do begin
p := NormalDist(x);
z := InverseNormaldist(p);
WriteLn(x:20:5, p:20:5, z:20:5);
x := x + dx;
end;
Readln;
end.

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,50 @@
program project1;
uses
Math,
MathUnit;
function Factorial(x: integer): longint; //integer;
var
decx: longint; // integer;
product: longint; //integer;
begin
decx := x;
product := 1;
while (decx > 0) do
begin
product := decx * product;
decx := decx - 1;
end;
result := product;
end;
function PoissonPDF_old(x: integer; a: double): Double;
begin
if (x < 0) then
Result := 0.0
else
Result := exp(-a) * power(a, x) / factorial(x);
end;
procedure Test(a: Double; delta: Integer);
var
i, n: Integer;
begin
WriteLn('a = ', a:0:5);
WriteLn;
WriteLn(' n Poisson PoissonPDF_old ');
WriteLn('---------- ------------------- -------------------');
for i := 0 to 20 do begin
n := i * delta;
WriteLn(n:10, PoissonPDF(n, a):20:5, PoissonPDF_old(n, a):20:5);
end;
WriteLn;
end;
begin
Test(9, 1);
ReadLn;
end.

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="TAChartLazarusPkg"/>
</Item>
<Item>
<PackageName Value="LMath"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="Project1.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,68 @@
program Project1;
uses
spe,
MathUnit;
const
xmax = 3.0;
dx = 0.5;
// values calculated by Excel (FDIST(x,df1,df2))
VALUES_10_20: array[0..6] of Double = (
0, 0.129839626, 0.524499532, 0.789053537, 0.910217285, 0.961096364, 0.982490459
);
VALUES_20_4: array[0..6] of Double = (
0, 0.13334765, 0.430681554, 0.622552784, 0.736037189, 0.806299776, 0.852248272
);
procedure Test(DF1, DF2: Integer);
var
i: Integer;
x, y_lazStats, y_numlib, y_excel: Double;
ok: string;
excel: Boolean;
begin
excel := ((DF1 = 20) and (DF2 = 4)) or ((DF1 = 10) and (DF2 = 20));
WriteLn('F distribution with ', DF1, ' and ', DF2, ' degrees of freedom');
WriteLn('---------------------------------------------------------------');
Write('x':15, 'y(lazstats)':15, 'y(numlib)':15);
if excel then Write('y(Excel)':15);
WriteLn('OK':15);
x := 0.0;
i := 0;
while (x <= xmax) do begin
y_numlib := FDist(x, DF1, DF2);
y_lazstats := ProbF(x, DF1, DF2);
if (DF1 = 20) and (DF2 = 4) then
y_Excel := 1.0 - VALUES_20_4[i]
else
if (DF1 = 10) and (DF2 = 20) then
y_Excel := 1.0 - VALUES_10_20[i]
else
y_Excel := 999.999;
if abs(y_lazstats - y_numlib) < 1E-6 then
ok := 'OK'
else
ok := 'ERROR';
Write(x:15:5, y_lazstats:15:5, y_numlib:15:5);
if excel then Write(y_Excel:15:5);
WriteLn(ok:15);
x := x + dx;
inc(i);
end;
WriteLn;
end;
begin
Test(20, 4);
Test(10, 20);
ReadLn;
end.

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,89 @@
program project1;
uses
math;
type
DblDyneVec = array of double;
procedure Exchange(var a, b: Double);
var
tmp: Double;
begin
tmp := a;
a := b;
b := tmp;
end;
procedure QuickSortOn(X: DblDyneVec; Y: DblDyneVec = nil; Z: DblDyneVec = nil);
procedure DoQuickSort(L, R: Integer);
var
I,J: Integer;
P: Integer;
begin
repeat
I := L;
J := R;
P := (L + R) div 2;
repeat
while CompareValue(X[P], X[I]) > 0 do inc(I);
while CompareValue(X[P], X[J]) < 0 do dec(J);
if I <= J then begin
if I <> J then begin
Exchange(X[I], X[J]);
if Y <> nil then
Exchange(Y[I], Y[J]);
if Z <> nil then
Exchange(Z[I], Z[J]);
end;
if P = I then
P := J
else if P = J then
P := I;
inc(I);
dec(J);
end;
until I > J;
if L < J then
DoQuickSort(L, J);
L := I;
until I >= R;
end;
begin
DoQuickSort(0, High(X));
end;
var
x: DblDyneVec;
y: DblDyneVec;
i: Integer;
begin
SetLength(x, 10);
SetLength(y, 10);
for i := 0 to High(x) do
begin
x[i] := Random(100);
y[i] := i;
end;
for i := 0 to High(x) do
WriteLn('i: x=', x[i]:0:0, ' y=', y[i]:0:0);
WriteLn;
QuickSortOn(X, Y);
for i := 0 to High(x) do
WriteLn(i, ': x=', x[i]:0:0, ' y=', y[i]:0:0);
ReadLn;
end.

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages>
<Item>
<PackageName Value="TAChartLazarusPkg"/>
</Item>
<Item>
<PackageName Value="LMath"/>
</Item>
</RequiredPackages>
<Units>
<Unit>
<Filename Value="Project1.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="..\..\source\units"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf2Set"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,49 @@
program Project1;
uses
spe,
MathUnit;
const
xmin = 0.0;
xmax = 3.0;
dx = 0.5;
DF = 10;
procedure Test(s: Integer);
var
i: Integer;
x, y_lazStats, y_numlib: Double;
ok: string;
begin
WriteLn('Student''s t distribution with ', DF, ' degrees of freedom (', s, '-sided)');
WriteLn;
WriteLn('x':15, 'y(lazstats)':15, 'y(numlib)':15, 'OK':15);
x := xmin;
while (x <= xmax) do begin
if x < 0 then
y_numlib := 1.0 - spe.tDist(-x, DF, s)
else
y_numlib := spe.tDist(x, DF, s);
if x < 0 then
y_lazstats := 1.0 - mathunit.tDist(-x, DF, s=1)
else
y_lazstats := mathunit.tDist(x, DF, s=1);
if abs(y_lazstats - y_numlib) < 1E-6 then
ok := 'OK'
else
ok := 'ERROR';
WriteLn(x:15:5, y_lazstats:15:5, y_numlib:15:5, ok:15);
x := x + dx;
end;
end;
begin
Test(1);
Test(2);
ReadLn;
end.

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="Project1"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<Units>
<Unit>
<Filename Value="Project1.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="Project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions>
<Item>
<Name Value="EAbort"/>
</Item>
<Item>
<Name Value="ECodetoolError"/>
</Item>
<Item>
<Name Value="EFOpenError"/>
</Item>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,43 @@
program Project1;
{$mode objfpc}{$H+}
uses
Math, SysUtils;
const
v1Min = 1.0;
v1Max = 3.0;
dv1 = 0.5;
v2Min = 1.0;
v2Max = 5.0;
dv2 = 0.5;
a = 1.0;
b = -2.0;
c = 100;
EPS = 1E-3;
REL_ERROR = 0.02;
var
v1, v2, res, dres: Double;
F: TextFile;
begin
AssignFile(F, 'linear_regression_2vars.csv');
Rewrite(F);
WriteLn(F, 'Var1,Var2,Result,Weights');
v1 := v1Min;
while v1 <= v1Max + EPS do
begin
v2 := v2min;
while v2 <= v2Max + EPS do
begin
res := a * v1 + b * v2 + c;
dres := res * REL_ERROR;
res := res + RandG(0, dres);
WriteLn(F, v1:0:3, ',', v2:0:3, ',', res:0:3, ',', dres:0:3);
v2 := v2 + dv2;
end;
v1 := v1 + dv1;
end;
CloseFile(F);
end.

View File

@ -0,0 +1,46 @@
Var1,Var2,Result,Weights
1.000,1.000,101.303,1.980
1.000,1.500,98.948,1.960
1.000,2.000,97.581,1.940
1.000,2.500,96.294,1.920
1.000,3.000,92.779,1.900
1.000,3.500,96.929,1.880
1.000,4.000,91.985,1.860
1.000,4.500,87.666,1.840
1.000,5.000,91.985,1.820
1.500,1.000,104.830,1.990
1.500,1.500,100.972,1.970
1.500,2.000,96.430,1.950
1.500,2.500,95.186,1.930
1.500,3.000,95.242,1.910
1.500,3.500,95.213,1.890
1.500,4.000,94.267,1.870
1.500,4.500,93.557,1.850
1.500,5.000,86.453,1.830
2.000,1.000,102.153,2.000
2.000,1.500,97.784,1.980
2.000,2.000,101.588,1.960
2.000,2.500,94.775,1.940
2.000,3.000,96.103,1.920
2.000,3.500,90.236,1.900
2.000,4.000,92.888,1.880
2.000,4.500,94.597,1.860
2.000,5.000,91.581,1.840
2.500,1.000,100.905,2.010
2.500,1.500,100.197,1.990
2.500,2.000,99.556,1.970
2.500,2.500,100.463,1.950
2.500,3.000,100.175,1.930
2.500,3.500,92.495,1.910
2.500,4.000,94.235,1.890
2.500,4.500,94.055,1.870
2.500,5.000,94.926,1.850
3.000,1.000,102.017,2.020
3.000,1.500,97.621,2.000
3.000,2.000,97.911,1.980
3.000,2.500,94.880,1.960
3.000,3.000,94.850,1.940
3.000,3.500,96.151,1.920
3.000,4.000,93.255,1.900
3.000,4.500,92.598,1.880
3.000,5.000,90.753,1.860
1 Var1 Var2 Result Weights
2 1.000 1.000 101.303 1.980
3 1.000 1.500 98.948 1.960
4 1.000 2.000 97.581 1.940
5 1.000 2.500 96.294 1.920
6 1.000 3.000 92.779 1.900
7 1.000 3.500 96.929 1.880
8 1.000 4.000 91.985 1.860
9 1.000 4.500 87.666 1.840
10 1.000 5.000 91.985 1.820
11 1.500 1.000 104.830 1.990
12 1.500 1.500 100.972 1.970
13 1.500 2.000 96.430 1.950
14 1.500 2.500 95.186 1.930
15 1.500 3.000 95.242 1.910
16 1.500 3.500 95.213 1.890
17 1.500 4.000 94.267 1.870
18 1.500 4.500 93.557 1.850
19 1.500 5.000 86.453 1.830
20 2.000 1.000 102.153 2.000
21 2.000 1.500 97.784 1.980
22 2.000 2.000 101.588 1.960
23 2.000 2.500 94.775 1.940
24 2.000 3.000 96.103 1.920
25 2.000 3.500 90.236 1.900
26 2.000 4.000 92.888 1.880
27 2.000 4.500 94.597 1.860
28 2.000 5.000 91.581 1.840
29 2.500 1.000 100.905 2.010
30 2.500 1.500 100.197 1.990
31 2.500 2.000 99.556 1.970
32 2.500 2.500 100.463 1.950
33 2.500 3.000 100.175 1.930
34 2.500 3.500 92.495 1.910
35 2.500 4.000 94.235 1.890
36 2.500 4.500 94.055 1.870
37 2.500 5.000 94.926 1.850
38 3.000 1.000 102.017 2.020
39 3.000 1.500 97.621 2.000
40 3.000 2.000 97.911 1.980
41 3.000 2.500 94.880 1.960
42 3.000 3.000 94.850 1.940
43 3.000 3.500 96.151 1.920
44 3.000 4.000 93.255 1.900
45 3.000 4.500 92.598 1.880
46 3.000 5.000 90.753 1.860