Использование нечеткой искусственной нейронной сети TSK (Takagi, Sugeno, Kang’a) в задаче прогнозирования валютных курсов

Data : array of array of extended;

end;

{$IFNDEF XP_CMATRIX}

{$DEFINE XP_MATRIX}

TMap = array of integer;

{$ENDIF}

Vector = array of extended;

Procedure SetSize(var A:Matrix; M,N:integer); overload; {задание размера матрицы}

Procedure Zero(var A:Matrix); overload; {заполнение матрицы нулями }

Procedure E(var A:Matrix); overload; { единичная матрица }

Func

tion Transpose(const A:Matrix):Matrix; overload; { транспонирование матрицы }

Function Add(const A,B:Matrix):Matrix; overload; { сложение матриц }

Function Sub(const A,B:Matrix):Matrix; overload; { вычитанние матриц }

Function Mul(const A,B:Matrix):Matrix; overload; { умножение матриц }

Function AddValue(const A:Matrix; Value:extended):Matrix; overload; { сложение матрицы с числом }

Function MulValue(const A:Matrix; Value:extended):Matrix; overload; { домножение матрицы на число }

Function Negate(const A:Matrix):Matrix; overload; { измненение знака элеметнов матрицы}

Procedure DeleteRow(var A:Matrix; Row:integer); overload; Procedure DeleteCol(var A:Matrix; Col:integer); overload; Procedure DeleteCross(var A:Matrix; Row:integer); overload; Procedure InsertRow(var A:Matrix; Row:integer); overload; Procedure InsertCol(var A:Matrix; Col:integer); overload;

Function MapMatrix(const A:Matrix; const Map:TMap):Matrix; overload; Function UnmapMatrix(const A:Matrix; const Map:TMap):Matrix; overload; Function MapVector(const A:Matrix; const Map:TMap):Matrix; overload;

Function UnmapVector(const A:Matrix; const Map:TMap):Matrix; overload;

Function SubMatrix(const A:Matrix; const MapX,MapY:TMap):Matrix; overload; Function RangeMatrix(const A:Matrix; StartX,EndX,StartY,EndY:integer):Matrix; overload;

Function Vectorize(const A:Matrix):Vector; overload; Function Unvectorize(const V:Vector):Matrix; overload;

Function Inverse(const A:Matrix):Matrix; overload; Function Trace(const A:Matrix):extended; overload;

Procedure JoinBottom(var A:Matrix; const B:Matrix); overload;

Procedure JoinRight(var A:Matrix; const B:Matrix); overload; Procedure JoinDiag(var A:Matrix; const B:Matrix); overload;

implementation

Procedure SetSize(var A:Matrix; M,N:integer);

var

i : integer;

Begin

A.M:=M;

A.N:=N;

SetLength(A.Data,M);

for i:=0 to M-1 do begin

SetLength(A.Data[i],N);

end;

End;

Procedure Zero(var A:Matrix);

var

i,j : integer;

Begin

for i:=0 to A.M-1 do for j:=0 to A.N-1 do A.Data[i,j]:=0;

End;

Procedure E(var A:Matrix);

var

i : integer;

Begin

if (A.M<>A.N) then Raise Exception.Create('Попытка сформировать неквадратную единичную матрицу!');

Zero(A);

for i:=0 to A.M-1 do A.Data[i,i]:=1;

End;

Function Transpose(const A:Matrix):Matrix;

var

B : Matrix;

i,j : integer;

Begin

SetSize(B,A.N,A.M);

for i:=0 to A.M-1 do for j:=0 to A.N-1 do B.Data[j,i]:=A.Data[i,j];

Result:=B;

End;

Function Add(const A,B:Matrix):Matrix;

var

C : Matrix;

i,j : integer;

Begin

if ((A.M<>B.M) or (A.N<>B.N)) then Raise Exception.Create('Размеры матриц при сложении не совпадают!');

SetSize(C,A.M,A.N);

for i:=0 to A.M-1 do for j:=0 to A.N-1 do C.Data[i,j]:=A.Data[i,j]+B.Data[i,j];

Result:=C;

End;

Function Sub(const A,B:Matrix):Matrix;

var

C : Matrix;

i,j : integer;

Begin

if ((A.M<>B.M) or (A.N<>B.N)) then Raise Exception.Create('Размеры матриц при сложении не совпадают!');

SetSize(C,A.M,A.N);

for i:=0 to A.M-1 do for j:=0 to A.N-1 do C.Data[i,j]:=A.Data[i,j]-B.Data[i,j];

Result:=C;

End;

Function Mul(const A,B:Matrix):Matrix;

var

C : Matrix;

i,j,k : integer;

Begin

if (A.N<>B.M) then Raise Exception.Create('Размеры матриц при умножении не совпадают!');

SetSize(C,A.M,B.N);

Zero(C);

for i:=0 to A.M-1 do for j:=0 to B.N-1 do for k:=0 to A.N-1 do C.Data[i,j]:=C.Data[i,j]+A.Data[i,k]*B.Data[k,j];

Result:=C;

End;

Function Inverse(const A:Matrix):Matrix;

var

i,j,k : integer;

B : Matrix;

sk, sz : extended;

Begin

if (A.N<>A.M) then Raise Exception.Create('Попытка вычислить обратную матрицу для неквадратной матрицы!');

SetSize(B,A.M,A.M);

Zero(B);

for i:=0 to A.M-1 do B.Data[i,i]:=1;

for i:=0 to A.M-1 do begin

sk:=1/A.Data[i,i];

for j:=0 to A.M-1 do if (i<>j) then begin

sz:=sk*A.Data[j,i];

for k:=0 to A.M-1 do A.Data[j,k]:=A.Data[j,k]-sz*A.Data[i,k];

for k:=0 to A.M-1 do B.Data[j,k]:=B.Data[j,k]-sz*B.Data[i,k];

end;

for k:=0 to A.M-1 do A.Data[i,k]:=sk*A.Data[i,k];

for k:=0 to A.M-1 do B.Data[i,k]:=sk*B.Data[i,k];

end;

Result:=B;

End;

Function Trace(const A:Matrix):extended;

var

i : integer;

res : extended;

Begin

res:=0;

if (A.N<>A.M) then Raise Exception.Create('Попытка вычислить след для неквадратной матрицы!');

for i:=0 to A.M-1 do res:=res+A.Data[i,i];

Result:=res;

End;

Procedure JoinBottom(var A:Matrix; const B:Matrix);

var

i,j,oldy : integer;

Begin

if (A.N<>B.N) then Raise Exception.Create('Невозможно объединить две матрицы по вертикали. Их размеры не совпадают!');

oldy:=A.M;

SetSize(A,A.M+B.M,A.N);

for i:=0 to B.M-1 do for j:=0 to B.N-1 do A.Data[i+oldY,j]:=B.Data[i,j];

End;

Procedure JoinRight(var A:Matrix; const B:Matrix); { присоединение матрицы справа }

var

i,j,oldx : integer;

Begin

if (A.M<>B.M) then Raise Exception.Create('Невозможно объединить две матрицы по горизонтали. Их размеры не совпадают!');

oldx:=A.N;

SetSize(A,A.M,A.N+B.N);

for i:=0 to B.M-1 do for j:=0 to B.N-1 do A.Data[i,j+oldX]:=B.Data[i,j];

End;

Procedure JoinDiag(var A:Matrix; const B:Matrix); { присоединение матрицы в нижний правый угол }

var

i,j,oldx,oldy : integer;

Begin

oldY:=A.M;

oldX:=A.N;

SetSize(A,A.M+B.M,A.N+B.N);

for i:=0 to B.M-1 do for j:=0 to B.N-1 do A.Data[i+oldY,j+oldX]:=B.Data[i,j];

for i:=0 to oldY-1 do for j:=oldX to A.N-1 do A.Data[i,j]:=0;

for i:=oldY to A.M-1 do for j:=0 to oldX-1 do A.Data[i,j]:=0;

End;

Function Negate(const A:Matrix):Matrix;

var

i,j : integer;

B : Matrix;

Begin

SetSize(B,A.M,A.N);

for i:=0 to A.M-1 do for j:=0 to A.N-1 do B.Data[i,j]:=-A.Data[i,j];

Result:=B;

End;

Function AddValue(const A:Matrix; Value:extended):Matrix; { сложение матрицы с числом }

var

i,j : integer;

B : Matrix;

Begin

SetSize(B,A.M,A.N);

for i:=0 to A.M-1 do for j:=0 to A.N-1 do B.Data[i,j]:=A.Data[i,j]+Value;

Result:=B;

End;

Function MulValue(const A:Matrix; Value:extended):Matrix; { домножение матрицы на число }

var

i,j : integer;

B : Matrix;

Begin

SetSize(B,A.M,A.N);

for i:=0 to A.M-1 do for j:=0 to A.N-1 do B.Data[i,j]:=A.Data[i,j]*Value;

Result:=B;

Страница:  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15 
 16  17  18  19  20  21  22  23  24  25  26  27 


Другие рефераты на тему «Программирование, компьютеры и кибернетика»:

Поиск рефератов

Последние рефераты раздела

Copyright © 2010-2024 - www.refsru.com - рефераты, курсовые и дипломные работы