function RES=GeneralMinSquare(X,Y,POWER)
% Знаходження коефіцієнтів поліному узагальненим методом найменших квадратів
% Аргументи:
%   X - вектор-стовпчик аргументів
%   Y - вектор-стовпчик значень функції
%   POWER - степінь полінома, коефіцієнти якого необхідно знайти
% Результати:
%   RES - вектор-рядок значень коефіцієнтів поліному
%         подається у вигляді RES(1)+RES(2)*X+RES(3)*X^2+RES(4)*X^3+...
% Обмеження:
%   1) POWER повинне бути цілим додатнім числом
%   2) кількість елементів у векторах X та Y повинна бути однакова
%   3) вектори X та Y повинні мати або 1 рядок, або 1 стовпчик

% оскільки індексація у матриці коефіцієнтів починається з 1 - збільшуємо степінь на 1
POWER=POWER+1;
% створюємо матрицю коефіцієнтів при невідомих та стовпчик вільних членів
A=zeros(POWER);
B=zeros(POWER,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

% генеруємо вектор-стовпчик одиниць, що має таку ж кількість елементів, як і X
XT=ones(m,1);

% проходимо по рядках матриці A, розраховуємо і записуємо значення
for i=1:POWER
    % записуємо перший елемент рядка
    A(i,1)=sum(XT);
    % записуємо елементи, що йдуть від поточного вздовж побічної діагоналі
    k=2;                                % починаємо із стовпчика 2
    for j=i-1:-1:1                      % всі рядки, що йдуть від поточного уздовж побічної діагоналі (вгору-вправо)
        A(j,k)=A(i,1);
        k=k+1;
    end
    % записуємо вільний член для поточного рядка
    B(i,1)=sum(XT.*Y);
    % знаходимо наступний степінь аргумента
    XT=XT.*X;
end
% частина матриці над побічною діагоналлю та на ній заповнена
% запивнимо частину, що лежить під побічною діагоналлю
for j=2:POWER
    % записуємо черговий елемент останнього рядка
    A(POWER,j)=sum(XT);
    % записуємо елементи, що йдуть від поточного вздовж побічної діагоналі
    k=j+1;                              % починаємо із стовпчика j+1
    for i=POWER-1:-1:j                  % всі рядки, що йдуть від поточного уздовж побічної діагоналі (вгору-вправо)
        A(i,k)=A(POWER,j);
        k=k+1;
    end
    % знаходимо наступний степінь аргумента
    XT=XT.*X;
end

% отримано матриці A та B, на основі яких знаходимо коефіцієнти інтерполяційного полінома
RES=SystemGauss(A,B);

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