Методы выделения тренд сезонной компоненты
Содержание:
Введение…………………………………………………………
1.Проблема
сезонности тренда…………………………………
2.Метод Четверякова …………………………………………………………… 8
3.Метод Шискина-Эйзенпресса …………………………………………………10
4.Решение задачи по выделению тренд-сезонной компоненты с
использованием ЭВМ…………………………………………………………… 13
5. Заключение …………………………………………………………….………42
Использованная литература …………………………………….…..………….. 43
1. Проблема сезонности тренда
При анализе динамического ряда чисел, выбранные значения показателей
во времени отображают лишь фактические значения фактора, но не дают
точной картины событий. К тому же показатели динамического ряда не
учитывают такой фактор, как сезонность. В некоторых случаях, фактор
сезонности не оказывает влияния на результаты анализа, например, если мы
анализируем динамику изменения ежегодного валового производства зерна.
Однако, в случаях, когда нам необходимо проанализировать ряд данных по
месяцам или по дням, влияние сезонности процессов может значительно
исказить результаты анализа.
Под сезонными колебаниями понимают регулярные, периодические
наступления внутригодовых подъемов и спадов производства, грузооборота и
товарооборота и т. д., связанных со сменой времени года, а под сезонностью –
ограниченность годового периода работ под влиянием того же природного
фактора.
Сезонность, как правило, связывается исключительно со сменой
природно-климатических условий в рамках ограниченного промежутка времени
– годового периода. Наиболее ярко эта связь видна там, где исследуемые
процессы прямо связаны с естественными особенностями того или иного
времени года. Особенно ярко это проявляется в сельском хозяйстве, где объемы
производства продукции непосредственно зависят от влияния сезонности.
Например, объем удоя с одной головы будет варьироваться в течении года от
небольших ранней весной, до рекордных в середине лета и обратно до низких к
концу осени и зимой.
В связи с
возможным проявлением
ряда необходимо произвести выделение сезонной компоненты из ряда. Этот
процесс также связан со сглаживанием ряда и сопутствующим исключением
влияния также случайных компонентов и позволяет исключить из анализа
различные механические ошибки, которые могли иметь место на начальных
этапах сбора
и обработки первичной
пр.). Стоит также отметить, что выделение сезонной компоненты дает нам
возможность проанализировать ее характер и динамику, измерить амплитуду
колебания значений, проследить зависимость значений изменения волны и
значений анализируемого фактора в конкретный день или месяц.
Если процесс подвержен периодическим колебаниям, имеющим
определенный и постоянный период, равный годовому промежутку, то мы
имеем дело с так называемым тренд-сезонным временным рядом (сезонным
временным рядом).
В анализе сезонных явлений ставятся следующие задачи: численно
выразить проявления сезонных колебаний, выявить факторы, вызывающие
сезонные колебания, дать прогноз сезонных колебаний.
Тренд-сезонный
временной ряд можно выразить
в следующей форме:
Y
t=1,…,T
=
Ut+
Vt + å
t
,
,
где
Ut - тренд;
Vt - сезонная компонента;
åt-случайная компонента;
T -число уровней
наблюдения.
Ut - предполагается, что тренд представляет собой некоторую гладкую
функцию. Степень гладкости этой функции неизвестна. Данный тренд можно
описать любой простой моделью, например линейной, степенной или
полиномиальной.
Vt - представляет
собой корректировку тренда
в периоде t. Она имеет
период T0
, который в свою очередь делит нацело
число периодов m (T0 =4 для
ряда квартальных
данных, T0 =12 для ряда месячных данных.)
Таким образом,
если рассматривается временной ряд за 10 лет, то T0 =10*12=120 для месячных
данных и T0 =10*4=40 для ряда квартальных данных. При выделении
тренд- сезонной компоненты количество периодов m всегда больше единицы. Иначе невозможно выделить сезонную компоненту.
В связи
с этим форма записи
тренд-сезонного временного
имеет вид:
Y
ij
= U
ij
+ V
ij
+ å
ij
,
i =
m j =
1,..., ;
1,...,T0.
Связь между
индексами имеет следующую
i
=
t
+ 1
T0
j= t − (i − 1) × T
0
где [ ] -означает целую часть числа.
Задачи, которые возникают при исследовании сезонных временных рядов:
1.определение наличия во временном ряду тренда и определение степени
его гладкости;
2.выявление наличия во временном ряду сезонных колебаний;
3.фильтрация компонент ряда;
4.анализ динамики сезонной волны;
5.исследование факторов, определяющих сезонные колебания;
6.прогнозирование тренд-сезонных процессов.
Анализ динамики, или эволюции, сезонной волны может рассматриваться
как процесс решения трех задач:
1.анализ динамики амплитуды сезонной волны в каждом месяце
(квартале, неделе);
2.анализ
динамики точек экстремума
3.исследование изменений формы волны.
Проблема анализа сезонности заключается в исследовании собственно
сезонных колебаний и в изучении того внешнего циклического механизма,
который их вызывает. Для исследования сезонных колебаний вне связи с
причинами,
их порождающими, очевидно,
необходимо отфильтровать
из
временного ряда сезонную компоненту Vt , а затем уже анализировать ее
динамику. Основная проблема в процессе выделения тренд-сезонноой
компоненты из тренда, значения в узловых точках которого, часто определяется
с некоторым приближением или погрешностями, связана с выявлением и
устранением так называемых аномальных значений уровней ряда. Причинами
аномальных уровней показателей могут быть ошибки технического порядка,
возникающие во время сбора или обработки первичных данных или при
передаче информации, в следствие ошибочных измерений, округления
численных значений и т.п., а так же в результате воздействия факторов,
проявляющихся эпизодически. При этом возникает необходимость в
процедурах «сглаживания» и согласования значений, сохраняя качественную
«картину» описываемого
объекта.
Большинство методов фильтрации построено таким образом, что
предварительно выделяется тренд, а затем уже сезонная компонента. Тренд в
чистом виде
необходим и для анализа
время для выявления аномальных уровней используются методы, рассчитанные
для статистических совокупностей, например, известные методы Четверякова,
Фостера-Стьюарта
или метод Шискина-
В таблице 1 приведен ряд ежемесячного среднего валового удоя с одной
коровы. Для данного ряда T0 =12, m=4, так что Т=12*4=48.
Таблица 1 —
Средний валовой помесячный удой
одной коровы, литров
Годы 1
удой
2
3
4
5
6
7
8
9
10
11
12
1 84
93
132 211 278 290 287 240 245
2
3
4
86
89
90
96
99
102
135 190 250 280 299 250 230
143 210 290 300 298 271 254
138 203 287 293 294 270 263
350
300
250
200
150
100
50
0
Рисунок 1 - Средний валовой помесячный удой одной коровы, литров
2. Метод Четверякова.
1. Эмпирический
ряд {Yt } выравнивается скользящей
средней с периодом
скольжения
T0 ,
то есть берется
T0+1 уровней ряда,
из которых первый и
1 T0
последний берутся с половинным весом: á − T0=áT
0
=
. Выпадающие
2
2
2
2
членов ряда с обоих его концов либо восстанавливаются экстраполированием
выровненного ряда, либо остаются в стороне при последующей стадии работ.
Получаются предварительная оценка тренда:
Yt′ = U 1t
и отклонение эмпирического ряда от выровненного
1
lt=Yt − Yt′, t = 1,..., T
или
l = −
ij Y Y
ij ij
,
(
i
=
m j
1,..., ;
=
1,..., T0)
Для каждого года i вычисляется s i - среднеквадратическое отклонение, на которое и делятся затем отдельные отклонения (за месяц, за квартал).
~
l
l
ij
ij = ó
где
i
,
2
T
0
∑lij2−
1
T
0
∑ l
ói=
j
=
1
T
0
j
=
1
T
0
−
1
ij
.
3. Из «нормированных» таким образом отклонений вычисляется
предварительная средняя сезонная волна:
m
1
V j =
1
∑
~l
ij
.
m
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
j
=
i
=
1
m
.
l
=
∑
l
j
=
1
T
j
3.
0
Находится предварительная
оценка средней сезонной волны
ˆ1=−
V j l j l
и строится
новый ряд, относительно свободной
от сезонной компоненты
ˆ 1=
−
ˆ
1
.
Uij
Y V
ij
j
4.
К ряду U
ij
применяется
сглаживание скользящей
Y t
2
=
1
350
(
−
Y
t
−
10
−
− 5Y − − 5Y − − 2Y − +
3Y
t
−
9 t 8 t 7 t 6
6Y
t
−
5
+
18Y
t
−
4
+
+ 33Yt −
3
+
47Y
t
−
2
+
57Y
t
−
1
+
60Y
t
+
57Y
t
+
1
+
47Y
t
+
2
+
33Y
t
+
3
+
+ 18Yt +
4
+
6Y
t
+
5
−
2Y
t
+
6
−
5Y
t
+
7
−
5Y
t
+
8
−
3Y
t
+
9
−
Y
t
+
10
)
.
Реализовать такое сглаживание можно в несколько приемов, используя
последовательно
процедуры:
·
Сглаживание по пяти точкам: Y
t
′
=
Y
t
−
2
+
Y
t
−
1
+ +
Y
t
Y
t
+
5
1
+
Y
t
+
2
·
Сглаживание по
пяти точкам:
Y
t
=′
Y
t
′
−
2
+
Y
t
′
−
1
+
Y
t
′
+
Y
t
′
+
1
+
Y
t
′
+ 2
·
Y
Сглаживание по семи точкам:
=′
Y
t
′
−
3
+
Y
t
′
−
2
+
Y
t
′
−
1
+
Y
t
+′
Y
t
+
1
+
Y
t
′
+
2
+
Y
t + 3 ;
5
·
t
7
Сглаживание вида:
Y
IV
=
Y
t
−
2
+
Y
t
−
1
+
+′
2Y
t
Y
t
+
1
+
Y
t
+
2
.
t
5.
2
Находится улучшенная оценка сезонной компоненты:
m
(
−
2
)
∑
Y
ij
U
ij
ˆ 2
i
=
.
V j
=
1
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 Всероссийской научно-
с. 53-58.

- Методы выработки стратегии
- Методы выработки целей и стратегии развития фирмы
- Методы выравнивания рядов динамики
- Методы выхода из кризиса российских предприятий
- Методы вычисления и показатели уровня производительности труда
- Методы выявления и особенности таможенного контроля недостоверно декларируемых товаров
- Методы выявления и оценки конкурентных преимуществ организации
- Методы выбора поставщика
- Методы выбора проекта
- Методы выбора проекта
- Методы выбора проекта
- Методы выбора проектов
- Методы выбора проектов
- Методы выделения систематических составляющих ряда