Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовые по ОАУ / Методы и модели технико-экономического планирования и прогнозирования. Модели с сезонной компонентой.doc
Скачиваний:
89
Добавлен:
15.06.2014
Размер:
1.37 Mб
Скачать

3.2 Решение задач с использованием программы

Ниже приведены данные о прибыли компании за последние 10 кварталов (скорректированные на инфляцию).

Таблица 3.1

Год

1991

1992

1993

Квартал

1

2

3

4

1

2

3

4

1

2

Прибыль

146

106

123

89

97

74

80

53

56

35

Требуется:

1. Рассчитать данные для построения модели временного ряда с мультипликативной компонентой.

2. Дать прогноз на 2 следующих квартала года 3.

Решим задачу с использованием программы.

1) В окне настроек выберем тип сезонов «Кварталы». Начальным периодом будет «1 квартал 1991 г.», конечным – «2 квартал 1993 г.». Выбираем их из выпадающих списков и нажимаем кнопку «Заполнить».

2) Вводим данные (прибыль) из условия задачи в соответствующие ячейки появившейся справа таблицы. С помощью переключателя выбираем тип модели «С мультипликативной компонентой» и нажимаем кнопку «Рассчитать». Окно настроек закроется, в главном окне появятся рассчитанные данные.

Таблица 3.2

Период

Прибыль

Итого за 4 квартала

Скользящая средняя за 4 квартала

Центрированная скользящая средняя

Коэффициент сезонности

Скорректированный коэффициент сезонности

1 квартал 1991 г.

146

1.074

2 квартал

106

0.919

464

116

3 квартал

123

109.875

1.119

1.125

415

103.75

4 квартал

89

99.75

0.892

0.882

383

95.75

1 квартал 1992 г.

97

90.375

1.073

1.074

340

85

2 квартал

74

80.5

0.919

0.919

304

76

3 квартал

80

70.875

1.129

1.125

263

65.75

4 квартал

53

60.875

0.871

0.882

224

56

1 квартал 1993 г.

56

1.074

2 квартал

35

0.919

Таблица 3.3

Период

Десезонализированная объем прибыли

Данные для уравнения линии тренда

Трендовое значение

Ошибка

T * S

A/(T*S)

A-(T*S)

1 квартал 1991 г.

135.940

Sum(x) = 55

130.88351

140.569

1.039

+5.431

2 квартал

115.343

Sum(x2) = 385

120.77142

110.989

0.955

-4.989

3 квартал

109.333

Sum(y) = 853.791

110.65933

124.492

0.988

-1.492

4 квартал

100.907

Sum(xy) = 3861.603

100.54724

88.683

1.004

+0.317

1 квартал 1992 г.

90.317

n = 10

90.43515

97.127

0.999

-0.127

2 квартал

80.522

b = -10.11209

80.32305

73.817

1.002

+0.183

3 квартал

71.111

a = 140.99560

70.21096

78.987

1.013

+1.013

4 квартал

60.091

60.09887

53.007

0.999

-0.007

1 квартал 1991 г.

52.142

49.98678

53.686

1.043

+2.314

2 квартал

38.085

39.87469

36.645

0.955

-1.645

3) Для расчета прогноза на 3-й квартал 1993 г. введем с помощью двух выпадающих списков в области для нахождения прогноза «3 квартал 1993 г.». После нажатия кнопки «Найти» на экран выведется значение предполагаемой прибыли: 33.483. Аналогично получаем прогноз на 4-й квартал 1993 г.: 17,332.

Таким образом, при помощи использования программы была рассчитана модель временного ряда с мультипликативной компонентой (см. табл. 3.2 и табл. 3.3), а также получен прогноз на следующие два квартала 1993 года: 33.483 и 17.332 соответственно.

Заключение

До настоящего времени разработано огромное количество всевозможных методов прогнозирования и планирования, что позволяет менеджерам компаний давать более точные прогнозы, если использовать их в совокупности. Это ведет к росту доходов предприятий и снижению их убытков. Преобладающее большинство методов зашито в различные программные комплексы, позволяя ещё больше упростить процесс нахождения прогнозов. Можно даже сказать, что вся работа менеджера состоит в том, чтобы выбрать наиболее подходящий программный продукт, который был бы максимально соответствующим деятельности фирмы, и в который было бы интегрировано большое количество наиболее популярных и точных методов прогнозирования.

Литературные источники

  1. Эддоус М, Стэнсфилд Р. Методы принятия решений. М.: Юнити, 1997.-590 с.

  2. К.Сурков, Д.Сурков, А.Вальвачев. Программирование в среде Delphi 2.0. Мн.: ООО «Попурри», 1997. – 640 с.

  3. http://www.i-u.ru

  4. http://masters.donntu.edu.ua

  5. http://www.benchmarking.ru/FORECAST/forecast.htm

  6. http://www.parus.ru

  7. http://www.iteam.ru

  8. http://www.mark-info.ru

  9. http://www.kgtdv.ru

Приложение

Код программы Season Forecaster

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, Grids, StdCtrls;

type

TMainForm = class(TForm)

MainMenu: TMainMenu;

MainItem: TMenuItem;

OptionsItem: TMenuItem;

ExitItem: TMenuItem;

HelpItem: TMenuItem;

AboutItem: TMenuItem;

SeasonGrid: TStringGrid;

Label1: TLabel;

QFindBox: TComboBox;

YFindBox: TComboBox;

Find: TButton;

Prognose: TEdit;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Flag: TLabel;

Label5: TLabel;

procedure ExitItemClick(Sender: TObject);

procedure OptionsItemClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure SeasonGridDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

procedure FindClick(Sender: TObject);

procedure AboutItemClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

MainForm: TMainForm;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TMainForm.ExitItemClick(Sender: TObject);

begin

Close;

end;

procedure TMainForm.OptionsItemClick(Sender: TObject);

begin

Options.Show;

end;

procedure TMainForm.FormCreate(Sender: TObject);

var i: integer;

begin

Height := 440;

Label2.Visible := False;

Prognose.Visible := False;

Label3.Visible := False;

Label4.Visible := False;

Label5.Visible := False;

Flag.Visible := False;

SeasonGrid.Visible := False;

end;

procedure TMainForm.SeasonGridDrawCell(Sender: TObject; ACol,

ARow: Integer; Rect: TRect; State: TGridDrawState);

var s:string;

Flag: Cardinal;

h:integer;

begin

SeasonGrid.Canvas.FillRect(Rect);

s := SeasonGrid.Cells[ACol,ARow];

Flag := DT_CENTER;

Flag := Flag or DT_WORDBREAK;

Inc(Rect.Left,2); // отступ слева

Dec(Rect.Right,2); // отступ справа

H := DrawText(SeasonGrid.Canvas.Handle,PChar(s),length(s),Rect,Flag);

if H > SeasonGrid.RowHeights[ARow] then

SeasonGrid.RowHeights[ARow] := H; //увеличиваем

end;

procedure TMainForm.FindClick(Sender: TObject);

var YStart, QStart, quarter, year, i, n: integer;

SComp: extended;

begin

If (QFindBox.Text = '') or (YFindBox.Text = '') Then Begin

ShowMessage(' Не введены данные.');

exit;

End;

Qstart := StrToInt(Copy(SeasonGrid.Cells[0,1],0,1));

YStart := StrToInt(Copy(SeasonGrid.Cells[0,1],10,5));

If QFindBox.Text = '1 квартал' Then Begin

quarter := 1;

SComp := StrToFloat(Options.Label8.Caption);

End;

If QFindBox.Text = '2 квартал' Then Begin

quarter := 2;

SComp := StrToFloat(Options.Label9.Caption);

End;

If QFindBox.Text = '3 квартал' Then Begin

quarter := 3;

SComp := StrToFloat(Options.Label10.Caption);

End;

If QFindBox.Text = '4 квартал' Then Begin

quarter := 4;

SComp := StrToFloat(Options.Label11.Caption);

End;

year := StrToInt(YFindBox.Text);

If year < YStart Then Begin

ShowMessage(' Период, на который производится прогноз, должен превышать первый период в таблице.');

exit;

End;

If year = YStart Then Begin

If Qstart > quarter then Begin

ShowMessage(' Период, на который производится прогноз, должен превышать первый период в таблице.');

exit;

End;

End;

Case QStart Of

1: n := 4 + quarter + (year - YStart - 1)*4;

2: n := 3 + quarter + (year - YStart - 1)*4;

3: n := 2 + quarter + (year - YStart - 1)*4;

4: n := 1 + quarter + (year - YStart - 1)*4;

End;

Label5.Caption := FloatToStr(SComp);

Label2.Caption := 'Прогноз на ' + QFindBox.Text + ' ' + YFindBox.Text + ' г.';

Case StrToInt(Flag.Caption) Of

1:Prognose.Text := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(Label3.Caption)*n + SComp);

2:Prognose.Text := FloatToStr((StrToFloat(Label4.Caption) + StrToFloat(Label3.Caption)*n) * SComp);

End;

Prognose.Visible := True;

Label2.Visible := True;

end;

procedure TMainForm.AboutItemClick(Sender: TObject);

begin

About.ShowModal;

end;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, Grids;

type

TOptions = class(TForm)

SeasonRadioBox: TGroupBox;

DayRadio: TRadioButton;

DecadeRadio: TRadioButton;

QuarterRadio: TRadioButton;

QuarterBox1: TComboBox;

Label1: TLabel;

YearBox1: TComboBox;

Label2: TLabel;

QuarterBox2: TComboBox;

YearBox2: TComboBox;

Fill: TButton;

Label3: TLabel;

Label4: TLabel;

DataGrid: TStringGrid;

Compute: TButton;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

ModelRadioBox: TGroupBox;

AddRadio: TRadioButton;

MultiRadio: TRadioButton;

Notice1: TLabel;

Notice2: TLabel;

procedure SeasonRadioBoxClick(Sender: TObject);

procedure FillClick(Sender: TObject);

procedure DataGridDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

procedure FormCreate(Sender: TObject);

procedure ComputeClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Options: TOptions;

implementation

uses Unit1;

{$R *.dfm}

procedure TOptions.SeasonRadioBoxClick(Sender: TObject);

begin

Label1.Visible := Sender = QuarterRadio;

Label2.Visible := Sender = QuarterRadio;

QuarterBox1.Visible := Sender = QuarterRadio;

QuarterBox2.visible := Sender = QuarterRadio;

YearBox1.Visible := Sender = QuarterRadio;

YearBox2.Visible := Sender = QuarterRadio;

Fill.Visible := Sender = QuarterRadio;

Notice1.Visible := Sender = DecadeRadio;

Notice2.Visible := Sender = DayRadio;

end;

procedure TOptions.FillClick(Sender: TObject);

var QCount,i, j, i1, i2, a, b, c, year1, year2: integer;

Row_Count: integer;

season, year: string;

Label _End;

begin

//-----------Начальный период------------

For i1 := 0 to QuarterBox1.Items.Count Do Begin

Case QuarterBox1.ItemIndex of

0:Begin

a := 4;

c := 1;

End;

1:Begin

a := 3;

c := 2;

End;

2:Begin

a := 2;

c := 3;

End;

3:Begin

a := 1;

c := 4;

End;

Else

a := 0;

End;

End;

If a = 0 Then Begin

MainForm.SeasonGrid.Visible := False;

ShowMessage(' Неправильно введен период.');

exit;

End;

//------------Конечный период-----------------

For i1 := 0 to QuarterBox2.Items.Count Do Begin

Case QuarterBox2.ItemIndex of

0:b := 1;

1:b := 2;

2:b := 3;

3:b := 4;

Else

b := 0;

End;

End;

If b = 0 Then Begin

MainForm.SeasonGrid.Visible := False;

ShowMessage(' Неправильно введен период.');

exit;

End;

//----------Проверка правильности ввода периодов-----------

year1 := 0;

year2 := 0;

If (YearBox1.Text = '') or (YearBox2.Text = '') then Begin

MainForm.SeasonGrid.Visible := False;

ShowMessage(' Неправильно введен период.');

exit;

End

Else Begin

year1 := StrToInt(YearBox1.Text);

year2 := StrToInt(YearBox2.Text);

End;

If year2 < year1 Then Begin

MainForm.SeasonGrid.Visible := False;

ShowMessage(' Неправильно введен период.');

exit;

End;

If year1 = year2 Then Begin

If c > b Then Begin

MainForm.SeasonGrid.Visible := False;

ShowMessage(' Неправильно введен период.');

exit;

End;

End;

QCount := a + b + (year2 - year1)*4 - 4;

Row_Count := QCount;

MainForm.SeasonGrid.RowCount := Row_Count + 1;

DataGrid.RowCount := Row_Count + 1;

//-----------Заполнение------------

i2 := 1;

season := QuarterBox1.Text;

year := YearBox1.Text;

While i2 <= MainForm.SeasonGrid.RowCount Do Begin

If season = '1 квартал' Then Begin

MainForm.SeasonGrid.Cells[0,i2] := season + ' ' + year + ' г.';

DataGrid.Cells[0,i2] := season + ' ' + year + ' г.';

season := '2 квартал'

End

Else If season = '2 квартал' Then Begin

MainForm.SeasonGrid.Cells[0,i2] := season + ' ';

DataGrid.Cells[0,i2] := season + ' ';

season := '3 квартал';

End

Else If season = '3 квартал' Then Begin

MainForm.SeasonGrid.Cells[0,i2] := season + ' ';

DataGrid.Cells[0,i2] := season + ' ';

season := '4 квартал';

End

Else If season = '4 квартал' Then Begin

MainForm.SeasonGrid.Cells[0,i2] := season + ' ';

DataGrid.Cells[0,i2] := season + ' ';

season := '1 квартал';

year := IntToStr(StrToInt(year) + 1)

End

Else Begin

MainForm.SeasonGrid.Visible := False;

ShowMessage(' Неизвестная ошибка.');

End;

i2 := i2 + 1;

End;

MainForm.SeasonGrid.Cells[0,1] := QuarterBox1.Text + ' ' + YearBox1.Text + ' г.';

DataGrid.Cells[0,1] := QuarterBox1.Text + ' ' + YearBox1.Text + ' г.';

If MainForm.SeasonGrid.RowCount < 9 then Begin

ShowMessage(' Недостаточно данных для расчета. Попробуйте расширить диапазон.');

exit;

End;

Options.Width := 430;

DataGrid.Visible := True;

Compute.Visible := True;

DayRadio.Enabled := False;

DecadeRadio.Enabled := False;

QuarterRadio.Enabled := False;

ModelRadioBox.Visible := True;

QuarterBox1.Enabled := False;

QuarterBox2.Enabled := False;

YearBox1.Enabled := False;

YearBox2.Enabled := False;

Fill.Enabled := False;

_End:end; //Конец процедуры

procedure TOptions.DataGridDrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

var s:string;

Flag: Cardinal;

h, i:integer;

begin

DataGrid.Canvas.FillRect(Rect);

s := DataGrid.Cells[ACol,ARow];

Flag := DT_CENTER;

Flag := Flag or DT_WORDBREAK;

Inc(Rect.Left,2); // отступ слева

Dec(Rect.Right,2); // отступ справа

H := DrawText(DataGrid.Canvas.Handle,PChar(s),length(s),Rect,Flag);

if H > DataGrid.RowHeights[ARow] then

DataGrid.RowHeights[ARow] := H; //увеличиваем

end;

procedure TOptions.FormCreate(Sender: TObject);

begin

DataGrid.Visible := False;

DataGrid.Width := 181;

DataGrid.Cells[0,0] := 'Период';

DataGrid.Cells[1,0] := 'Данные на период';

DataGrid.ColWidths[0] := 95;

DataGrid.ColWidths[1] := 80;

Width := 240;

Compute.Visible := False;

ModelRadioBox.Visible := False;

Label3.Visible := False;

Label4.Visible := False;

Label5.Visible := False;

Label6.Visible := False;

Label7.Visible := False;

Label8.Visible := False;

Label9.Visible := False;

Label10.Visible := False;

Label11.Visible := False;

Notice1.Visible := False;

Notice2.Visible := False;

Notice1.Caption := 'Недоступно в данной версии программы.';

Notice2.Caption := 'Недоступно в данной версии программы.';

end;

procedure TOptions.ComputeClick(Sender: TObject);

var i, j, count, n: integer;

plus, a, b, x, x2, y, T, xy: extended;

Label _End, _AddStart, _MultiStart;

begin

For i := 1 to (DataGrid.RowCount - 1) Do Begin

Try

MainForm.SeasonGrid.Cells[1,i] := FloatToStr(StrToFloat(DataGrid.Cells[1,i]));

Except

ShowMessage(' Неправильно введены данные.');

exit;

End;

End;

//--------Итого за 4 квартала--------

For i := 1 to (MainForm.SeasonGrid.RowCount - 4) Do Begin

MainForm.SeasonGrid.Cells[2,i] := FloatToStr(StrToFloat(MainForm.SeasonGrid.Cells[1,i]) +

StrToFloat(MainForm.SeasonGrid.Cells[1,i+1]) + StrToFloat(MainForm.SeasonGrid.Cells[1,i+2]) +

StrToFloat(MainForm.SeasonGrid.Cells[1,i+3]));

End;

//--------Скользящая средняя за 4 квартала--------

For i := 1 to (MainForm.SeasonGrid.RowCount - 4) Do Begin

MainForm.SeasonGrid.Cells[3,i] := FloatToStr(StrToFloat(MainForm.SeasonGrid.Cells[2,i]) / 4);

End;

//-----Центрированная скользящая средняя----------

For i := 1 to (MainForm.SeasonGrid.RowCount - 5) Do Begin

MainForm.SeasonGrid.Cells[4,i+2] := FloatToStr((StrToFloat(MainForm.SeasonGrid.Cells[3,i])

+ StrToFloat(MainForm.SeasonGrid.Cells[3,i+1])) / 2);

End;

If AddRadio.Checked = True then

GoTo _AddStart

Else

Goto _MultiStart;

_AddStart:

MainForm.SeasonGrid.ColWidths[0] := 95;

MainForm.SeasonGrid.ColWidths[1] := 60;

MainForm.SeasonGrid.ColWidths[2] := 80;

MainForm.SeasonGrid.ColWidths[3] := 80;

MainForm.SeasonGrid.ColWidths[4] := 90;

MainForm.SeasonGrid.ColWidths[5] := 80;

MainForm.SeasonGrid.ColWidths[6] := 70;

MainForm.SeasonGrid.ColWidths[7] := 130;

MainForm.SeasonGrid.ColWidths[8] := 110;

MainForm.SeasonGrid.ColWidths[9] := 70;

MainForm.SeasonGrid.ColWidths[10] := 55;

MainForm.SeasonGrid.RowHeights[0] := 30;

MainForm.SeasonGrid.Cells[0,0] := 'Период';

MainForm.SeasonGrid.Cells[1,0] := 'Объем продаж';

MainForm.SeasonGrid.Cells[2,0] := 'Итого за 4 квартала';

MainForm.SeasonGrid.Cells[3,0] := 'Скользящая средняя за 4 квартала';

MainForm.SeasonGrid.Cells[4,0] := 'Центрированная скользящая средняя';

MainForm.SeasonGrid.Cells[5,0] := 'Оценка сезонной компоненты';

MainForm.SeasonGrid.Cells[6,0] := 'Сезонная компонента';

MainForm.SeasonGrid.Cells[7,0] := 'Десезонализированный объем продаж';

MainForm.SeasonGrid.Cells[8,0] := 'Данные для уравнения линии тренда';

MainForm.SeasonGrid.Cells[9,0] := 'Трендовое значение';

MainForm.SeasonGrid.Cells[10,0] := 'Ошибка';

MainForm.Flag.Caption := '1';

//----------Оценка сезонной компоненты---------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 5) Do Begin

MainForm.SeasonGrid.Cells[5,i+2] := FloatToStr(StrToFloat(MainForm.SeasonGrid.Cells[1,i+2])

- StrToFloat(MainForm.SeasonGrid.Cells[4,i+2]));

If StrToFloat(MainForm.SeasonGrid.Cells[5,i+2]) > 0 Then

MainForm.SeasonGrid.Cells[5,i+2] := '+' + MainForm.SeasonGrid.Cells[5,i+2];

End;

//----------Средние значения сезонной компоненты--------

Case StrToInt(Copy(MainForm.SeasonGrid.Cells[0,3],0,1)) Of

//--------Если первым периодом является первый квартал:------------

3:Begin

count := 0;

j := 3;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

End;

//--------Если первым периодом является второй квартал:------------

4:Begin

count := 0;

j := 3;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

End;

//--------Если первым периодом является третий квартал:------------

1:Begin

count := 0;

j := 3;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

End;

//--------Если первым периодом является четвертый квартал:------------

2:Begin

count := 0;

j := 3;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

End;

End;//---------Конец CASE-----------

//--------Сумма оценок средних значений сезонной компоненты-------------

Label7.Caption := FloatToStr(StrToFloat(Label3.Caption) +

StrToFloat(Label4.Caption) + StrToFloat(Label5.Caption) +

StrToFloat(Label6.Caption));

//--------Корректировка средних значений сезонной компоненты----------

plus := StrToFloat(Label7.Caption) / 4;

If StrToFloat(Label7.Caption) > 0 Then Begin

Label8.Caption := FloatToStrF(StrToFloat(Label5.Caption) - plus,fffixed,8,3);

Label9.Caption := FloatToStrF(StrToFloat(Label6.Caption) - plus,fffixed,8,3);

Label10.Caption := FloatToStrF(StrToFloat(Label3.Caption) - plus,fffixed,8,3);

Label11.Caption := FloatToStrF(StrToFloat(Label4.Caption) - plus,fffixed,8,3);

End

Else Begin

Label8.Caption := FloatToStrF(StrToFloat(Label5.Caption) + plus,fffixed,8,3);

Label9.Caption := FloatToStrF(StrToFloat(Label6.Caption) + plus,fffixed,8,3);

Label10.Caption := FloatToStrF(StrToFloat(Label3.Caption) + plus,fffixed,8,3);

Label11.Caption := FloatToStrF(StrToFloat(Label4.Caption) + plus,fffixed,8,3);

End;

//------Вывод сезонной компоненты в SeasonGrid-----------

i := 1;

While i <= MainForm.SeasonGrid.RowCount Do Begin

MainForm.SeasonGrid.Cells[6,i] := Label8.Caption;

MainForm.SeasonGrid.Cells[6,i+1] := Label9.Caption;

MainForm.SeasonGrid.Cells[6,i+2] := Label10.Caption;

MainForm.SeasonGrid.Cells[6,i+3] := Label11.Caption;

i := i + 4;

End;

For i := 1 to MainForm.SeasonGrid.RowCount Do Begin

If StrToFloat(MainForm.SeasonGrid.Cells[6,i]) > 0 Then

MainForm.SeasonGrid.Cells[6,i] := '(+' + MainForm.SeasonGrid.Cells[6,i] + ')'

Else

MainForm.SeasonGrid.Cells[6,i] := '(' + MainForm.SeasonGrid.Cells[6,i] + ')';

End;

//----------Десезонализированный объем продаж-------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

MainForm.SeasonGrid.Cells[7,i] := FloatToStr(StrToFloat(MainForm.SeasonGrid.Cells[1,i]) -

StrToFloat(Copy(MainForm.SeasonGrid.Cells[6,i],2,Length(MainForm.SeasonGrid.Cells[6,i])-2)));

End;

//-----------Расчет данных для уравнения линии тренда--------

x := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

x := x + i;

End;

MainForm.SeasonGrid.Cells[8,1] := 'Sum(x) = ' + FloatToStr(x);

x2 := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

x2 := x2 + i*i;

End;

MainForm.SeasonGrid.Cells[8,2] := 'Sum(x^2) = ' + FloatToStr(x2);

y := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

y := y + StrToFloat(MainForm.SeasonGrid.Cells[7,i]);

End;

MainForm.SeasonGrid.Cells[8,3] := 'Sum(y) = ' + FloatToStr(y);

xy := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

xy := xy + StrToFloat(MainForm.SeasonGrid.Cells[7,i])*i;

End;

MainForm.SeasonGrid.Cells[8,4] := 'Sum(xy) = ' + FloatToStr(xy);

MainForm.SeasonGrid.Cells[8,5] := 'n = ' + FloatToStr(MainForm.SeasonGrid.RowCount - 1);

n := MainForm.SeasonGrid.RowCount - 1;

b := (n*xy - x*y)/(n*x2 - x*x);

a := y/n - (b*x)/n;

MainForm.SeasonGrid.Cells[8,6] := 'b = ' + FloatToStrF(b,fffixed,8,5);

MainForm.SeasonGrid.Cells[8,7] := 'a = ' + FloatToStrF(a,fffixed,8,5);

MainForm.Label3.Caption := FloatToStrF(b,fffixed,8,5);

MainForm.Label4.Caption := FloatToStrF(a,fffixed,8,5);

//--------Трендовое значение------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

MainForm.SeasonGrid.Cells[9,i] := FloatToStrF(a + b*i,fffixed,8,5);

End;

//--------------Ошибка-------------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

MainForm.SeasonGrid.Cells[10,i] := FloatToStrF(StrToFloat(MainForm.SeasonGrid.Cells[7,i]) -

StrToFloat(MainForm.SeasonGrid.Cells[9,i]),fffixed,8,5);

End;

MainForm.Height := 525;

MainForm.SeasonGrid.Visible := True;

AddRadio.Enabled := False;

MultiRadio.Enabled := False;

Compute.Enabled := False;

GoTo _End;

_MultiStart:

MainForm.SeasonGrid.ColCount := 13;

MainForm.SeasonGrid.ColWidths[0] := 95;

MainForm.SeasonGrid.ColWidths[1] := 60;

MainForm.SeasonGrid.ColWidths[2] := 80;

MainForm.SeasonGrid.ColWidths[3] := 80;

MainForm.SeasonGrid.ColWidths[4] := 90;

MainForm.SeasonGrid.ColWidths[5] := 80;

MainForm.SeasonGrid.ColWidths[6] := 110;

MainForm.SeasonGrid.ColWidths[7] := 130;

MainForm.SeasonGrid.ColWidths[8] := 110;

MainForm.SeasonGrid.ColWidths[9] := 70;

MainForm.SeasonGrid.ColWidths[10] := 55;

MainForm.SeasonGrid.ColWidths[10] := 70;

MainForm.SeasonGrid.ColWidths[11] := 70;

MainForm.SeasonGrid.ColWidths[12] := 70;

MainForm.SeasonGrid.RowHeights[0] := 30;

MainForm.SeasonGrid.Cells[0,0] := 'Период';

MainForm.SeasonGrid.Cells[1,0] := 'Объем продаж';

MainForm.SeasonGrid.Cells[2,0] := 'Итого за 4 квартала';

MainForm.SeasonGrid.Cells[3,0] := 'Скользящая средняя за 4 квартала';

MainForm.SeasonGrid.Cells[4,0] := 'Центрированная скользящая средняя';

MainForm.SeasonGrid.Cells[5,0] := 'Коэффициент сезонности';

MainForm.SeasonGrid.Cells[6,0] := 'Скорректированный коэффициент сезонности';

MainForm.SeasonGrid.Cells[7,0] := 'Десезонализированный объем продаж';

MainForm.SeasonGrid.Cells[8,0] := 'Данные для уравнения линии тренда';

MainForm.SeasonGrid.Cells[9,0] := 'Трендовое значение';

MainForm.SeasonGrid.Cells[10,0] := ' (Ошибка) T * S';

MainForm.SeasonGrid.Cells[11,0] := ' (Ошибка) A / (T * S)';

MainForm.SeasonGrid.Cells[12,0] := ' (Ошибка) A - (T * S)';

MainForm.Flag.Caption := '2';

//--------Коэффициент сезонности----------

For i := 1 to (MainForm.SeasonGrid.RowCount - 5) Do Begin

MainForm.SeasonGrid.Cells[5,i+2] := FloatToStrF(StrToFloat(MainForm.SeasonGrid.Cells[1,i+2])

/ StrToFloat(MainForm.SeasonGrid.Cells[4,i+2]),fffixed,8,3);

End;

//--------Средние значения коэффициента сезонности--------

Case StrToInt(Copy(MainForm.SeasonGrid.Cells[0,3],0,1)) Of

//--------Если первым периодом является первый квартал:------------

3:Begin

count := 0;

j := 3;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

End;

//--------Если первым периодом является второй квартал:------------

4:Begin

count := 0;

j := 3;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

End;

//--------Если первым периодом является третий квартал:------------

1:Begin

count := 0;

j := 3;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

End;

//--------Если первым периодом является четвертый квартал:------------

2:Begin

count := 0;

j := 3;

Label6.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label6.Caption := FloatToStr(StrToFloat(Label6.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label6.Caption := FloatToStrF((StrToFloat(Label6.Caption) / count),fffixed,8,3);

count := 0;

j := 4;

Label3.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label3.Caption := FloatToStr(StrToFloat(Label3.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label3.Caption := FloatToStrF((StrToFloat(Label3.Caption) / count),fffixed,8,3);

count := 0;

j := 5;

Label4.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label4.Caption := FloatToStr(StrToFloat(Label4.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label4.Caption := FloatToStrF((StrToFloat(Label4.Caption) / count),fffixed,8,3);

count := 0;

j := 6;

Label5.Caption := '0';

While (MainForm.SeasonGrid.Cells[5,j] <> '') Do Begin

Label5.Caption := FloatToStr(StrToFloat(Label5.Caption) + StrToFloat(MainForm.SeasonGrid.Cells[5,j]));

j := j + 4;

count := count + 1;

End;

Label5.Caption := FloatToStrF((StrToFloat(Label5.Caption) / count),fffixed,8,3);

End;

End;//---------Конец CASE-----------

//--------Сумма оценок средних значений коэффициента сезонности-------------

Label7.Caption := FloatToStr(StrToFloat(Label3.Caption) +

StrToFloat(Label4.Caption) + StrToFloat(Label5.Caption) +

StrToFloat(Label6.Caption));

//--------Корректировка средних значений коэффициента сезонности----------

plus := 4 / StrToFloat(Label7.Caption);

Label8.Caption := FloatToStrF(StrToFloat(Label5.Caption) * plus,fffixed,8,3);

Label9.Caption := FloatToStrF(StrToFloat(Label6.Caption) * plus,fffixed,8,3);

Label10.Caption := FloatToStrF(StrToFloat(Label3.Caption) * plus,fffixed,8,3);

Label11.Caption := FloatToStrF(StrToFloat(Label4.Caption) * plus,fffixed,8,3);

//------Вывод скорректированного коэффициента сезонности в SeasonGrid-----------

i := 1;

While i <= MainForm.SeasonGrid.RowCount Do Begin

MainForm.SeasonGrid.Cells[6,i] := Label8.Caption;

MainForm.SeasonGrid.Cells[6,i+1] := Label9.Caption;

MainForm.SeasonGrid.Cells[6,i+2] := Label10.Caption;

MainForm.SeasonGrid.Cells[6,i+3] := Label11.Caption;

i := i + 4;

End;

//----------Десезонализированный объем продаж-------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

MainForm.SeasonGrid.Cells[7,i] := FloatToStrF(StrToFloat(MainForm.SeasonGrid.Cells[1,i]) /

StrToFloat(MainForm.SeasonGrid.Cells[6,i]),fffixed,8,3);

End;

//-----------Расчет данных для уравнения линии тренда--------

x := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

x := x + i;

End;

MainForm.SeasonGrid.Cells[8,1] := 'Sum(x) = ' + FloatToStr(x);

x2 := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

x2 := x2 + i*i;

End;

MainForm.SeasonGrid.Cells[8,2] := 'Sum(x^2) = ' + FloatToStr(x2);

y := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

y := y + StrToFloat(MainForm.SeasonGrid.Cells[7,i]);

End;

MainForm.SeasonGrid.Cells[8,3] := 'Sum(y) = ' + FloatToStr(y);

xy := 0;

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

xy := xy + StrToFloat(MainForm.SeasonGrid.Cells[7,i])*i;

End;

MainForm.SeasonGrid.Cells[8,4] := 'Sum(xy) = ' + FloatToStr(xy);

MainForm.SeasonGrid.Cells[8,5] := 'n = ' + FloatToStr(MainForm.SeasonGrid.RowCount - 1);

n := MainForm.SeasonGrid.RowCount - 1;

b := (n*xy - x*y)/(n*x2 - x*x);

a := y/n - (b*x)/n;

MainForm.SeasonGrid.Cells[8,6] := 'b = ' + FloatToStrF(b,fffixed,8,5);

MainForm.SeasonGrid.Cells[8,7] := 'a = ' + FloatToStrF(a,fffixed,8,5);

MainForm.Label3.Caption := FloatToStrF(b,fffixed,8,5);

MainForm.Label4.Caption := FloatToStrF(a,fffixed,8,5);

//--------Трендовое значение------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

MainForm.SeasonGrid.Cells[9,i] := FloatToStrF(a + b*i,fffixed,8,5);

End;

//--------------Ошибка-------------------

For i := 1 to (MainForm.SeasonGrid.RowCount - 1) Do Begin

MainForm.SeasonGrid.Cells[10,i] := FloatToStrF(StrToFloat(MainForm.SeasonGrid.Cells[9,i]) * StrToFloat(MainForm.SeasonGrid.Cells[6,i]),fffixed,8,5);

MainForm.SeasonGrid.Cells[11,i] := FloatToStrF(StrToFloat(MainForm.SeasonGrid.Cells[1,i]) / StrToFloat(MainForm.SeasonGrid.Cells[10,i]),fffixed,8,5);

MainForm.SeasonGrid.Cells[12,i] := FloatToStrF(StrToFloat(MainForm.SeasonGrid.Cells[1,i]) - StrToFloat(MainForm.SeasonGrid.Cells[10,i]),fffixed,8,5);

If StrToFloat(MainForm.SeasonGrid.Cells[12,i]) > 0 Then

MainForm.SeasonGrid.Cells[12,i] := '+' + MainForm.SeasonGrid.Cells[12,i];

End;

MainForm.Height := 525;

MainForm.SeasonGrid.Visible := True;

AddRadio.Enabled := False;

MultiRadio.Enabled := False;

Compute.Enabled := False;

GoTo _End;

_End:

Options.Hide;

end;

end.

57

Соседние файлы в папке Курсовые по ОАУ