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:
wp_xxyyzz
2020-05-06 17:25:42 +00:00
parent f2502d8ad3
commit bba39d0ef5
3 changed files with 28 additions and 18 deletions

View File

@ -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;

View File

@ -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

View File

@ -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}