home *** CD-ROM | disk | FTP | other *** search
- unit Frmcfit;
-
- interface
-
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, Buttons, StdCtrls, ExtCtrls, RChart, DCommon,
- Math1, Math2, NumLab;
-
- {===========================================================
- Please note, that the program CURVEFIT uses the units RChart
- and NumLab, which are not supplied with the MATH2 package. If
- you don't have them, you can download them from the following
- WWW site: http://qspr03.tuwien.ac.at/lo/
- ===========================================================}
-
- type
- TFrmMain = class(TForm)
- RChart1: TRChart;
- Panel1: TPanel;
- SBNewPnts: TSpeedButton;
- NLabFitQual: TNumLab;
- Panel2: TPanel;
- BButParabolFit: TBitBtn;
- BButCalcReciprLine: TBitBtn;
- BButHyper: TBitBtn;
- BButLogFit: TBitBtn;
- BButGaussFit: TBitBtn;
- BButLinFit: TBitBtn;
- BButExit: TBitBtn;
- SBClear: TSpeedButton;
- LblFormula: TLabel;
- Label1: TLabel;
- NLabRXY: TNumLab;
- LblParams: TLabel;
- procedure BButExitClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure RChart1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure SBNewPntsClick(Sender: TObject);
- procedure BButParabolFitClick(Sender: TObject);
- procedure BButCalcReciprLineClick(Sender: TObject);
- procedure BButHyperClick(Sender: TObject);
- procedure BButLogFitClick(Sender: TObject);
- procedure BButGaussFitClick(Sender: TObject);
- procedure BButLinFitClick(Sender: TObject);
- procedure SBClearClick(Sender: TObject);
- procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- private
- Stats1 : TCurveFit;
- public
- { Public declarations }
- end;
-
- var
- FrmMain: TFrmMain;
-
- implementation
-
- {$R *.DFM}
-
- const
- ChartXRes = 200;
-
- (*****************************************************************)
- procedure TFrmMain.BButExitClick(Sender: TObject);
- (*****************************************************************)
-
- begin
- close;
- end;
-
- (*****************************************************************)
- procedure TFrmMain.FormCreate(Sender: TObject);
- (*****************************************************************)
-
- begin
- Stats1 := TCurveFit.Create;
- end;
-
- (*****************************************************************)
- procedure TFrmMain.SBClearClick(Sender: TObject);
- (*****************************************************************)
-
- begin
- Stats1.Init;
- RChart1.ClearGraf;
- RChart1.ShowGraf;
- SbNewPnts.Down := false;
- LblFormula.Visible := false;
- LblParams.Visible := true;
- LblParams.Caption := '<---- click here to enter data';
- end;
-
-
- (*****************************************************************)
- procedure TFrmMain.RChart1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- (*****************************************************************)
-
- var
- rx, ry : double;
-
- begin
- if SBNewPnts.Down then
- begin
- RChart1.M2R (x,y, rx, ry);
- RChart1.MarkAt (rx,ry,4);
- Stats1.EnterStatValue (rx, ry);
- NLabRXY.Value := Stats1.CorrCoeff;
- RChart1.ShowGraf;
- end;
- end;
-
- (*****************************************************************)
- procedure TFrmMain.SBNewPntsClick(Sender: TObject);
- (*****************************************************************)
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- RChart1.ShowGraf;
- LblFormula.Visible := false;
- if not SBNewPnts.Down
- then LblParams.Caption := '<---- click here to enter data'
- else LblParams.Caption := 'click into chart to enter new data points';
- LblParams.Visible := true;
- end;
-
- (*****************************************************************)
- procedure TFrmMain.BButParabolFitClick(Sender: TObject);
- (*****************************************************************)
-
- var
- k0, k1, k2 : double;
- FitQUal : double;
- xstep : double;
- i : integer;
- x : double;
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- SbNewPnts.Down := false;
- Stats1.CalcParabolFit (k0, k1, k2, FitQual);
- NLabFitQual.Value := FitQual;
- RChart1.MoveTo (RChart1.RangeLoX,k0+k1*RChart1.RangeLoX+k2*sqr(RChart1.RangeLoX));
- xstep := (RChart1.RangeHiX-RChart1.RangeLoX) / ChartXRes;
- for i:=1 to ChartXRes do
- begin
- x := RChart1.RangeLoX+i*xstep;
- RChart1.DrawTo (x,k0+k1*x+k2*sqr(x));
- end;
- RChart1.ShowGraf;
- LblFormula.Caption := 'y = k0 + k1*x + k2*sqr(x)';
- LblParams.Caption := 'k0 = '+strf(k0,1,3)+' k1 = '+strf(k1,1,3)+' k2 = '+strf(k2,1,3);
- LblFormula.Visible := True;
- LblParams.Visible := true;
- end;
-
-
-
- (*****************************************************************)
- procedure TFrmMain.BButCalcReciprLineClick(Sender: TObject);
- (*****************************************************************)
-
- var
- k0, k1 : double;
- FitQUal : double;
- xstep : double;
- i : integer;
- x : double;
- denom : double;
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- SbNewPnts.Down := false;
- Stats1.CalcReciLinFit (k0, k1, FitQual);
- NLabFitQual.Value := FitQUal;
- denom := k0+k1*RChart1.RangeLoX;
- if denom <> 0 then
- RChart1.MoveTo (RChart1.RangeLoX,1/denom);
- xstep := (RChart1.RangeHiX-RChart1.RangeLoX) / ChartXRes;
- for i:=1 to ChartXRes do
- begin
- x := RChart1.RangeLoX+i*xstep;
- denom := k0+k1*x;
- if denom <> 0 then
- RChart1.DrawTo (x,1/denom);
- end;
- RChart1.ShowGraf;
- LblFormula.Caption := 'y = 1/(k0 + k1*x)';
- LblParams.Caption := 'k0 = '+strf(k0,1,3)+' k1 = '+strf(k1,1,3);
- LblFormula.Visible := True;
- LblParams.Visible := true;
- end;
-
-
-
- (*****************************************************************)
- procedure TFrmMain.BButHyperClick(Sender: TObject);
- (*****************************************************************)
-
- var
- k0, k1 : double;
- FitQUal : double;
- xstep : double;
- i : integer;
- x : double;
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- SbNewPnts.Down := false;
- Stats1.CalcHyperbolFit (k0, k1, FitQual);
- NLabFitQual.Value := FitQUal;
- if RChart1.RangeLoX <> 0
- then RChart1.MoveTo (RChart1.RangeLoX,k0+k1/RChart1.RangeLoX)
- else RChart1.MoveTo (RChart1.RangeLoX,MaxReal);
- xstep := (RChart1.RangeHiX-RChart1.RangeLoX) / ChartXRes;
- for i:=1 to ChartXRes do
- begin
- x := RChart1.RangeLoX+i*xstep;
- if x <> 0
- then RChart1.DrawTo (x,k0+k1/x)
- else RChart1.DrawTo (x,MaxReal);
- end;
- RChart1.ShowGraf;
- LblFormula.Caption := 'y = k0 + k1/x';
- LblParams.Caption := 'k0 = '+strf(k0,1,3)+' k1 = '+strf(k1,1,3);
- LblFormula.Visible := True;
- LblParams.Visible := true;
- end;
-
-
- (*****************************************************************)
- procedure TFrmMain.BButLogFitClick(Sender: TObject);
- (*****************************************************************)
-
- var
- k0, k1 : double;
- FitQUal : double;
- xstep : double;
- i : integer;
- x : double;
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- SbNewPnts.Down := false;
- Stats1.CalcLogFit (k0, k1, FitQual);
- NLabFitQual.Value := FitQUal;
- if RChart1.RangeLoX > 0
- then RChart1.MoveTo (RChart1.RangeLoX,k0+k1*ln(RChart1.RangeLoX))
- else RChart1.MoveTo (0, -MaxReal);
- xstep := (RChart1.RangeHiX-RChart1.RangeLoX) / ChartXRes;
- for i:=1 to ChartXRes do
- begin
- x := RChart1.RangeLoX+i*xstep;
- if x > 0 then
- RChart1.DrawTo (x,k0+k1*ln(x));
- end;
- RChart1.ShowGraf;
- LblFormula.Caption := 'y = k0 + k1*ln(x)';
- LblParams.Caption := 'k0 = '+strf(k0,1,3)+' k1 = '+strf(k1,1,3);
- LblFormula.Visible := True;
- LblParams.Visible := true;
- end;
-
-
-
- (*****************************************************************)
- procedure TFrmMain.BButGaussFitClick(Sender: TObject);
- (*****************************************************************)
-
- var
- k0, k1, k2 : double;
- FitQUal : double;
- xstep : double;
- i : integer;
- x : double;
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- SbNewPnts.Down := false;
- Stats1.CalcGaussFit (k0, k1, k2, FitQual);
- NLabFitQual.Value := FitQUal;
- x := RChart1.RangeLoX;
- RChart1.MoveTo (x,k0*exp(-sqr(x-k1)/k2));
- xstep := (RChart1.RangeHiX-RChart1.RangeLoX) / ChartXRes;
- for i:=1 to ChartXRes do
- begin
- x := RChart1.RangeLoX+i*xstep;
- RChart1.DrawTo (x,k0*exp(-sqr(x-k1)/k2));
- end;
- RChart1.ShowGraf;
- LblFormula.Caption := 'y = k0*exp(-sqr(x-k1)/k2)';
- LblParams.Caption := 'k0 = '+strf(k0,1,3)+' k1 = '+strf(k1,1,3)+' k2 = '+strf(k2,1,3);
- LblFormula.Visible := True;
- LblParams.Visible := true;
- end;
-
- (*****************************************************************)
- procedure TFrmMain.BButLinFitClick(Sender: TObject);
- (*****************************************************************)
-
- var
- k,d : double;
- FitQUal: double;
-
- begin
- while (RChart1.TypeOfLastItem <> tkMarkAt) and
- (RChart1.TypeOfLastItem <> tkNone) do { remove any curve from graph }
- RChart1.RemoveLastItem;
- SbNewPnts.Down := false;
- Stats1.CalcLinFit (k, d, FitQual);
- NLabFitQual.Value := FitQUal;
- RChart1.MoveTo (RChart1.RangeLoX,k*RChart1.RangeLoX+d);
- RChart1.DrawTo (RChart1.RangeHiX,k*RChart1.RangeHiX+d);
- RChart1.ShowGraf;
- LblFormula.Caption := 'y = k*x + d';
- LblParams.Caption := 'k = '+strf(k,1,3)+' d = '+strf(d,1,3);
- LblFormula.Visible := True;
- LblParams.Visible := true;
- end;
-
-
- (*****************************************************************)
- procedure TFrmMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- (*****************************************************************)
-
- begin
- Screen.cursor := crDefault;
- end;
-
-
- end.
-