function [y1,remains,bestparams]=dosintrend_logabs(x,y,doplot);
n=length(y);
otn=y(n)/y(1);

if (1)%otn<0.5)
    
    % линейний тренд
    fprintf(1,'\tОтклонение первой и последней точки меньше 0.5 - используем линейное приближение\n');
    aprox_type=0;
    g1=fittype('a+b*x');
    %lin_aprox=polyfit(x,y,1);
    o1=fitoptions('Method','NonlinearLeastSquares','Lower',[-inf -inf],'Upper',[inf inf],'StartPoint',[0.005 0.005]);%,'Display','off');%transpose([a b ampl/2 dmax/2 0]));
    model=fit(x,y,g1,o1);
    %xmin=fseminf(inline('sum((a*exp(b*x)-y).*(a*exp(b*x)-y))'),0.005,0.005,x,y);
    a=model.a;
    b=model.b;
    %c=model.c;
    aa=ones(length(x),1)*a;
    bb=ones(length(x),1)*b;
    %cc=ones(length(x),1)*c;
    fprintf(1,'\tУравнение экспоненты: y=(%d+%d*x\n',a,b);

    exptrend=aa+x*b;
    %diff=abs((exptrend-y)./exptrend);
    diff=abs(exptrend-y);
    ampl=max(diff);
    %ampl=sum(diff)/length(diff);

    %a=lin_aprox(1);
    %b=lin_aprox(2);
    %xx=1:n;
    %aa=ones(length(x),1)*lin_aprox(1);
    %bb=ones(length(x),1)*lin_aprox(2);
    %fprintf(1,'\tУравнение линейного тренда: y=%d*x+%d\n',a,b);
    %lintrend=aa.*x+bb;
    %diff=abs(lintrend-y);
    %ampl=max(diff);
    fprintf(1,'\tИспользуем апроксимирующую функцию вида: y=(a*x+b)+log(1+c*sin(d*x+e))\n');
    g=fittype('(a+b*x)+c*sin(d*x+e)');
    %g=fittype('(a+b*x)+log(1+c*sin(d*x+e))');
    dmax=4*pi/n;
    % вариант 1.1 
    kkk=0;
    mindiff=inf;
    MinFreq=pi/15/n; % 0.5 колебания на весь ряд обучения
    MaxFreq=2*pi*20/n; % 7 колебаний на весь ряд обучения
    StepFreq=(MaxFreq-MinFreq)/10;
    UpperBoundary=[inf,inf,ampl,MaxFreq,2*pi];
    LowerBoundary=[-inf,-inf,0,MinFreq,-pi];
    ddd=MinFreq;
    while (ddd<=MaxFreq)%:StepFreq:MaxFreq%[dmax/2 dmax/4 3*dmax/4]
        for eee=[0 pi]
            kkk=kkk+1;
            fprintf(1,'\tВариант %d Частота - d= %d, фаза e=%d \n',kkk,ddd,eee);
            y1=approx(transpose([a b 0.3 ddd eee]),x,y,g,doplot,LowerBoundary,UpperBoundary);
            diff=sum(abs(y1-y))/n;
            fprintf(1,'\tОтклонение =%d\n',diff);
            if (diff<mindiff)%&&(min(y1)>0) %%Недопускаются нулевые значения синтренда. При делении - на нуль
                mindiff=diff;
                bestd=ddd;
                beste=eee;
                bestk=kkk;
            end
            if (doplot)
                title(strcat(num2str(kkk),' variant'));
            end
            ddd=ddd*1.5;
        end
    end
    fprintf(1,'Лучший вариант - %d Частота - d= %d, фаза e=%d \n',bestk,bestd,beste);
    [y1,bestparams]=approx(transpose([a b 0.3 bestd beste]),x,y,g,1,LowerBoundary,UpperBoundary);
    title(strcat(num2str(bestk),' variant - best!!!'));
    diff=sum(abs(y1-y))/n;
    fprintf(1,'Отклонение =%d\n',diff);
    remains=y-y1;
    bestparams.type=aprox_type;
else
    aprox_type=1;
    % експоненциальний тренд
    fprintf(1,'\tОтклонение первой и последней точки больше 0.5 - используем экспоненциальное приближение\n');
    aprox_type=1;
    xx=1:n;
    g1=fittype('log(a)+b*x');
    o1=fitoptions('Method','NonlinearLeastSquares','Lower',[0.00001 0.00001],'Upper',[0.1 0.1],'StartPoint',[0.005 0.005]);%,'Display','off');%transpose([a b ampl/2 dmax/2 0]));
    model=fit(x,y,g1,o1);
    %xmin=fseminf(inline('sum((a*exp(b*x)-y).*(a*exp(b*x)-y))'),0.005,0.005,x,y);
    a=model.a;
    b=model.b;
    %c=model.c;
    aa=ones(length(x),1)*a;
    bb=ones(length(x),1)*b;
    %cc=ones(length(x),1)*c;
    fprintf(1,'\tУравнение экспоненты: y=(%d*e^(%d*x))\n',a,b);

    exptrend=aa.*exp(x.*bb);
    diff=abs((exptrend-y)./exptrend);
    %ampl=max(diff);
    ampl=sum(diff)/length(diff);
    fprintf(1,'\tИспользуем апроксимирующую функцию вида: y=(a*exp(b*x))+(1+c*sin(d*x+e))\n');
    g=fittype('a*exp(b*x)*(1+c*sin(d*x+e))');
    dmax=4*pi/n;
    % вариант 1.1 
    kkk=0;
    mindiff=inf;
    MinFreq=pi/15/n; % 0.5 колебания на весь ряд обучения
    MaxFreq=2*pi*50/n; % 7 колебаний на весь ряд обучения
    StepFreq=(MinFreq-MaxFreq)/4;
    UpperBoundary=[inf,inf,ampl,MaxFreq,2*pi];
    LowerBoundary=[-inf,-inf,-ampl,MinFreq,-pi];

    for ddd=MaxFreq:StepFreq:MinFreq%[dmax/2 dmax/4 3*dmax/4]
        for eee=[0 pi]
            kkk=kkk+1;
            fprintf(1,'\tВариант  Частота - d= %d, фаза e=%d \n',ddd,eee);
            y1=approx2(transpose([a b 0.3 ddd eee]),x,y,g,doplot,LowerBoundary,UpperBoundary);
            diff=sum(abs(y1-y))/n;
            fprintf(1,'\tОтклонение =%d\n',diff);
            if (diff<mindiff)%&&(min(y1)>0) %%Недопускаются нулевые значения синтренда. При делении - на нуль
                mindiff=diff;
                bestd=ddd;
                beste=eee;
                bestk=kkk;
            end
            if (doplot)
                title(strcat(num2str(kkk),' variant'));
            end
        end
    end
    fprintf(1,'Лучший вариант - %d Частота - d= %d, фаза e=%d \n',bestk,bestd,beste);
    [y1,bestparams]=approx2(transpose([a b 0.3 bestd beste]),x,y,g,1,LowerBoundary,UpperBoundary);
    title(strcat(num2str(bestk),' variant - best!!!'));
    bestparams.type=aprox_type;
    diff=sum(abs(y1-y))/n;
    fprintf(1,'Отклонение =%d\n',diff);
    remains=y-y1;
end



%g=fittype('a+b*x+c*sin(d*x+e)');
%o=fitoptions('Method','NonlinearLeastSquares','StartPoint',transpose([1 2 2 .8 0.4]));
%model=fit(transpose(x),transpose(y),g,o);
%a=model.a;
%b=model.b;
%c=model.c;
%d=model.d;
%e=model.e;
%one1=ones(1,length(x));
%y1=a*one1+b*x+c*sin(d*x+e);

% Отношение последнего до первого. Если больше 0,5 - то линия (а)а, иначе
% експонента (б)
%(а) Находим лин. тренд.;
% Находим максимум отклонения ряда от тренда - амплитуда
% Апроксимир. фця вида (a+b*t)*(1+c*sin(d*t+e))
% 0<=c<=amplit, 0<=d<=wmax=4pi/tmax; 0<=e<=2pi
% Начальніе значения: Для а и б - из лин. тренда, с - половина максим. амплитуди
% 3 знач для частоті d: 1)wmax/2= 2pi/tmax; 2) wmax/4= pi/tmax; 3) 3*wmax/2= 3pi/tmax;
% faza: 0, pi 3pi/2
% (б)
function [y1,params]=approx(FirstPoint,x,y,g,doplot,LowerBoundary,UpperBoundary);
% Операция аппроксимации наименьшими квадратами. Начальные значения
% задаются в параметрах
    n=length(y);
    o=fitoptions('Method','NonlinearLeastSquares','StartPoint',FirstPoint,'Upper',UpperBoundary,'Lower',LowerBoundary);%transpose([a b ampl/2 dmax/2 0]));
    model=fit(x,y,g,o);
    a=model.a;
    b=model.b;
    c=model.c;
    d=model.d;
    e=model.e;
    params=[];
    params.type=0;
    params.a=a;
    params.b=b;
    params.c=c;
    params.d=d;
    params.e=e;
    %params.f=0;
    fprintf(1,'Получено уравнение: y=(%d*x+%d)+(1+%d*sin(%d*x+%d))',a,b,c,d,e);
    one1=ones(n,1); 
    %y1=(a*one1+b*x)+log(one1+c*sin(d*x+e));
    y1=(a*one1+b*x)+c*sin(d*x+e);
    if (doplot)
        figure;
        plot(y,'b');
        hold on;
        plot(y1,'r');
    end
function [y1,params]=approx2(FirstPoint,x,y,g,doplot,LowerBoundary,UpperBoundary);
% Операция аппроксимации наименьшими квадратами. Начальные значения
% задаются в параметрах
n=length(y);
% Параметры: а, б, амплитуда, частота (множитель при х в арг синуса), фаза
    o=fitoptions('Method','NonlinearLeastSquares','StartPoint',FirstPoint,'Upper',UpperBoundary,'Lower',LowerBoundary);%transpose([a b ampl/2 dmax/2 0]));
    model=fit(x,y,g,o);
    a=model.a;
    b=model.b;
    c=model.c;
    d=model.d;
    e=model.e;
    %f=model.f;
    params=[];
    params.type=1;
    params.a=a;
    params.b=b;
    params.c=c; 
    params.d=d;
    params.e=e;
    %params.f=f;
    fprintf(1,'Получено уравнение: y=%d*exp(x*%d)+1+%d*sin(%d*x+%d)',a,b,c,d,e);
    one1=ones(n,1);
    y1=((one1*a).*exp(b*x))+(one1+c*sin(d*x+e*one1));
    if (doplot)
        figure;
        plot(y,'b');
        hold on;
        plot(y1,'r');
    end
