You've already forked lazarus-ccr
LazStats: Fix polynomial smooth in AutoCorUnit.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7432 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -89,6 +89,7 @@ type
|
||||
FExpSmoothAlpha: Double;
|
||||
FMovAvgRawWeights: DblDyneVec;
|
||||
FMovAvgOrder: Integer;
|
||||
FPolyOrder: Integer;
|
||||
function CalcMean(const pts: DblDyneVec; NoPts: Integer): Double;
|
||||
procedure ExponentialSmooth(var Pts: DblDyneVec; NoPts: Integer);
|
||||
procedure Four1(var data: DblDyneVec; nn: LongWord; isign: integer);
|
||||
@ -97,7 +98,7 @@ type
|
||||
procedure GetPts(var pts: DblDyneVec; var NoPts: Integer; DepVar: Integer);
|
||||
procedure MovingAverage(var Pts: DblDyneVec; NoPts: Integer);
|
||||
procedure PlotDifferencesForLag(var Pts: DblDyneVec; NoPts: Integer);
|
||||
procedure PolyFit(const pts: DblDyneVec; var avg: DblDyneVec; NoPts: integer);
|
||||
procedure PolyFit(const pts: DblDyneVec; var avg: DblDyneVec; NoPts, Order: integer);
|
||||
procedure PolynomialSmooth(var Pts: DblDyneVec; NoPts: Integer);
|
||||
procedure RealFT(var data: DblDyneVec; n: LongWord; isign: integer);
|
||||
procedure RemoveMeans(var Pts: DblDyneVec; NoPts: Integer; AMean: Double);
|
||||
@ -154,6 +155,7 @@ begin
|
||||
FMovAvgOrder := 1;
|
||||
FMovAvgRawWeights := nil;
|
||||
FExpSmoothAlpha := 0.99;
|
||||
FPolyOrder := 1;
|
||||
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
@ -202,7 +204,7 @@ procedure TAutoCorrFrm.FormCreate(Sender: TObject);
|
||||
begin
|
||||
Assert(OS3MainFrm <> nil);
|
||||
if PointsFrm = nil then Application.CreateForm(TPointsFrm, PointsFrm);
|
||||
FExpSmoothAlpha := 0.99;
|
||||
|
||||
ResetBtnClick(self);
|
||||
end;
|
||||
|
||||
@ -890,23 +892,22 @@ begin
|
||||
end;
|
||||
|
||||
procedure TAutoCorrFrm.PolyFit(const pts: DblDyneVec; var avg: DblDyneVec;
|
||||
NoPts: integer);
|
||||
NoPts, Order: integer);
|
||||
var
|
||||
X: DblDyneMat;
|
||||
XY: DblDyneVec;
|
||||
XTX: DblDyneMat;
|
||||
Beta: DblDyneVec;
|
||||
t, Yhat: double;
|
||||
i, j, k, order: integer;
|
||||
i, j, k: integer;
|
||||
RowLabels, ColLabels: StrDyneVec;
|
||||
begin
|
||||
order := StrToInt(PolynomialFrm.PolyEdit.Text);
|
||||
SetLength(X,NoPts,order+1);
|
||||
SetLength(XTX,order+2,order+2);
|
||||
SetLength(XY,order+1);
|
||||
SetLength(Beta,order+1);
|
||||
SetLength(RowLabels,NoPts+1);
|
||||
SetLength(ColLabels,NoPts+1);
|
||||
SetLength(X, NoPts, order+1);
|
||||
SetLength(XTX, order+2, order+2);
|
||||
SetLength(XY, order+1);
|
||||
SetLength(Beta, order+1);
|
||||
SetLength(RowLabels, NoPts+1);
|
||||
SetLength(ColLabels, NoPts+1);
|
||||
|
||||
// initialize
|
||||
for i := 0 to NoPts - 1 do
|
||||
@ -1424,9 +1425,12 @@ var
|
||||
begin
|
||||
F := TPolynomialFrm.Create(nil);
|
||||
try
|
||||
F.Order := FPolyOrder;
|
||||
if F.ShowModal <> mrOK then
|
||||
exit;
|
||||
|
||||
FPolyOrder := F.Order;
|
||||
|
||||
if ProjectChk.Checked then
|
||||
noProj := StrToInt(ProjPtsEdit.Text)
|
||||
else
|
||||
@ -1442,7 +1446,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
PolyFit(pts, avg, NoPts + noproj);
|
||||
PolyFit(pts, avg, NoPts + noproj, FPolyOrder);
|
||||
|
||||
// plot original and smoothed data
|
||||
PointsFrm.pts := pts;
|
||||
|
@ -9,7 +9,6 @@ object PolynomialFrm: TPolynomialFrm
|
||||
ClientHeight = 99
|
||||
ClientWidth = 351
|
||||
OnActivate = FormActivate
|
||||
OnShow = FormShow
|
||||
Position = poMainFormCenter
|
||||
LCLVersion = '2.1.0.0'
|
||||
object CancelBtn: TButton
|
||||
@ -76,9 +75,9 @@ object PolynomialFrm: TPolynomialFrm
|
||||
Top = 16
|
||||
Width = 152
|
||||
AutoSize = True
|
||||
BorderSpacing.Left = 100
|
||||
BorderSpacing.Left = 32
|
||||
BorderSpacing.Top = 16
|
||||
BorderSpacing.Right = 100
|
||||
BorderSpacing.Right = 32
|
||||
BorderSpacing.Bottom = 8
|
||||
BevelOuter = bvNone
|
||||
ClientHeight = 23
|
||||
|
@ -22,13 +22,15 @@ type
|
||||
PolyEdit: TEdit;
|
||||
Label1: TLabel;
|
||||
procedure FormActivate(Sender: TObject);
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure HelpBtnClick(Sender: TObject);
|
||||
procedure OKBtnClick(Sender: TObject);
|
||||
private
|
||||
{ private declarations }
|
||||
function GetOrder: Integer;
|
||||
procedure SetOrder(const AValue: Integer);
|
||||
public
|
||||
{ public declarations }
|
||||
property Order: Integer read GetOrder write SetOrder;
|
||||
end;
|
||||
|
||||
var
|
||||
@ -51,9 +53,9 @@ begin
|
||||
OKBtn.Constraints.MinWidth := w;
|
||||
end;
|
||||
|
||||
procedure TPolynomialFrm.FormShow(Sender: TObject);
|
||||
function TPolynomialFrm.GetOrder: Integer;
|
||||
begin
|
||||
PolyEdit.Text := '1';
|
||||
Result := StrToInt(PolyEdit.Text);
|
||||
end;
|
||||
|
||||
procedure TPolynomialFrm.HelpBtnClick(Sender: TObject);
|
||||
@ -81,6 +83,11 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPolynomialFrm.SetOrder(const AValue: Integer);
|
||||
begin
|
||||
PolyEdit.Text := IntToStr(AValue);
|
||||
end;
|
||||
|
||||
initialization
|
||||
{$I polynomialunit.lrs}
|
||||
|
||||
|
Reference in New Issue
Block a user