for i:=nac+6 to nst do
sko3S:=sko3S+sqr(a[i]-ap3[i]);
sko3S:=sko3S/(nst-nac-6);
Str(sko3S:8:7,s);
edit1.Text:=s;
for i:=nac+6 to nst do
sapp3S:=sapp3S+abs(a[i]-ap3[i])/a[i];
sapp3S:=sapp3S/(nst-nac-6);
Str(sapp3S:8:7,s);
edit5.Text:=s;
for i:=nst to n do
sko3P:=sko3P+sqr(a[i]-ap3[i]);
sko3P:=sko3P/(n-nst);
Str(sko3P:8:7,s);
edit2.Text:=s;
for i:=nst to n do
sapp3P:=sapp3P+abs(a[i]-ap3[i])/a[i];
sapp3P:=sapp3P/(n-nst);
Str(sapp3P:8:7,s);
edit6.Text:=s;
end;//if sg1[0,1]<>''
end; // обучить нейросеть (конец)
procedure TForm1.Button8Click(Sender: TObject);//Сохранить нейросеть
begin
SaveNNS.InitialDir:='D:\CW';
SaveNNS.DefaultExt:='txt';
if SaveNNS.Execute then
begin
AssignFile(f4,SaveNNS.FileName);
Rewrite(f4);
writeln(f4,nns);
writeln(f4,nac);
writeln(f4,m);
for i:=1 to m do
for j:=1 to nac do
writeln(f4,cen[i,j]:12:10);
for i:=1 to m do
for j:=1 to nac do
writeln(f4,sigma[i,j]:12:10);
for i:=1 to m do
for j:=1 to nac do
writeln(f4,b[i,j]:12:10);
for i:=1 to m do
for j:=0 to nac do
if j<=nac then
writeln(f4,p[i,j])else begin
end;
for i:=1 to m do
for j:=1 to nac do
writeln(f4,cen3[i,j]:12:10);
for i:=1 to m do
for j:=1 to nac do
writeln(f4,sigma3[i,j]:12:10);
for i:=1 to m do
for j:=1 to nac do
writeln(f4,b3[i,j]:12:10);
for i:=1 to m do
for j:=0 to nac do
if j<=nac then
writeln(f4,p3[i,j])else begin end;
CloseFile(f4);
end;//if
end;//Сохранить нейросеть (конец)
// RUN
procedure TForm1.Button9Click(Sender: TObject);
var s:string;
l,nc:integer;//l - номер центра; nc - количество центров;
num,q:integer;//Количество итераций
nIt:longint;
sum,gama,pz,pz1,d,yP,x,sk:real; //y прогнозированное
tsk_w,tsk_w3,tsk,tsk3:array[1..mM]of real;//отвечает за третий слой
f1,f2,s_sign,s_w,s_sign3,s_w3:real;// взвешенная сумма сигналов и весов
begin
for q:=1 to n do
begin
s:=StringGrid1.Cells[0,q];
for k:=1 to Length(s) do
if (s[k]='.')or(s[k]=',') then s[k]:=decimalSeparator;
a[q]:=strToFloat(s);
end;
skoS:=0; skoP:=0;
skoP:=0; sko3P:=0;
ms:=0; mp:=0;
ms3:=0; mp3:=0;
sappS:=0;sappP:=0;sapp3s:=0;sapp3p:=0;
for num:=nac+2 to n do
begin
// Первый слой
// прогноз на 1 шаг
for i:=1 to nac do //цикл по входным переменным
for j:=1 to m do //цикл по правилам
myu[i,j]:=1/( 1+exp(Ln(abs((a[num-i]-cen[j,i])/sigma[j,i]))*2*b[j,i]) );
// Второй слой
// прогноз на 1 шаг
for j:=1 to m do
begin
myu0[j]:=1;
for i:=1 to nac do
myu0[j]:=myu0[j]*myu[j,i]; //Пересечение правил
end;
// Третий слой
// прогноз на 1 шаг
for j:=1 to m do
tsk[j]:=p[j,0];
for j:=1 to m do
for i:=1 to nac do
tsk[j]:=tsk[j]+p[j,i]*a[num-i];
for j:=1 to m do
tsk_w[j]:=tsk[j]*myu0[j];// y[k](x)*w[k]
//пятый слой
f1:=0;
for j:=1 to m do
f1:=f1+tsk_w[j];
f2:=0;
for j:=1 to m do
f2:=f2+myu0[j];
ap[num+1]:=f1/f2;
str(ap[num+1]:8:4,s);
stringGrid1.Cells[1,num+1]:=s;
str(a[num+1]-ap[num+1]:8:4,s);
stringGrid1.Cells[2,num+1]:=s;
end;
stringGrid1.Cells[2,n+1]:='';
//Сделали прогноз на 1 шаг
//-------------------------------------------
//Делаем прогноз на 3 шага
for num:=nac+3 to n do //цикл по обучающей выборке (НА 3 ШАГА ВПЕРЕД)
begin
// Первый слой
for i:=1 to nac do //цикл по входным переменным
for j:=1 to m do //цикл по правилам
myu3[i,j]:=1/(1+exp(Ln(abs((a[num-nac+i]-cen3[j,i])/sigma3[j,i]))*2*b3[j,i]) );
// Второй слой
for j:=1 to m do
begin
myu03[j]:=1;
for i:=1 to nac do
myu03[j]:=myu03[j]*myu3[j,i]; //Пересечение правил
end;
// Третий слой
for j:=1 to m do
tsk3[j]:=p3[j,0]; // для прогноза на 3 шага
for j:=1 to m do
for i:=1 to nac do
tsk3[j]:=tsk3[j]+p3[j,i]*a[num+i-nac];
for j:=1 to m do
tsk_w3[j]:=tsk3[j]*myu03[j];// y[k](x)*w[k]
//пятый слой
f1:=0;
for j:=1 to m do
f1:=f1+tsk_w3[j];
f2:=0;
for j:=1 to m do
f2:=f2+myu03[j];
ap3[num+3]:=f1/f2;
str(ap3[num+3]:8:4,s);
stringGrid1.Cells[3,num+3]:=s;
str(a[num+3]-ap3[num+3]:8:4,s);
stringGrid1.Cells[4,num+3]:=s;
end;
stringGrid1.Cells[4,num+1]:='';
stringGrid1.Cells[4,num+2]:='';
stringGrid1.Cells[4,num]:='';
// Сделали прогноз на 3 шага
// вычисляем критерий СКО и САПП для прогноза на 1 и 3 шага
skoS:=0; skoP:=0;
skoP:=0; sko3P:=0;
ms:=0; mp:=0;
ms3:=0; mp3:=0;
sappS:=0;sappP:=0;sapp3s:=0;sapp3p:=0;
for i:=nac+3 to nst do
skoS:=skoS+sqr(a[i]-ap[i]);
skoS:=(skoS/(nst-nac-3));
Str(skoS:8:7,s);
edit3.Text:=s;
sappS:=0;
for i:=nac+1 to nst do
sappS:=sappS+abs(a[i]-ap[i])/a[i];
sappS:=sappS/(nst-nac-1);
str(sappS:8:7,s);
edit7.Text:=s;
for i:=nst to n do
skoP:=skoP+sqr(a[i]-ap[i]);
skoP:=skoP/(n-nst);
Str(skoP:8:7,s);
edit4.Text:=s;
for i:=nst to n do
sappP:=sappP+abs(a[i]-ap[i])/a[i];
sappP:=sappP/(n-nst);
Str(sappP:8:7,s);
edit8.Text:=s;
sko3S:=0;
for i:=nac+6 to nst do
sko3S:=sko3S+sqr(a[i]-ap3[i]);
sko3S:=sko3S/(nst-nac-6);
Str(sko3S:8:7,s);
edit1.Text:=s;
for i:=nac+6 to nst do
sapp3S:=sapp3S+abs(a[i]-ap3[i])/a[i];
sapp3S:=sapp3S/(nst-nac-6);
Str(sapp3S:8:7,s);
edit5.Text:=s;
for i:=nst to n do
sko3P:=sko3P+sqr(a[i]-ap3[i]);
sko3P:=sko3P/(n-nst);
Str(sko3P:8:7,s);
edit2.Text:=s;
for i:=nst to n do
sapp3P:=sapp3P+abs(a[i]-ap3[i])/a[i];
sapp3P:=sapp3P/(n-nst);
Str(sapp3P:8:7,s);
edit6.Text:=s;
end;// RUN
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Mask,Grids;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Splitter1: TSplitter;
StaticText1: TStaticText;
StaticText2: TStaticText;
Bevel1: TBevel;
Bevel2: TBevel;
StaticText4: TStaticText;
StaticText5: TStaticText;
StaticText6: TStaticText;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Memo1: TMemo;
Label1: TLabel;
Edit5: TEdit;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure Edit3KeyPress(Sender: TObject; var Key: Char);
procedure Edit4KeyPress(Sender: TObject; var Key: Char);
procedure FormPaint(Sender: TObject);
procedure Edit5KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
// f: TextFile;
//n,nst,nac,neps,nrp:integer;
s:string;
sw:array[1..20]of string;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button2Click(Sender: TObject);
begin //Закрыть форму
Form2.close;
end;
procedure TForm2.FormResize(Sender: TObject);
begin
Button2.Top:=Form2.ClientHeight-Button2.Height-8;
Button1.Top:=Form2.ClientHeight-Button2.Height*2-16;
end;
procedure TForm2.FormCreate(Sender: TObject);
var i:integer;
begin
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
edit5.Text:='';
if nst>n then nst:=trunc(n/2);
str(Nst,s);
edit1.Text:=s;
if nac>nst then nac:=4;
str(Nac,s);
edit2.Text:=s;
if (neps<1)or(neps>1000)then neps:=10;
str(Neps,s);
edit3.Text:=s;
if(nrp<10)or(nrp>99)then nrp:=80;
str(Nrp,s);
edit4.Text:=s;
if (m>mM)or(m<1)then m:=5;
Form2.Memo1.Lines.Clear;
for i:=1 to nac do
Form2.Memo1.Lines[i-1]:=sw[i]+#13#10;
end;//Form2.create;
procedure TForm2.Button1Click(Sender: TObject);//Сохранить и выйти
begin
s:=edit1.Text;
nst:=abs(StrToInt(s));
if (nst>n)or(nst<2) then nst:=trunc(n/2);
s:=edit2.Text;
nac:=StrToInt(s);
s:=edit3.Text;
neps:=abs(StrToInt(s));
if (neps<1)or(neps>1000)then neps:=10;
s:=edit4.Text;
nrp:=StrToInt(s);
if(nrp<10)or(nrp>99)then nrp:=80;
s:=edit5.Text;
m:=StrToInt(s);
if (m>mM)or(m<1)then m:=5;
Form2.close;
end;//Сохранить и выйти (конец)
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13then
begin
s:=edit1.Text;
nst:=StrToInt(s);
if nst>n then nst:=trunc(n/2);
end;
if not(Key in [#8,'0'..'9'])then
Key:=#0;
end;
procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13then
begin
s:=edit2.Text;
nac:=StrToInt(s);
if nac>nst then nac:=4;
end;
if not(Key in [#8,'0'..'9'])then
Key:=#0;
end;
procedure TForm2.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13then
begin
s:=edit3.Text;
Neps:=StrToInt(s);
if (neps<1)or(neps>1000)then neps:=10;
end;
if not(Key in [#8,'0'..'9'])then
Key:=#0;
end;
procedure TForm2.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13then
begin
s:=edit4.Text;
nrp:=StrToInt(s);
if(nrp<10)or(nrp>99)then nrp:=80;
end;
if not(Key in [#8,'0'..'9'])then
Key:=#0;
end;
procedure TForm2.FormPaint(Sender: TObject);
var i:integer;
begin
edit1.Text:='';
edit2.Text:='';
edit3.Text:='';
edit4.Text:='';
if nst>n then nst:=trunc(n/2);
str(Nst,s);
edit1.Text:=s;
str(Nac,s);
edit2.Text:=s;
if (neps<1)or(neps>1000)then neps:=10;
str(Neps,s);
edit3.Text:=s;
if(nrp<10)or(nrp>99)then nrp:=80;
str(Nrp,s);
edit4.Text:=s;
if(m<1)or(m>mM)then m:=5;
str(m,s);
edit5.Text:=s;
Form2.Memo1.Lines.Clear;
Form2.Memo1.Lines[0]:='Весовые коэфициенты при прогнозированнии на 1 шаг'+#13#10;
for i:=1 to nac do
begin
str(w[i]:6:5,sw[i]);
Form2.Memo1.Lines[i]:=sw[i]+#13#10;
end;
Form2.Memo1.Lines[nac+1]: =' Весовые коэфициенты при прогнозированнии на 3 шагa'+#13#10;
for i:=1 to nac do
begin
str(w3[i]:6:5,sw[i]);
Form2.Memo1.Lines[nac+i+1]:=sw[i]+#13#10;
end;
//Form2.Memo1.Lines[nac+1]:=form1.nnit+#13#10;
end;
procedure TForm2.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13then
begin
s:=edit5.Text;
m:=StrToInt(s);
if (m>mM)or(m<1)then m:=5;
end;
if not(Key in [#8,'0'..'9'])then
Key:=#0;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const cc=0; dd=24;
var
Form3: TForm3;
i,j,k:integer;
max,min:real;
var d,xlong,ylong,u0x,u0y,w,h,wm,hm:integer;
s,inform:string;
implementation
uses Unit1;
{$R *.dfm}
//close
procedure TForm3.Button1Click(Sender: TObject);
begin
form3.Close;
end;
//fi
function fi(g:real):integer;
var h:real;
begin
h:=u0x-(g-min)*u0x/(max-min);
fi:=trunc(h);
end;
//Resize
procedure TForm3.FormResize(Sender: TObject);
var h:integer;
begin
max:=0;
min:=10000;
for i:=1 to n do
begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
Button1.Top:=Form3.ClientHeight-Button1.Height-8;
Form3.Refresh;
wm:=Form3.clientWidth;
hm:=Form3.clientHeight;
d:=1;
//Область рисования графика
with form3.canvas do
begin
Pen.color:=clblack;
Brush.Color:=clWhite;
Brush.Style:=bsSolid;
u0x:=hm-32-button1.height;
u0y:=32;
rectangle(dd,cc,wm-8,hm-16-button1.height);
xlong:=wm-u0y-16;
ylong:=u0x-8;
if n=0 then n:=1;
d:=trunc(xlong/n);
if d=0 then d:=1;
Pen.color:=clgreen; //вывод а
moveTo(u0y,fi(a[1]));
for i:=2 to n do
begin
moveTo(u0y+d*(i-1),fi(a[i-1]));
lineTo(u0y+d*i,fi(a[i]));
end;
Pen.color:=clred; //вывод ар
for i:=nac+3 to n do
begin
moveTo(u0y+d*(i-1),fi(ap[i-1]));
lineTo(u0y+d*i,fi(ap[i]));
end;
//вывод сетки и подписей
i:=trunc(min/10);
j:=trunc(max/10);
k:=i*10+5;
j:=j*10;
font.color:=clBlack;
font.Size:=14;
while k<=j+1 do
begin
inform:=IntTostr(k);
TextOut(1,fi(k),inform);
k:=k+5;
end;
font.Size:=10;
TextOut(Button1.Width+20,u0x+20,'Имя файла: '+fname);
TextOut(Button1.Width+20,u0x+40,'Зеленый - реальные данные; красный - спрогнозированные');
end;//with form3.canvas do
end;//form3.Resize
//Form3.active
procedure TForm3.FormActivate(Sender: TObject);
begin
max:=0;
min:=10000;
for i:=1 to n do
begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
Button1.Top:=Form3.ClientHeight-Button1.Height-8;
Form3.Refresh;
wm:=Form3.clientWidth;
hm:=Form3.clientHeight;
d:=1;
//Область рисования графика
with form3.canvas do
begin
Pen.color:=clblack;
Brush.Color:=clWhite;
Brush.Style:=bsSolid;
u0x:=hm-32-button1.height;
u0y:=32;
rectangle(dd,cc,wm-8,hm-16-button1.height);
xlong:=wm-u0y-16;
ylong:=u0x-8;
if n=0 then n:=1;
d:=trunc(xlong/n);
if d=0 then d:=1;
Pen.color:=clgreen;
moveTo(u0y,fi(a[1]));
for i:=2 to n do
begin
moveTo(u0y+d*(i-1),fi(a[i-1]));
lineTo(u0y+d*i,fi(a[i]));
end;
Pen.color:=clred;
for i:=nac+3 to n do
begin
moveTo(u0y+d*(i-1),fi(ap[i-1]));
lineTo(u0y+d*i,fi(ap[i]));
end;
//вывод сетки и подписей
i:=trunc(min/10);
j:=trunc(max/10);
k:=i*10+5;
j:=j*10;
font.color:=clBlack;
font.Size:=14;
while k<=j+1 do
begin
inform:=IntTostr(k);
TextOut(1,fi(k),inform);
k:=k+5;
end;
font.Size:=10;
TextOut(Button1.Width+20,u0x+20,'Имя файла: '+fname);
TextOut(Button1.Width+20,u0x+40,'Зеленый - реальные данные; красный - спрогнозированные');
end;//with form3.canvas do
end; // form3.active
procedure TForm3.FormCreate(Sender: TObject);
begin
end;
end.
unit matrices;
interface
Uses SysUtils;
type