From bba39d0ef519b32e1eaf59cafbc44da5f421e494 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Wed, 6 May 2020 17:25:42 +0000 Subject: [PATCH] LazStats: Fix polynomial smooth in AutoCorUnit. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7432 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../analysis/correlation/autocorunit.pas | 28 +++++++++++-------- .../analysis/correlation/polynomialunit.lfm | 5 ++-- .../analysis/correlation/polynomialunit.pas | 13 +++++++-- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/applications/lazstats/source/forms/analysis/correlation/autocorunit.pas b/applications/lazstats/source/forms/analysis/correlation/autocorunit.pas index 53bbe2266..a2eaeb195 100644 --- a/applications/lazstats/source/forms/analysis/correlation/autocorunit.pas +++ b/applications/lazstats/source/forms/analysis/correlation/autocorunit.pas @@ -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; diff --git a/applications/lazstats/source/forms/analysis/correlation/polynomialunit.lfm b/applications/lazstats/source/forms/analysis/correlation/polynomialunit.lfm index 49b790193..35236e530 100644 --- a/applications/lazstats/source/forms/analysis/correlation/polynomialunit.lfm +++ b/applications/lazstats/source/forms/analysis/correlation/polynomialunit.lfm @@ -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 diff --git a/applications/lazstats/source/forms/analysis/correlation/polynomialunit.pas b/applications/lazstats/source/forms/analysis/correlation/polynomialunit.pas index bd73bf57f..149f18a18 100644 --- a/applications/lazstats/source/forms/analysis/correlation/polynomialunit.pas +++ b/applications/lazstats/source/forms/analysis/correlation/polynomialunit.pas @@ -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}