function RES=SimpleGMDH(X,Y)
% Знаходження степеня поліному, що найкраще інтерполює набір точок (X,Y)
% Аргументи:
%   X - вектор-стовпчик аргументів
%   Y - вектор-стовпчик значень функції
% Результати:
%   RES - степінь поліному
% Обмеження:
%   1) передивляється поліноми степенів від 1 до 10
%   2) кількість елементів у векторах X та Y повинна бути однакова
%   3) вектори X та Y повинні мати або 1 рядок, або 1 стовпчик

% визначаємо кількість елементів вектора X
[m,n]=size(X);
% якщо рядок 1 - транспонуємо вектор X
if (m==1) X=X'; end
% визначаємо кількість елементів вектора Y
[m,n]=size(Y);
% якщо рядок 1 - транспонуємо вектор Y
if (m==1) Y=Y'; [m,n]=size(Y); end

% зміщуємо абсциси точок на додатню напіввісь, оскільки далі
% використовуються операції логарифмування (для абсцис)
if (min(X)<=0)
    X=X+abs(min(X))+1;
end

% створюємо нульову матрицю, куди будуть записуватись степені знайдених
% поліномів та відхилення для них
POLYNOMIALS=zeros(10,1);
% проходимо по всім можливим степеням поліномів (1-10) та визначаємо їх коефіцієнти
for polynomial_degree=1:10
    % створюємо нульові матриці для коефіцієнтів та вільних членів системи лінійних рівнянь
    A=zeros(polynomial_degree+1);
    B=zeros(polynomial_degree+1,1);
    % заповнюємо матриці
    for i=polynomial_degree:-1:0
        for j=polynomial_degree:-1:0
            SUM=0;
            for k=floor(m/2):m SUM=SUM+exp((i+j)*log(X(k,1))); end;
            A(i+1,j+1)=SUM;
            
            SUM=0;
            for k=floor(m/2):m SUM=SUM+Y(k,1)*exp(j*log(X(k,1))); end;
            B(j+1,1)=SUM;
        end
    end
    % розвєязуємо систему
    RES=SystemGauss(A,B);
    % розраховуємо квадратичне відхилення для знайденого поліному
    deviation=0;
    for i=1:floor(m/2)
        deviation=deviation+(Y(i,1)-GetPoly(RES,X(i,1)));
    end
    % зберігаємо відхилення у матриці POLYNOMIALS в рядку, номер якого
    % рівний степеню полінома
    POLYNOMIALS(polynomial_degree,1)=deviation;
    % disp([int2str(polynomial_degree) '   ' num2str(deviation)]);
end

% вибираємо найменше відхилення; номер рядка з ним і є степенем шуканого полінома
[MIN,RES]=min(abs(POLYNOMIALS));

% очищуємо локальні змінні
clear m n A B i j SUM k deviation POLYNOMIALS;