Методы выделения тренд сезонной компоненты

Автор работы: Пользователь скрыл имя, 10 Июня 2011 в 00:22, курсовая работа

Описание

Сезонность, как правило, связывается исключительно со сменой

природно-климатических условий в рамках ограниченного промежутка времени

– годового периода. Наиболее ярко эта связь видна там, где исследуемые

процессы прямо связаны с естественными особенностями того или иного

времени года. Особенно ярко это проявляется в сельском хозяйстве, где объемы

производства продукции непосредственно зависят от влияния сезонности.

Например, объем удоя с одной головы будет варьироваться в течении года от

небольших ранней весной, до рекордных в середине лета и обратно до низких к

концу осени и зимой.

Содержание

Введение……………………………………………………………………...……3

1.Проблема сезонности тренда………………………………………………….4

2.Метод Четверякова …………………………………………………………… 8

3.Метод Шискина-Эйзенпресса …………………………………………………10

4.Решение задачи по выделению тренд-сезонной компоненты с

использованием ЭВМ…………………………………………………………… 13

5. Заключение …………………………………………………………….………42

Использованная литература …………………………………….…..…………..

Работа состоит из  1 файл

45нн6.doc

— 385.50 Кб (Скачать документ)

    Фостера-Стьюарта или метод Шискина-Эйзеншпресса.

    В таблице 1 приведен ряд ежемесячного среднего валового удоя с одной 

    коровы. Для  данного ряда  T0 =12, m=4, так что Т=12*4=48.

      Таблица 1 —  Средний валовой помесячный удой одной коровы, литров 
       

    Годы 1

    удой 
     


 


 


 


 


 


 


 


 

10 
 

11 
 

12 

    1 84 

93 

132 211 278 290 287 240 245 219 148 97 

    2

    3


86

89

90 

96

99

102 

135 190 250 280 299 250 230 203 140 98

143 210 290 300 298 271 254 210 158 101

138 203 287 293 294 270 263 230 153 112 

 

 
 
 
 
 
 
 

      350 

      300 

      250 

      200 

      150 

      100 

      50 


       
       
       
       

      Рисунок 1 - Средний валовой помесячный удой одной коровы, литров

      2. Метод Четверякова.

      1. Эмпирический ряд {Yt } выравнивается скользящей средней с периодом  
       

    скольжения  T0 ,   то   есть   берется  

T0+1  уровней   ряда,   из   которых   первый   и  

          T0 

    последний   берутся   с   половинным   весом:  á T0=áT



.   Выпадающие  2 



2 

    членов ряда с обоих его концов либо восстанавливаются  экстраполированием

    выровненного  ряда, либо остаются в стороне при  последующей стадии работ.

      Получаются  предварительная оценка тренда:

      Yt′ = U 1t

      и отклонение эмпирического ряда от выровненного

      1 

      lt=Yt Ytt = 1,..., T

      или 

      l = −

      ij Y Y

        ij ij 





    m j

1,..., ; 


1,..., T0) 

      Для   каждого   года   i   вычисляется s i - среднеквадратическое отклонение, на которое и делятся  затем  отдельные отклонения  (за месяц, за квартал).

 

 
 
 
 
 

      ~


       
       
       
       

l

ij 
 
 
 

      ij = ó

      где 


,                                               
 
 

        2 

        T

        0

        lij2− 

1

T

    0


     

        ói

    j

    =


    T

    0

     

    j

    =

    1

    T

    0


    ij 

     

    . 

        3.   Из   «нормированных»   таким   образом   отклонений   вычисляется 

      предварительная средняя сезонная волна:

          m 

        1

        V j 

    1

    ~l

    ij

    .                                           


    i

    =

    1 

        4.   Средняя   предварительная   сезонная   волна   умножается   на 

      среднеквадратическое   отклонение   каждого   года   и   вычисляется   из

      эмпирического ряда: 

      Ui1j = Yij - V1js i . 

        5.   Получающийся   таким   образом   ряд,   лишенный   предварительной 

      сезонной   волны,   вновь   сглаживается   скользящей   средней   (для   данных   по

      месяцам   по   пяти   или   семи   точкам   в   зависимости   от   интенсивности   мелких

      конъюнктурных колебаний и продолжительности  более крупных). В результате  
       

      получается  новая оценка тренда 
       

    (2)

    U

    t

    . 
     

        6. Отклонения  эмпирического ряда Yt от ряда 

        lt(2)=Yt Ut(2) 

    (2)

    U

    t 

    , полученного  в п. 5. 

        вновь подвергается аналогичной обработке по пп. 2 и 3 для выявления

      окончательной средней сезонной волны. 
       

          

    1. Исключение  окончательной сезонной волны  производится после

          

    умножения средней  сезонной волны на

    ki

    -

    коэффициент напряженности

        сезонной  волны: 
         

        Описанный метод был разработан Четвериковым в 1928 г. и в отличие от

      разработанных   ранее   методов   простой   средней,   метода   Персонса   и   других

      позволял исключать  влияние сезонной волны переменной структуры. 
       
       

        3. Метод Шискина-Эйзенпресса. 
         
         

        В методе Шискина-Эйзенпресса, кроме скользящей средней , на втором и

      последующих   этапах   итерационной   процедуры   применяются   более   сложные 

      пятнадцати-   и   двадцатиточечные   скользящие   Спенсера.   Они   имеют 

      соответственно  следующий вид 
       

     

     
     

        Скользящая  средняя с симметрично-равными  весами позволяет выделить

      лишь линейный тренд. Если же тренд на самом деле нелинеен, то сглаживание  

      временного  ряда дает искаженные его значения. Скользящая средняя Спенсера

      позволяет   получать   точные   оценки   тренда,   выраженного   полиномами   до

      третьей степени  включительно.

        Работа   метода   Шискина-Эйзенпресса   заключается   в   последовательном

      выполнении  следующих шагов: 
       

        1. 

    Исходный   ряд 

    {

    Y

    t

      выравнивается   скользящей   средней.   Делается  

      это,   как   в   методе   Четверикова,   с   той   целью,   чтобы   не   исказить   сезонную  

      компоненту  Vt .

        Если использовать скользящую среднюю с другим периодом скольжения,

      то это привело  бы к изменению как амплитуды, так и формы сезонной волы. 

        Вычисляются средние значения остаточного ряда в целом по ряду  l и по

      месяцам (кварталам)  l j : 
       

         
         

    m 

         

    l

    ij 

        l

         



    i

    =

    1

    m 

         

    .                                                 

         
         

    l 


    l

    j

    =

    1


    j 

        3. 

    0

    Находится предварительная оценка средней сезонной волны 

        ˆ1=

        V j l j l

        и строится новый ряд, относительно свободной  от сезонной компоненты 

        ˆ 1
         

    − 

    ˆ

    1

    .                                               

        Uij 

    Y V 

          ij 

    j 
     

        4. 
         

    К ряду U

    ij

     применяется  сглаживание скользящей средней  Спенсера: 

     

     
     
     
     
     

        Y
         
         
         
         
         
         


     
     
     
     
     


     
     
     
     

    1

    350 
     
     
     
     
     

    (

    − 
     
     
     
     
     

    Y

    t

    − 
     
     
     
     
     
     

    10 
     
     
     
     
     

    − 
     
     
     
     

      − 5Y − − 5Y − − 2Y − +

    3Y

    t

    t 8 t 7 t 6 
     
     
     
     
     

    6Y

    t

    − 
     
     
     
     
     
     


     
     
     
     
     


     
     
     
     
     

    18Y

    t

    − 
     
     
     
     
     
     


     
     
     
     
     

    + 

          + 33Yt − 


    47Y

    t

    − 


    +

    57Y

    t

    − 


    +

    60Y

    t

    +

    57Y

    t



    47Y

    t



    +

    33Y

    t



    + 

          + 18Yt


    +

    6Y

    t



    − 

    2Y

    t



    − 

    5Y

    t



    5Y

    t



    3Y

    t



    Y

    t


    10 

    )

    . 

        Реализовать   такое   сглаживание   можно   в   несколько   приемов,   используя 

      последовательно процедуры: 
       

        · 
         

    Сглаживание по пяти точкам: Y

    t

    ′ 


    Y

    t

    − 
     


    +

    Y

    t

    − 
     


    + +

    Y

    t 

    Y

    t

    +


     



    Y

    t


     

    2 
     

        · 
         

    Сглаживание по пяти точкам:  

    Y

    t

    =′

    Y

    t

    2

    +

    Y

    t

    1

    +

    Y

    t

    +

    Y

    t

    +

    1

    +

    Y

    t

              + 2 
               

        · 


         

        Сглаживание по семи точкам:

    =′

    Y

    t

    3

    +

    Y

    t

    2

    +

    Y

    t

    1

    +

    Y

    t

    +′ 

    Y

    t

    +

    1

    +

    Y

    t

    +

    2

    +

    Y

                t + 3

    5 
     

        · 


      7

    Сглаживание вида: 
     


         

    IV 
     


    Y

    t

    − 
     


    +

    Y

    t

    − 
     



      +′

    2Y

    t 

    Y

    t


     



    Y

    t


     

    2

    . 

        t

        5. 

        2

    Находится улучшенная оценка сезонной компоненты:

    m

    2

    )

    ∑ 

    Y

    ij 

    U

    ij 

        ˆ

    i


    .                                       

        V


    m

     

     

        4.   Решение   задачи   по   выделению   тренд-сезонной   компоненты   с

        использованием  ЭВМ 

        Как видим  из предыдущих разделов, решение подобных задач вручную 

      займет много  времени. Наиболее рациональным путем  проведения расчетов по

      выделению   тренд-сезонной   компоненты   является   использование   электронно-

      вычислительных  машин.

      Одним   из   путей   использования   ЭВМ   является   использование 

      электронных   таблиц  (MS   Excel).  При   использовании   электронных   таблиц

      необходимо   занести   первоначальные   данные   тренда   в   таблицу,   после   чего

      производить   ряд   последовательных   вычислений   с   применением 

      математических  формул. Этот путь значительно ускоряет процесс вычислений и 

      дает   точные   результаты,   однако   он   также   связан   с   больших   количеством

      однообразных  операций, которые невозможно автоматизировать полностью.

        По   этому,   самым   оптимальным   методом   решения   подобных   задач   с 

      использованием  ЭВМ является написание компьютерной программы на языке 

      программирования   (Pascal,   C++  и   др.).   Данный   метод   позволяет   полностью

      автоматизировать  процесс вычислений. Действия пользователя ограничиваются

      лишь   правильным   вводом   исходной   информации.   Если   использование 

      электронных   таблиц   является   универсальным   инструментом   расчетов,   то

      составленная   компьютерная   программа   может   быть   специализирована   для 

      решения конкретного  типа задачи.

        В данной курсовой рассмотрим компьютерную программу, написанную

      на   языке   программирования   высокого   уровня   С++.   Программа   производит

      расчеты с  применением Метода Шискина-Эйзенпресса  где в качестве цифровых

      фильтров используются средняя скользящая Спенсера, как  наиболее точного.

      Программа   выполнена   в   среде   С++   с   учетом   международных   стандартов

      ANSI/ISO для С++ и имеет консольный интерфейс.

        Исходный  код программы состоит из трех файлов: 

        1.

        2.

        3. 

    Основной файл кода, содержащий функцию main()

    Файл-заголовок  с наименованиями функций

    Файл с реализациями функций 

      Код первого  файла исходного кода программы представлен ниже:

      #include <iostream>

      #include <fstream>

      #include <cmath>

      #include <conio.h>

      #include "lib.h" 

      using namespace std; 
       
       

      int main()

      {

        ofstream outs;

        int n, m, l;

        bool method; 
         
         

        double les; // Необходима  при расчетах методом шискина

        outs.setf(ios::fixed);

        outs.setf(ios::showpoint);

        outs.precision(3); 
         
         

        hello();

        get_n_m(n, m);

        l = n * m; 
         
         

        prepare_file();

        outs.open("ot.vfd");

        if(outs.fail())

        {

          char g;

          cout << endl << "Ошибка!!!"

             << endl << "Вы ввели несуществующий файл!";

     

     
     

          g = _getch();

          exit(1);

        } 
         
         

        output_ryad("prprd.vfd", n, m, outs); 

        outs << endl << endl << "Выравнивание скользящей  средней:\n";

        skolz_sredn(l, n, "prprd.vfd", "virovn.vfd");

        output_ryad("virovn.vfd", n, m, outs); 
         
         

        outs << endl << endl << "Найдем lt(1)\n";

        make_lt("virovn.vfd", "lt.vfd", l, n);

        output_ryad("lt.vfd", n, m, outs); 
         
         

        {

          outs << endl << endl << "Найдем lj:\n";

          make_lj(n, m);

          output_ryad("lj.vfd", n, 1, outs); 
           
           

          outs << endl << endl << "Найдем l\n";

          les = make_l(n);

          outs << "L = " << les; 
           
           

          outs << endl << endl << "Найдем V(1)\n";

          make_v1(n, les);

          output_ryad("V.vfd", n, 1, outs); 
           
           

          outs << endl << endl << "Найдем U(1)\n";

          make_U(n, m);

          output_ryad("U1.vfd", n, m, outs); 
           
           

          outs << endl << endl << "Найдем U(2)\n";

          skolz_spenser(n, l);

          output_ryad("U2.vfd", n, m, outs);

        }

     

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     


       
       
       
       

    outs << endl << endl << "Найдем lt(2)\n";

    make_lt("U2.vfd", "lt2.vfd", l, n);

    output_ryad("lt2.vfd", n, m, outs); 
     
     

    {

      outs << endl << endl << "Найдем V(2)\n";

      make_v2(n, m);

      output_ryad("V2.vfd", n, 1, outs);

    } 
     
     

    outs << endl << endl << "Найдем epsilant\n";

    make_epsilant(n, m);

    output_ryad("epsilant.vfd", n, m, outs); 
     
     

    outs << endl << endl << "Найдем коэффициент k\n";

    make_k(n, m);

    output_ryad("k.vfd", 1, m, outs); 
     
     

    outs << endl << endl << "Решение:\n";

    result(n ,m);

    output_ryad("result.vfd", n, m, outs); 
     
     

    outs.close();

    rezapyatanie();

    return 0; 
     
     

    Рассматривая  исходный код, содержащийся в основном файле исходного  

      кода программы, мы можем проследить за алгоритмом ее выполнения. 

     

     

      Первыми выполняются  функции:

        hello();

        get_n_m(n, m);

        l = n * m;

      Они   отвечают   за   ввод   в   программу   исходных   данных   для   проведения

      расчетов, а  также находится значение T m × T0 ,  (соответствует коду l = n * m)

      Затем   идет   вызов   функций,   отвечающих   за   подготовку   файлов,

      необходимых для работы: 
       
       
       
       

        prepare_file();

        outs.open("ot.vfd");

        if(outs.fail())

        {

          char g;

          cout << endl << "Ошибка!!!"

             << endl << "Вы ввели несуществующий файл!";

          g = _getch();

          exit(1);

        } 
         
         

        output_ryad("prprd.vfd", n, m, outs); 
         
         

      Здесь   используется   система   файлов,   один   из   которых   необходим   для

      определения   условия   задачи,   а   остальные   могут   создаваться   в   процессе

      выполнения  счета. Работа данных функций будет  рассмотрена ниже.

      Следующие строки отвечают за все этапы вычислений:

        outs << endl << endl << "Выравнивание скользящей средней:\n";

        skolz_sredn(l, n, "prprd.vfd", "virovn.vfd");

     

     
     

                

        output_ryad("virovn.vfd", n, m, outs); 
         
         

        outs << endl << endl << "Найдем lt(1)\n";

        make_lt("virovn.vfd", "lt.vfd", l, n);

        output_ryad("lt.vfd", n, m, outs); 
         
         

        {

          outs << endl << endl << "Найдем lj:\n";

          make_lj(n, m);

          output_ryad("lj.vfd", n, 1, outs); 
           
           

          outs << endl << endl << "Найдем l\n";

          les = make_l(n);

          outs << "L = " << les; 
           
           

          outs << endl << endl << "Найдем V(1)\n";

          make_v1(n, les);

          output_ryad("V.vfd", n, 1, outs); 
           
           

          outs << endl << endl << "Найдем U(1)\n";

          make_U(n, m);

          output_ryad("U1.vfd", n, m, outs); 
           
           

          outs << endl << endl << "Найдем U(2)\n";

          skolz_spenser(n, l);

          output_ryad("U2.vfd", n, m, outs);

        } 
         
         

        {

     

     
     
     
     
     
     
     
     
     
     
     


         
         

          Скачано с: http://kuz0n.ucoz.ru  

    outs << endl << endl << "Найдем V(2)\n";

    make_v2(n, m);

    output_ryad("V2.vfd", n, 1, outs); 
     
     
     

        outs << endl << endl << "Найдем epsilant\n";

        make_epsilant(n, m);

        output_ryad("epsilant.vfd", n, m, outs); 
         
         

        outs << endl << endl << "Найдем коэффициент k\n";

        make_k(n, m);

        output_ryad("k.vfd", 1, m, outs);

        Для   каждого   вида   вычислений,   таких   как   например   использование

      скользящей  Спенсера, определена отдельная функция.

      Завершающие   строки   отвечают   за   вывод   решения   в   файл   и 

      преобразованию   данных,   которое   позволяет   использовать   полученные

      результаты  в электронных таблицах используя метод Drag and Drop.

        outs << endl << endl << "Решение:\n";

        result(n ,m);

        output_ryad("result.vfd", n, m, outs); 
         
         

        outs.close();

        rezapyatanie();

        return 0; 
         
         

      Рассмотрим   ближе   основные   функции   программы.   Для   этого   приведем

      исходный   код   заголовочного   файла,   в   котором   описаны   названия   функций,

      вводимые в  них параметры а также описано  назначение функций.

      #include <iostrea

     

     

      using namespace std; 
       
       

      void hello(); 
       
       
       

      // Функция-приветствие 
       
       

      void get_n_m(int& n, int& m);

      // Ввод значений n (количество столбцов) и m (количество  строк) 
       
       

      void prepare_file();

      // Функция  заменяет все точки в исходном  файле на зыпятые, шобы ця

      // довбана  программа распознавали их как  цыферы 
       
       

      void output_ryad(char input[], const int& n, const int& m, ofstream& outs);

      // Выводит  в поток outs табличные данные  из файла с именем inpit[]. 
       
       

      void skolz_sredn(const int& l, const int& n, char vhod[], char vihod[]);

      // Функция  нажождения скользящей средней.  Данные поступают из файла 

      vhod[]

      // в файл vihod[].

      // n - количество  столбцов.

      // l - длина всего ряда 
       
       

      void make_lt(char uclov[], char vivod[], const int& l, const int& n);

      // Функция  нахождения lt их файла с условием  uslovie[] и выводит в файл 

      vivod[] 
       
       

      void make_epsilant(const int& n, const int& m);

      // Ищет эпсилант

     

          

    void make_k(const int& n, const int& m);

      // Ищет коэффициент "К" 
       
       

      void make_lj(const int& n, const int& m);

      // Расчет в  методе Шыскина значений l_j 
       
       

      double make_l(const int& n);

      // Возвращает  значение l в методи Шискина 
       
       

      void make_v1(const int& n, const double& l);

      // Находит V1 по метода Шискина 
       
       

      void make_U(const int& n, const int& m);

      // Находит U1 по методу Шискина 
       
       

      void skolz_spenser(const int& n, const int& l);

      // Скольящая Спенсера 
       
       

      void make_v2(const int& n, const int& m);

      // V2 по Шискину 
       
       

      void result(const int& n, const int& m);

      // Выводит  рызультаты 
       
       

      void rezapyatanie();

      //   преобразует   исходный   файл   для   последующего   использования     в 

      электронных таблицах.

     

     
     
     

      Теперь рассмотрим каждую приведенную функцию более  детально. Для 

      этого приведем код реализации для каждой функции  из последнего файла. 
       
       

      void get_n_m(int& n, int& m)

      {

        cout << endl << "ВНИМАНИЕ!!!"

            <<   endl   <<   "Следует   верно   вводить   исходные   данные.   Иначе

      результаты  расчетов будут неверны\n";

        cout << "Введите  количество n:";

        cin  >> n;

        cout << "Введите  количество m:";

        cin  >> m;

      }

      В   данной   функции   производится   ввод   значений   количества   строк   и 

      столбцов таблицы с исходными данными.

      void prepare_file()

      {

        ifstream ins;

        ofstream outs;

        char symbol; 
         
         

        ins.open("tablicya.txt");

        outs.open("prprd.vfd"); 
         
         

        while(ins.get(symbol))

        {

          if(symbol == ',')

            outs << '.';

          else

     

     
     
     
     
     
     
     

        } 
         
         

        ins.close();

        outs.close();


       

    outs << symbol; 

      Данная функция  заменяет в файле с исходными  данными все символы «,» 

      (запятая) на  символы «.» (точка). Это необходимо  для того, чтобы программа 

      верно распознавала данные, вводимые в программу. 
       
       

      void output_ryad(char input[], const int& n, const int& m, ofstream& outs)

      {

        ifstream ins;

        double x; 
         
         

        ins.open(input); 
         
         

        for(int i = 0; i < m; i++)

        {

          for(int j = 0; j < n; j++)

          {

            ins  >> x;

            outs << x << '\t';

          }

          outs << endl;

        } 
         
         

        ins.close();

      } 

     

     
     
     

      Функция   применяется   для   переноса   данных   из   исходного   файла   во

      временный для  произведения последующих вычислений. 
       
       

      void skolz_sredn(const int& l, const int& n, char vhod[], char vihod[])

      {

        double ryad[5]; 
         
         

        ifstream ins;

        ofstream outs; 
         
         

        ins.open(vhod);

        outs.open(vihod); 
         
         

        outs.setf(ios::fixed);

        outs.setf(ios::showpoint);

        outs.precision(8); 
         
         

        ins  >> ryad[0] >> ryad[1] >> ryad[2] >> ryad[3] >> ryad[4];

        outs << ryad[0] << '\t' << ryad[1] << '\t'; 
         
         
         
         

        for(int i = 2, count = 3; i <= (l - 4); i++, count++)

        {

          outs << ( 

                ((ryad[0] / 2)

                  ryad[1]

                  ryad[2]

                  ryad[3]

                  (ryad[4] / 2) 

    +

    +

    +

    +

    ) 

     

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     


         
         
         

        ) / 5 << '\t'; 
         
         

    if(count >= n)

    {

      outs << endl;

      count = 0;

    } 
     
     

    for(int j = 0; j < 4; j++)

    {

      ryad[j] = ryad[j + 1];

    }

    ins  >> ryad[4]; 
     
     
     

        outs << ( 
         
         
         
         
         

      ((ryad[0] / 2)

        ryad[1]

        ryad[2]

        ryad[3]

      (ryad[4] / 2)

    ) / 5 << '\t'; 
     
     
     
     
     

    +

    +

    +

    +

    ) 
     
     
     

        outs << ryad[3] << '\t' << ryad[4]; 
         
         

        ins.close();

        outs.close();

      }

      Данная функция  является программной реализацией  скользящей средней с  

     

     
     
     
     

      n = 5. 
       
       
       

      void make_lt(char uclov[], char vivod[], const int& l, const int& n)

      {

        ifstream ins1, ins2;

        ofstream outs; 
         
         

        ins1.open("prprd.vfd");

        ins2.open(uclov);

        outs.open(vivod); 
         
         

        double ryad, virovn; 
         
         

        for(int i = 0, count = 1; i < l; i++, count++)

        {

          ins1 >> ryad;

          ins2 >> virovn;

          outs << ryad - virovn << '\t'; 
           
           

          if(count >= n)

          {

            outs << endl;

            count = 0;

          }

        } 
         
         

        ins1.close();

        ins2.close();

        outs.close();

      } 

     

     
     
     

      Функция отвечает за вычисление значения lt. 
       
       

      void make_epsilant(const int& n, const int& m)

      {

        double *V = new double[m];

        double x;

        ifstream ins1, ins2;

        ofstream outs; 
         
         

        ins1.open("V2.vfd");

        ins2.open("lt2.vfd");

        outs.open("epsilant.vfd"); 
         
         

        outs.setf(ios::fixed);

        outs.setf(ios::showpoint);

        outs.precision(8); 
         
         

        for(int i = 0; i < n; i++)

        {

          ins1 >> V[i];

        } 
         
         

        for(int i = 0; i < m; i++)

        {

          for(int j = 0; j < n; j++)

          {

            ins2 >> x;

            outs << x - V[j] << '\t';

          }

     

     
     
     
     
     
     
     


         
         
         
         

    outs << endl; 
     
     
     
     
     

        ins1.close();

        ins2.close();

        outs.close(); 
         
         

        delete [] V;

      }

      Функция производит вычисление значений эпсилант. 
       
       

      void make_k(const int& n, const int& m)

      {

        double l_eps, eps_kvadr;

        double l, e; 
         
         

        ifstream ins1;

        ifstream ins2;

        ofstream outs; 
         
         

        ins1.open("lt2.vfd");

        ins2.open("epsilant.vfd");

        outs.open("k.vfd"); 
         
         

        outs.setf(ios::fixed);

        outs.setf(ios::showpoint);

        outs.precision(8); 
         
         

        for(int i = 0; i < m; i++) 

     

     
     
     
     


         
         
         
         
         
         
         

    l_eps = 0;

    eps_kvadr = 0; 
     

      
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     


         
         
         

    for(int j = 0; j < n; j++)

    {

      ins1 >> l;

      ins2 >> e;

      l_eps += l * e;

      eps_kvadr += pow(e, 2);

    } 
     
     

    outs << l_eps / eps_kvadr << endl; 
     
     
     

        ins1.close();

        ins2.close();

        outs.close();

      }

      Функция вычисления значения коэффициента К. 
       
       

      void make_lj(const int& n, const int& m)

      {

        ifstream ins;

        ofstream outs; 
         
         

        ins.open("lt.vfd");

        outs.open("lj.vfd"); 

     

     
     
     

        double *Lj = new double[n]; 
         
         

        for(int i = 0; i < n; i++)

        {

          Lj[i] = 0;

        } 
         
         

        for(int i = 0; i < m; i++)

        {

          for(int j = 0; j < n; j++)

          {

            double x = 0;

            ins >> x;

            Lj[j] += x;

          }

        } 
         
         

        for(int i = 0; i < n; i++)

        {

          outs << Lj[i] / m << '\t';

        } 
         
         

        ins.close();

        outs.close();

      }

      Функция производит расчеты значений lj соответственно формулам 
       
       

      double make_l(const int& n)

      {

     

     
     
     
     

        ifstream ins;

        double sum = 0, x; 
         
         

        ins.open("lj.vfd"); 
         
         

      
     
     
     

        for(int i = 0; i < n; i++)

        {

          ins  >> x;

          sum += x;

        } 
         
         

        ins.close(); 
         
         

        return sum / n;

      }

      Расчет значения l. 
       
       

      void make_v1(const int& n, const double& l)

      {

        ifstream ins;

        ofstream outs;

        double x; 
         
         

        ins.open("lj.vfd");

        outs.open("V.vfd"); 
         
         

        for(int i = 0; i < n; i++)

        {

          ins  >> x; 

     

     
     
     
     
     
     
     


         
         

    outs << x - l << '\t'; 
     
     
     

        ins.close();

        outs.close();

      }

      Расчет значений V1. 
       
       

      void make_U(const int& n, const int& m)

      {

        double *V = new double[m];

        double x; 
         
         

        ifstream ins1, ins2;

        ofstream outs; 
         
         

        ins1.open("V.vfd");

        ins2.open("prprd.vfd");

        outs.open("U1.vfd"); 
         
         

        for(int i = 0; i < n; i++)

        {

          ins1 >> V[i];

        } 
         
         

        for(int i = 0; i < m; i++)

        {

          for(int j = 0; j < n; j++)

          { 

     

     
     
     
     
     
     
     
     
     
     
     


         
         
         
         
         
         
         
         
         


     
     
     

    ins2 >> x;

    outs << x - V[j] << '\t'; 
     
     
     

        ins1.close();

        ins2.close();

        outs.close(); 
         
         

        delete [] V;

      }

      Расчет значений U. 
       
       

      void skolz_spenser(const int& n, const int& l)

      {

        ifstream ins;

        ofstream outs;

        ins.open("U1.vfd");

        outs.open("U2.vfd"); 
         
         

        if(l < 21)

        {

          cout << endl << "ОШИБКА!!!"

            << endl << "Диапазон данных слишком  мал, для применения 

      скользящей Спенсера";

          exit(1);

        } 
         
         

        double *ryad = new double[21]; 

     

     
     
     
     

        int count = 0; 
         
         
         
         
         
         

        for(int i = 0; i < 21; i++, count++)

        {

          ins  >> ryad[i]; 
           
           

          if(i < 10)

          {

            outs << ryad[i] << '\t'; 
             
             

            if(count >= n)

            {

              outs << endl;

              count = 0;

            }

          }

        } 
         
         

        for(int i = 10; i <= (l - 4); i++, count++)

        {

          outs << (

              -1  *ryad[0]

              -3  *ryad[1]

              -5  *ryad[2]

              -5  *ryad[3]

              -2  *ryad[4]

              +6  *ryad[5]

              +18 *ryad[6]

              +33 *ryad[7] 

     

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     


         
         
         

        +47 *ryad[8]

        +57 *ryad[9]

        +60 *ryad[10]

        +57 *ryad[11]

        +47 *ryad[12]

        +33 *ryad[13]

        +18 *ryad[14]

        +6  *ryad[15]

        -2  *ryad[16]

        -5  *ryad[17]

        -5  *ryad[18]

        -3  *ryad[19]

        -1  *ryad[20]

      ) / 350; 
       
       

    if(count >= n)

    {

      outs << endl;

      count = 0;

    } 
     
     

    for(int j = 0; j < 20; j++)

    {

      ryad[j] = ryad[j + 1];

    }

    ins  >> ryad[20]; 
     
     
     
     

    outs << (

     

     
     

                

              -1  *ryad[0]

              -3  *ryad[1]

              -5  *ryad[2]

              -5  *ryad[3]

              -2  *ryad[4]

              +6  *ryad[5]

              +18 *ryad[6]

              +33 *ryad[7]

              +47 *ryad[8]

              +57 *ryad[9]

              +60 *ryad[10]

              +57 *ryad[11]

              +47 *ryad[12]

              +33 *ryad[13]

              +18 *ryad[14]

              +6  *ryad[15]

              -2  *ryad[16]

              -5  *ryad[17]

              -5  *ryad[18]

              -3  *ryad[19]

              -1  *ryad[20]

            ) / 350; 
             
             

        for(int i = 0; i < 10; i++, count++)

        {

          ins  >> ryad[i]; 
           
           

          outs << ryad[i] << '\t';

     

     
     
     
     

          if(count >= n)


           
           
           
           
           
           
           
           
           
           


         
         
         
         
         


    outs << endl;

    count = 0; 
     
     
     

        ins.close();

        outs.close(); 
         
         

        delete [] ryad;

      }

      Данная функция  является программной реализацией  скользящей средней 

      Спенсера.   В   связи   с   особенностью   данного   сглаживания,   ее   невозможно

      применить, если Т < 21,  что однако является непосредственным условием для

      нахождения  тренд-сезонной  волны   если  периоды  рассматриваются   по  годам,

      поскольку   количество   периодов  m  не   может   быть   меньше   2,   следовательно 

      T=12*2=24 > 21. 
       
       

      void make_v2(const int& n, const int& m)

      {

        ifstream ins1, ins2;

        ofstream outs; 
         
         

        ins1.open("prprd.vfd");

        ins2.open("U2.vfd");

        outs.open("result.vfd"); 
         
         

        double x, y; 

     

     
     
     
     

        for(int i = 0; i < m; i++)

        {

          for(int j = 0; j < n; j++)

          {

            ins1 >> x;

            ins2 >> y;

            outs << x - y << '\t';

          }

          outs << endl;

        } 
         
         

        ins1.close();

        ins2.close();

        outs.close(); 
         
         

      }

      Функция поиска V2. 
       
       

      void result(const int& n, const int& m)

      {

        double *V = new double[n];

        ifstream ins1, ins2;

        ofstream outs;

        double k; 
         
         

        ins1.open("k.vfd");

        ins2.open("V2.vfd");

        outs.open("result.vfd");

     

     
     
     
     
     
     
     

        outs.setf(ios::fixed); 
         
         

      

        outs.setf(ios::showpoint);

        outs.precision(8); 
         
         

        for(int i = 0; i < n; i++)

        {

          ins2 >> V[i];

        } 
         
         

        for(int i = 0; i < m; i++)

        {

          ins1 >> k;

          for(int j = 0; j < n; j++)

          {

            outs << k * V[j] << '\t';

          }

          outs << endl;

        } 
         
         

        ins1.close();

        ins2.close();

        outs.close(); 
         
         

        delete [] V;

      }

      Функция расчета  и вывода конечных результатов на основе полученных

      промежуточных данных. 

     

     
     
     
     

      void rezapyatanie()

      {

        ifstream ins;

        ofstream outs;

        char symbol; 
         
         

        ins.open("ot.vfd");

        outs.open("ot4et.txt"); 
         
         
         

        while(ins.get(symbol))

        {

          if(symbol == '.')

            outs << ',';

          else

            outs << symbol;

        } 
         
         

        ins.close();

        outs.close();

      }

      Функция заменяет все символы «.» (точка) на символы  «,» (запятая), чтобы

      полученные   данные   могли   применяться   в   электронных   таблицах   с 

      использованием  технологии Drag and Drop. 
       
       
       
       
       
       

      Заключение.

      Уровень развития и внедрения ЭВМ позволяет  доводить до автоматизации 

      вычисления   любой   сложности,   что   в   свою   очередь   позволяет   применять

      вышеописанные методы выделения тренд-сезонной волны.

      Это открывает  безграничные возможности при проведении анализа ряда

      данных   без   учета   влияния   сезонности,   а   также   позволяет   проанализировать

      характер   и   динамику   полученной   сезонной   волны   и   увидеть   ее   степень   ее  

          

    влияния на различные  показатели.

      Научно-технический  прогресс позволяет в  XXI  веке применять сложные 

      аналитические методики, разработанные более, чем  пол века назад и ранее не

      распространенные   в   связи   с   их   сложностью   и   большим   количеством 

      однотипных  вычислительных операций. 
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       

        Использованная  литература:

        1. Экономико-математические методы и прикладные модели: Учеб. Пособие

      для вузов / под ред. В.В. Федосеева. – М.: ЮНИТИ, 2002.-391 c. 

        2. 

    Статистическое  моделирование   и   прогнозирование   /   под   ред.   А.Г.  

      Гранберга. –  М.: Финансы и статистика, 1990.

        3.   Степанов   А.В.   некоторые   алгоритмы   выравнивания   временных   рядов  

      с     использованием   фактических   значений   уровней//   Информационные   модели

      экономики: сб. трудов II Всероссийской научно-практической конференции.-М.: 2004.-

      с. 53-58. 
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       

     

Информация о работе Методы выделения тренд сезонной компоненты