function NLIN_TPForecastFigure

% створюємо глобальну змінну TS, куди будуть записуватись дані
global TS; TS.index=0;
global TSTemp; TSTemp.index=0;

% визначаємо поточну розподільчу здатність, встановивши одиниці в PIXELS
set(0,'Units','pixels');
SCREEN_SIZE=get(0,'ScreenSize');
% SCREEN_SIZE = [left bottom width height]
SCRHeight=SCREEN_SIZE(1,4);

% створюємо фігуру розміром 100 x 600, що знаходиться у верхному лівому
% куті з відсутпом у 10 пікселів зверху та зліва
fg=figure('Position',[10,SCRHeight-330,300,300], 'Units','pixels', ...
          'HandleVisibility','on', 'MenuBar','none', 'Name','Function builder', ...
          'Resize','off', 'Tag','MFDFA set properties figure', ...
          'NumberTitle','off', 'DeleteFcn',@DeleteFcn_Callback);
      
% записуємо handle фігури
handles.rootFigure=fg;

% створюємо меню користувача
% =========================================================================
%%%% головне меню - пункт "ФАЙЛ"
menuRootFile=uimenu('Parent',fg, 'Label','Файл', 'Tag', 'Menu File');
% читання даних
menuRootFile_Level11=uimenu('Parent',menuRootFile, 'Label','Читать',...
                           'Tag','Menu File Load', 'Callback',@MenuFileLoad_Callback);
% збереження даних
menuRootFile_Level12=uimenu('Parent',menuRootFile, 'Label','Сохранить',...
                           'Tag','Menu File Save', 'Callback',@MenuFileSave_Callback);
% =========================================================================
%%%% головне меню - пункт "ГРАФІК"
menuRootGraphic=uimenu('Parent',fg, 'Label','График', 'Tag', 'Menu Graphic');
% відображення фігури з побудовою нового вікна
menuRootGraphic_Level1=uimenu('Parent',menuRootGraphic, 'Label','Строить график',...
                           'Tag','Menu Build Graphic', 'Callback',@MenuBuildGraphic_Callback);
% відображення фігури у поточному вікні із накладенням графіка
menuRootGraphic_Level2=uimenu('Parent',menuRootGraphic, 'Label','Добавить график',...
                           'Tag','Menu Append Graphic', 'Callback',@MenuAppendGraphic_Callback);
% =========================================================================
%%%% головне меню - пункт "ПЕРЕТВОРЕННЯ"
menuRootTransformation=uimenu('Parent',fg, 'Label','Преобразование', 'Tag', 'Menu Graphic');
% видалення тренду
menuRootTransformation_Level0=uimenu('Parent',menuRootTransformation, 'Label','Удалить тренд',...
                           'Tag','Menu Del Trend');
% видалення тренду шляхом віднімання
menuRootTransformation_Level01=uimenu('Parent',menuRootTransformation_Level0, 'Label','вычесть',...
                           'Tag','Menu Del Trend Subtraction', 'Callback',@MenuDelSubtraction_Callback);
% видалення тренду шляхом ділення
menuRootTransformation_Level02=uimenu('Parent',menuRootTransformation_Level0, 'Label','разделить',...
                           'Tag','Menu Del Trend Division', 'Callback',@MenuDelDivision_Callback);
% -------------------------------------------------------------------------
% приведення графіка
menuRootTransformation_Level1=uimenu('Parent',menuRootTransformation, 'Label','Привести график',...
                           'Tag','Menu On');
% приведення графіка по осі абсцис
menuRootTransformation_Level11=uimenu('Parent',menuRootTransformation_Level1, 'Label','по OX',...
                           'Tag','Menu On OX', 'Callback',@MenuOnOX_Callback);
% приведення графіка по осі ординат
menuRootTransformation_Level12=uimenu('Parent',menuRootTransformation_Level1, 'Label','по OY',...
                           'Tag','Menu On OY', 'Callback',@MenuOnOY_Callback);
% приведення графіка по обом осям
menuRootTransformation_Level13=uimenu('Parent',menuRootTransformation_Level1, 'Label','по OX и OY',...
                           'Tag','Menu On OXOY', 'Callback',@MenuOnOXOY_Callback);
% приведення графіка відніманням середнього
menuRootTransformation_Level14=uimenu('Parent',menuRootTransformation_Level1, 'Label','вычесть среднее',...
                           'Tag','Menu Sub Middle', 'Callback',@MenuSubMiddle_Callback);
% приведення графіка знаходження exp(x)
menuRootTransformation_Level15=uimenu('Parent',menuRootTransformation_Level1, 'Label','экспонента абсциссы',...
                           'Tag','Menu Exp OX', 'Callback',@MenuExpOX_Callback);
% приведення графіка знаходження ln(x)
menuRootTransformation_Level15=uimenu('Parent',menuRootTransformation_Level1, 'Label','логарифм абсциссы',...
                           'Tag','Menu Exp OX', 'Callback',@MenuLogOX_Callback);
% -------------------------------------------------------------------------
% пошук степеневого тренда
menuRootTransformation_Level2=uimenu('Parent',menuRootTransformation, 'Label','Найти степенной тренд',...
                           'Tag','Menu Pow Trend');
% пошук степеневого методом координатного спуску
menuRootTransformation_Level21=uimenu('Parent',menuRootTransformation_Level2, 'Label','метод координатного спуска',...
                           'Tag','Menu Pow Trend Coordinates', 'Callback',@MenuPowTrendCoordinates_Callback);
% пошук степеневого методом координатного спуску
menuRootTransformation_Level22=uimenu('Parent',menuRootTransformation_Level2, 'Label','метод наименьших квадратов',...
                           'Tag','Menu Pow Trend Coordinates', 'Callback',@MenuPowTrendMinSquare_Callback);
% -------------------------------------------------------------------------
% пошук тренда зовнішньої дотичної
menuRootTransformation_Level3=uimenu('Parent',menuRootTransformation, 'Label','Найти тренд огибающей',...
                           'Tag','Menu Envelope Trend', 'Callback',@MenuEnvelopeTrend_Callback);
% -------------------------------------------------------------------------
% пошук тригонометричних функцій
menuRootTransformation_Level4=uimenu('Parent',menuRootTransformation, 'Label','Найти тригонометрическую функцию',...
                           'Tag','Menu Trig Func');
% пошук тригонометричної апроксимуючої функції
menuRootTransformation_Level41=uimenu('Parent',menuRootTransformation_Level4, 'Label','Аппроксимировать тригонометрической функцией',...
                           'Tag','Menu Trig Func Approx', 'Callback',@MenuTrigFunc_Callback);
% пошук множника аргументу тригонометричної апроксимуючої функції
menuRootTransformation_Level41=uimenu('Parent',menuRootTransformation_Level4, 'Label','Аппроксимировать синусоидой',...
                           'Tag','Menu Sin Approx', 'Callback',@MenuSin_Callback);
% =========================================================================
%%%% головне меню - пункт "ПРОГНОЗ"
menuRootForecast=uimenu('Parent',fg, 'Label','Прогноз', 'Tag', 'Menu Forecast');
% побудова отриманої функції
menuRootForecast_Level51=uimenu('Parent',menuRootForecast, 'Label','Генерировать функцию для исходного ряда',...
                           'Tag','Menu Generate Function', 'Callback',@MenuGenerateFunction_Callback);
% розрахунок значень функції для ряду - беруться аргументи найпершого (нульового) ряду
menuRootForecast_Level52=uimenu('Parent',menuRootForecast, 'Label','Рассчитать значения функции',...
                           'Tag','Menu Calculate Function', 'Callback',@MenuCalculateFunction_Callback);
% обчислення точок, де знаходяться найближчі максимуми
menuRootForecast_Level53=uimenu('Parent',menuRootForecast, 'Label','Получить ближайшие максимумы',...
                           'Tag','Menu Calculate Max', 'Callback',@MenuCalculateMax_Callback);


% =========================================================================
% =========================================================================
% створюємо статичний текст 
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,275,297,25], ...
          'String','Ряды:', 'FontName','Times New Roman', ...
          'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо ListBox
handles.ListBoxTS=uicontrol(fg, 'Style','listbox', 'Units','pixels', 'Position',[3,75,297,200], ...
          'String','', 'FontName','Times New Roman', ...
          'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Tag', 'ListBoxTS', 'ListboxTop', 5);
      
guidata(fg,handles);

% =============================================================================================================================
% Функція, що виконується при закритті фігури
function DeleteFcn_Callback(h,eventdata,handles)

% очищення пам"яті, що використовувалась для локальних змінних
global TSTemp;
clear TSTemp;

% =============================================================================================================================
% вибір пункту меню "Прочитати файл"
function MenuFileLoad_Callback(h,eventdata,handles)

% читаємо ім"я файла
[FILENAME,PATHNAME,FILTERINDEX]=uigetfile( ...
    {'*.txt;*.dat;*.ts', 'Файлы с данными (*.txt, *.dat, *.ts)'}, ...
     'Выберите файл с временным рядом');

if ((FILENAME(1,1)~=0) & (PATHNAME(1,1)~=0))
    % читаємо дані з вибраного файла
    Y=load([PATHNAME FILENAME]);
    
    % необхідно мати вектор-стовпчик
    [m,n]=size(Y);
    if m==1
        Y=Y';
        [m,n]=size(Y);
    end
    
    X=[1:m];
    X=X';

    global TSTemp;
    
    % зберігаємо прочитані дані 
    NLIN_TPForecastSaveTS(X,Y,FILENAME,0,0);
    
    % отримуємо handle ListBox
    handles=guidata(gcbo);
    ListBoxTS=handles.ListBoxTS;
    STRINGS=get(ListBoxTS,'String');
    if (TSTemp.data{TSTemp.index}.prevIndex==0)
        STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  FILENAME ')' ]);
    else
        STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(TSTemp.data{TSTemp.index}.prevIndex) ') : ' FILENAME]);
    end
    set(ListBoxTS,'String',STRINGS);
end

% =============================================================================================================================
% вибір пункту меню "Зберегти файл"
function MenuFileSave_Callback(h,eventdata,handles)

global TSTemp;

[filename,pathname,filterindex]=uiputfile(...
    {'*.txt','Текстовые файлы (*.txt)'}, ...
     'Выберите файл','');

[m,n]=size(filename);
if (n<4) || (~((filename(n-3)=='.') && (filename(n-2)=='t') && (filename(n-1)=='x') && (filename(n)=='t')))
    filenameX=[filename '.dt'];
    filenameY=[filename '.ts'];
end
 
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

NAME=[pathname filenameX];
save(NAME,'X','-ASCII');
NAME=[pathname filenameY];
save(NAME,'Y','-ASCII');

% =============================================================================================================================
% вибір пункту меню "Будувати графік"
function MenuBuildGraphic_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% відображуємо графік ряду
fg=figure;
TSTemp.CurrentFigure=fg;
set(fg,'WindowButtonDownFcn',@WindowButtonDownFcn);
plot(TSTemp.data{index}.X,TSTemp.data{index}.Y);
title(TSTemp.data{index}.type);

% =============================================================================================================================
% вибір пункту меню "Додати графік"
function MenuAppendGraphic_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточну фігуру
figure(TSTemp.CurrentFigure);
hold on
plot(TSTemp.data{index}.X,TSTemp.data{index}.Y,'r');
hold off

% =============================================================================================================================
% вибір пункту меню "Привести графік по осі OX"
function MenuOnOX_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

mX=max(X);
X=X/mX;

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y,'OnOX',index,[mX 1]);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : приведение по OX']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Привести графік по осі OY"
function MenuOnOY_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

mY=max(Y);
Y=Y/mY;

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y,'OnOY',index,[1 mY]);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : приведение по OY']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Привести графік по осям OX та OY"
function MenuOnOXOY_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

mX=max(X);
X=X/mX;
mY=max(Y);
Y=Y/mY;

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y,'OnOXOY',index,[mX mY]);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : приведение по OX и OY']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Привести відніманням середнього"
function MenuSubMiddle_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;
[m,n]=size(Y);
mY=sum(Y)/m;
Y=Y-mY;

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y,'onSubMiddle',index,[0 mY]);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : приведение вычитанием среднего']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Привести знаходженням експоненти абсциси"
function MenuExpOX_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;
X=exp(X);

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y,'onExpOX',index,0);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : экспонента абсциссы']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Привести знаходженням логарифма абсциси"
function MenuLogOX_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;
X=log(X);

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y,'onLogOX',index,0);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : логарифм абсциссы']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Знайти степеневий тренд методом координатного спуску"
function MenuPowTrendCoordinates_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

A=PowCoeffs(X,Y);
Y2=GetPow(X,A);

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y2,'PowCoord',index,A);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : степенной тренд - координатный спуск']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Зайти степеневий тренд методом найменших квадратів"
function MenuPowTrendMinSquare_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

A=GeneralMinSquare(X,Y,2);
Y2=GetPoly(A,X);
Y2=Y2';

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y2,'PowGMS',index,A);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : степенной тренд - наименьшие квадраты']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Знайти тренд огинаючої"
function MenuEnvelopeTrend_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

[Xt,Yt]=GetLocalExtremum(X,Y,1);
A=GeneralMinSquare(Xt,Yt,2);
Y2=GetPoly(A,X);
%Y2=Y2';

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y2,'Envelope',index,A);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : степенной тренд огибающей']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Знайти тригонометричний тренд"
function MenuTrigFunc_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

A=BTrigCoeffs(X,Y);
Y2=GetTrig(X,A);

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y2,'TrigFunc',index,A);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : получение синусоиды']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Знайти синусоїду"
function MenuSin_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

% беремо поточні дані
X=TSTemp.data{index}.X;
Y=TSTemp.data{index}.Y;

%A=BTrigCoeffs(X,Y);
A=[14.5   pi/2];
Y2=sin(A(1)*X+A(2));

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X,Y2,'SinFunc',index,A);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : получение периода синусоиды']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Удалить тренд из ряда вычитанием"
function MenuDelSubtraction_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');
% беремо дані поточного графіка
X2=TSTemp.data{index}.X;
Y2=TSTemp.data{index}.Y;
Y2=Y2';

% беремо дані попереднього графіка
index2=TSTemp.data{index}.prevIndex;
X1=TSTemp.data{index2}.X;
Y1=TSTemp.data{index2}.Y;

% обраховуємо
Y=Y1-Y2;

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X1,Y,'DelSub',index,0);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : (' int2str(index2) ')-(' int2str(index) ')']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Удалить тренд из ряда делением"
function MenuDelDivision_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');
% беремо дані поточного графіка
X2=TSTemp.data{index}.X;
Y2=TSTemp.data{index}.Y;

% беремо дані попереднього графіка
index2=TSTemp.data{index}.prevIndex;
X1=TSTemp.data{index2}.X;
Y1=TSTemp.data{index2}.Y;

% обраховуємо
Y=Y1./Y2;

% зберігаємо отримані дані 
NLIN_TPForecastSaveTS(X1,Y,'DelDiv',index,0);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : (' int2str(index2) ')/(' int2str(index) ')']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Генерировать функцию для исходного ряда"
function MenuGenerateFunction_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

[RES,RESY,I,isY]=NLIN_TPForecastGenFunc(index);
[mY,nY]=size(RESY);
[mX,nX]=size(RES);

NAME=['AutoFunc' int2str(TSTemp.index+1)];
% зберігаємо отримані дані 
fid = fopen([NAME '.m'],'w');
fprintf(fid,['function y=' NAME '(x)\n\n']);
for i=1:mX
   fprintf(fid,'%s\n',RES(i,:));
end
fprintf(fid,'y=y+y1\n');
for i=1:mY
   fprintf(fid,'%s\n',RESY(i,:));
end
fclose(fid);

NLIN_TPForecastSaveTS(TSTemp.data{I}.X,0,'F',index,NAME);

% зберігаємо в ListBox
handles=guidata(gcbo);
ListBoxTS=handles.ListBoxTS;
STRINGS=get(ListBoxTS,'String');
STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : СГЕНЕРИРОВАННАЯ ФУНКЦИЯ']);
set(ListBoxTS,'String',STRINGS);

% =============================================================================================================================
% вибір пункту меню "Рассчитать значения функции"
function MenuCalculateFunction_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

if CmpStr(TSTemp.data{index}.type,'F')~=0
    errordlg('Для текущего ряда функция не рассчитывается!');
else
    Y=feval(TSTemp.data{index}.coeffs,TSTemp.data{index}.X);
    
    NLIN_TPForecastSaveTS(TSTemp.data{index}.X,Y,'RESULT',index,0);
    
    % зберігаємо в ListBox
    handles=guidata(gcbo);
    ListBoxTS=handles.ListBoxTS;
    STRINGS=get(ListBoxTS,'String');
    STRINGS=appendString(STRINGS,[int2str(TSTemp.index) ' ('  int2str(index) ') : РАССЧИТАННАЯ ФУНКЦИЯ']);
    set(ListBoxTS,'String',STRINGS);
end

% =============================================================================================================================
% вибір пункту меню "Получть ближайшие максимумы"
function MenuCalculateMax_Callback(h,eventdata,handles)

global TSTemp;

% отримуємо handle ListBox
handles=guidata(gcbo);
index=get(handles.ListBoxTS,'Value');

if CmpStr(TSTemp.data{index}.type,'SinFunc')~=0
    errordlg('Для текущего ряда функция не рассчитывается!');
else
    X=TSTemp.data{index}.X;
    A=TSTemp.data{index}.coeffs;
    
    [m,n]=size(X);
    X=[X; X+1];
    Y=sin(A(1)*X+A(2));
    INDEXES=[];
    index=m+2;
    while (index<m*2)
        if (Y(index-1,1)-Y(index-2,1)>0) && ((Y(index,1)-Y(index-1,1)<0))
            INDEXES=[INDEXES index-1];
        end
        index=index+1;
    end
    INDEXES_STR=[];
    [m,n]=size(INDEXES);
    for i=1:n
        if (i==1)
           INDEXES_STR=int2str(INDEXES(1,i));
       else
           INDEXES_STR=[INDEXES_STR ', ' int2str(INDEXES(1,i))];
       end
    end
    msgbox(['Имеем максимумы в точках с индексами : ' INDEXES_STR]);
end

% =============================================================================================================================
% вибір активного вікна
function WindowButtonDownFcn(src,eventdata)

global TSTemp;

TSTemp.CurrentFigure=gcf;
