¹¦ÄÜ:ÓÃ×îС¶þ³Ë·¨Äâ½øÐÐy=a+bxÖ±ÏßÄâºÏ
×÷Õß:ÕÅÊÀƽ
ʱ¼ä:2005Äê6ÔÂ6ÈÕ
}
type
TLeastSquarFit = class
private
z: array[1..365*2, 1..itWidth + 1] of double;
PXi: array[1..365*2] of double;
s: array[1..365*2, 1..itWidth + 1] of double;
ResultY: array[1..itWidth + 1] of double;
ForecastDate: tdatetime;
N: integer;
a: double;
b: double;
protected
ii: integer;
sgm_pxi: double;
iss: double;
ips: double;
xip: double;
sip: double;
ds: double;
ms: double;
ys: double;
function LoadData(): boolean; //×°ÔؾØÕó
function Get_ii(): integer;
procedure Set_pxi();
function get_sgm_pxi: double;
function get_iss: double;
function get_ips: double;
function get_a: double;
function get_b: double;
procedure Set_s;
procedure Set_s_of_N_add_1;
procedure calc_result();
procedure save();
public
constructor Create(LForecastDate: tdatetime;
LhistoryN: integer); //¹¹Ô캯
// ForecastDate:string Ô¤²âδÀ´ÈÕÆÚ
// historyN:integer£ºÔ¤²â¸ù¾Ý ForecastDate Ç° historyNÌìµÄÊý¾Ý
function Execute(): boolean;
end;
var LeastSquarFit: TLeastSquarFit;
implementation
uses Pdm;
constructor TLeastSquarFit.Create(LForecastDate: tdatetime; LhistoryN: integer); //¹¹Ô캯Êý
begin
N := LhistoryN;
ForecastDate := LForecastDate;
end;
procedure TLeastSquarFit.save();
var i: integer;
begin
for i := 1 to itwidth do l_array := z[n + 1, i];
if not dm.save(ForecastDate, 'T_Forecast_3Result') then exit;
//--»¹Òª¼ÓÉÏÒѾ­ÖªµÀµÄÐÞÕýÖµ
DM.sq:=FORMAT(GetTxtFile('./SQL/¼ÓÐÞÕýÖµ.sql'),[FORMATDATETIME('YYYY-MM-DD',ForecastDate)]);
DM.Exe_SQ;
//----
// ɾ³ý T_Forecast_2DFastCalculate ÖеĵÚÒ»Ìõ
// dm.sq:='delete from T_Forecast_2DFastCalculate where iid in (select min(iid) as iid from T_Forecast_2DFastCalculate )';
// dm.Exe_SQ;
//v1.0 ²ÉÓò»É¾³ý·ñÔòÊý¾ÝϽµÃ÷ÏÔ
//°Ñ¸Õ¸ÕÔ¤²âµÄÒ²±£´æµ½T_Forecast_2DFastCalculate£¬´Ó¶øʵÏÖÁËÏÂÒ»´Îfast ¼ÆËã
if not dm.save(ForecastDate, 'T_Forecast_2DFastCalculate') then exit;
end;
function TLeastSquarFit.Execute: boolean;
begin
result := false;
if N < 2 then begin MSG('&Icirc;&THORN;·¨&Ocirc;¤&sup2;&acirc;&pound;&iexcl;&Ograve;&ordf;&Ccedil;ó&cedil;ù&frac34;&Yacute;2&Igrave;ì&Ograve;&Ocirc;&Eacute;&Iuml;&micro;&Auml;&Agrave;ú&Ecirc;·&Ecirc;&yacute;&frac34;&Yacute;&sup2;&Aring;&Auml;&Uuml;&Ocirc;¤&sup2;&acirc;!'); EXIT; end;
if not LoadData() then exit;
ii := Get_ii();
Set_PXi();
sgm_pxi := get_sgm_pxi();
iss := Get_iss();
ips := Get_ips();
a := Get_a();
b := Get_b();
Set_s();
Set_s_of_N_add_1(); //&cedil;ù&frac34;&Yacute;&Agrave;ú&Ecirc;·&pound;&not;&Ograve;&sup2;&frac34;&Iacute;&Ecirc;&Ccedil;&Eacute;&Iuml;&Atilde;&aelig;&micro;&Auml;s,&Ccedil;ó&AElig;&frac12;&frac34;ùs
PXi[n + 1] := a + b * (n + 1);
calc_result();
save();
result := true;
end;
procedure TLeastSquarFit.calc_result();
var i: integer;
begin
for i := 1 to itwidth do
begin
z[n + 1, i] := s[n + 1, i] * PXi[n + 1];
end;
end;
function TLeastSquarFit.Get_ii(): integer;
var i: integer;
begin
result := 0;
for i := 1 to n do result := result + i * i;
end;
procedure TLeastSquarFit.Set_PXi;
var i, t: integer;
d: double; //×&cent;&Ograve;&acirc; &cedil;ù&frac34;&Yacute;&Icirc;ó&sup2;&icirc;&Ocirc;&shy;&Agrave;í&pound;&not;&sup2;&raquo;&Ograve;&ordf;&Ograve;&Ocirc;&Icirc;&ordf;&sup2;&Eacute;&Oacute;&Atilde;d&Acirc;é·&sup3;
begin
for i := 1 to n do
begin
d := 0;
for t := 1 to itwidth do
begin
d := d + z[i, t];
end;
PXi := d / itwidth;
end;
end;
function TLeastSquarFit.get_sgm_pxi(): double;
var i: integer;
begin
result := 0;
for i := 1 to N do result := result + PXi;
end;
function TLeastSquarFit.get_iss: double;
var i: integer;
begin
result := 0;
for i := 1 to N do result := result + i;
end;
function TLeastSquarFit.get_ips: double;
var i: integer;
begin
result := 0;
for i := 1 to N do result := result + i * PXi;
end;
function TLeastSquarFit.get_a: double;
var D: DOUBLE;
begin
D := (ii * sgm_pxi - iss * ips);
result := D / (N * ii - iss * iss);
end;
function TLeastSquarFit.get_b: double;
begin
result := (sgm_pxi - n * a) / iss;
end;
procedure TLeastSquarFit.Set_s();
var i, j: integer;
begin
for i := 1 to N do
begin
for j := 1 to itwidth do
begin
s[i, j] := z[i, j] / PXi;
end;
end;
end;
procedure TLeastSquarFit.Set_s_of_N_add_1(); //&frac14;&AElig;&Euml;&atilde;&raquo;ú&sup3;&ouml;S N+1 &Igrave;ì
var i, j: integer;
d: double;
begin
for I := 1 to itwidth do
begin
d := 0;
for j := 1 to N do d := d + s[j, i];
s[n + 1, i] := d / n;
end;
end;
function TLeastSquarFit.LoadData(): boolean; //×°&Ocirc;&Oslash;&frac34;&Oslash;&Otilde;ó
var i, j: integer;
tmpdate: tdatetime;
IID:INTEGER;
begin
tmpdate := ForecastDate - n;
result := false;
DM.sq:='SELECT TOP 1 IID FROM T_Forecast_2DFastCalculate ORDER BY IID';
DM.Open_SQ;
IID:=DM.GFI('IID'); //IID±&Oslash;&Egrave;&raquo;&acute;&aelig;&Ocirc;&Uacute;
for i := 1 to N do
begin
dm.sq := 'select * from T_Forecast_2DFastCalculate WHERE IID='+INTTOSTR(IID) ;
dm.Open_SQ;
if dm.Eof then
begin
showmessage('&Icirc;&acute;&Ouml;&ordf;&acute;í&Icirc;ó&pound;&not;&Atilde;&raquo;&Oacute;&ETH;iid=' + inttostr(iid) + '&micro;&Auml;&Ocirc;¤&sup2;&acirc;&Ecirc;&yacute;&frac34;&Yacute;&pound;&iexcl;');
//&AElig;&auml;&Ecirc;&micro;&Otilde;&acirc;&cedil;&ouml;&acute;í&Icirc;ó&Ecirc;&Ccedil;&sup2;&raquo;&iquest;&Eacute;&Auml;&Uuml;·&cent;&Eacute;ú&micro;&Auml;&pound;&not;&Ograve;ò&Icirc;&ordf;iid &Oacute;&brvbar;&cedil;&Atilde;&Ecirc;&Ccedil;&Aacute;&not;&ETH;&oslash;&micro;&Auml;
exit;
end;
for j := 1 to itWidth do z[i, j] := dm.gfn('&Ecirc;±&iquest;&Igrave;' + fmt(j - 1));
tmpdate := tmpdate + 1;
inc(IID);
end;
result := true;
end;