- •4.1. Метод наименьших квадратов
- •4.2. Простая линейная регрессия
- •4.3. Простая нелинейная регрессия
- •4.4. Регрессия, нелинейная относительно параметров
- •4.5. Примеры решения задач
- •5. Временные ряды
- •5.1. Определения
- •5.2. Постановка задач сглаживания и прогноза
- •5.3. Решение задач сглаживания и прогноза методом наименьших квадратов
- •Пример выполнения задания 1
- •Программа
- •Результаты работы программы
- •Пример выполнения задания 2
- •Пример выполнения задания 1
- •Результаты работы программы
- •Пример выполнения задания 2
- •Результаты работы программы
- •Обработка экспериментальных данных на эвм Учебное пособие
- •Редакционно-издательский отдел гоувпо «Комсомольский-
- •681013, Комсомольск-на-Амуре, пр. Ленина, 27.
- •681013, Комсомольск-на-Амуре, пр. Ленина, 27.
Результаты работы программы
Узлы сетки Функция f Регрессионная функция g
-2.00 10.25 8.94
-1.75 9.55 8.88
-1.50 8.85 8.70
-1.25 8.17 8.39
-1.00 7.50 7.96
-0.75 6.84 7.43
-0.50 6.21 6.82
-0.25 5.59 6.14
0.00 5.00 5.43
0.25 4.44 4.73
0.50 3.91 4.05
0.75 3.43 3.44
1.00 3.00 2.91
1.25 2.63 2.48
1.50 2.33 2.17
1.75 2.11 1.99
2.00 2.00 1.93
2.25 2.01 1.98
2.50 2.16 2.12
2.75 2.48 2.35
3.00 3.00 2.62
Значение среднеквадратичной погрешности равно : 0.44
Пример выполнения задания 2
Задание.
Построить алгоритм для нахождения
прогноза с
по
уровень временного ряда
,
,
методом наименьших квадратов для
квадратичной модели. Разработать
программу, которая реализует этот
алгоритм и выводит на печать значения
прогноза
,
,
.
Заданы
,
,
и
:
1.11; 1.24; 1.39; 1.55; 1.73; 1.92; 2.13; 2.36; 2.59; 2.84; 3.10;
3.37; 3.65; 3.95; 4.25; 4.56; 4.88; 5.21; 5.56; 5.91; 6.27; n
= 21.
Решение. В
данном случае требуется решить задачу
прогноза. Решим эту задачу следующим
образом. Сначала, используя метод
наименьших квадратов, найдем решение
задачи сглаживания – тренд
.
А затем, используя формулу тренда, найдем
решение задачи прогноза:
,
.
В дальнейшем будем опираться на материал,
изложенный в п.п. 5.3.
Задано, что тренд
является параболической функцией,
следовательно,
.
Коэффициенты
,
и
находятся методом наименьших квадратов.
В примере выполнения задания 1
расчетно-графического задания 2 подробно
разбирался алгоритм построения нормальной
системы, поэтому сразу запишем
систему линейных уравнений для нахождения
неизвестных
,
и
:

Эта система линейных уравнений имеет единственное решение, которое находится методом Гаусса с частичным выбором ведущего элемента.
Зная
,
и
,
мы можем вычислить значение функции
для любого значения
.
Значения прогноза
,
,
находятся по формуле
,
где
принимает значения 1, 2, 3.
На печать выводятся
значения прогноза
,
,
.
При решении задачи сглаживания среднеквадратичная погрешность вычисляется по формуле
,
где
–
фактические значения уровней временного
ряда;
–
расчетные значения уровней временного
ряда,
;
– число уровней во временном ряду;
–
число параметров, входящих в формулу,
описывающую тренд.
В нашем случае
,
n = 21.
Замечание. Обратить внимание, что в этом задании число заданных уровней временного ряда n различно у разных вариантов, и учесть это при программировании.
Программа
#include <stdio.h>
#include <math.h>
#include <conio.h>
int n=21; // число заданных уровней временного ряда
// Заданные уровни временного ряда Yi[n+1]
const float Yi[22]={ 0.0, 1.11, 1.24, 1.39, 1.55, 1.73, 1.92, 2.13, 2.36,
2.59, 2.84, 3.10, 3.37, 3.65, 3.95, 4.25, 4.56,
4.88, 5.21, 5.56, 5.91, 6.27
}; // элемент массива Yi[0]=0 в дальнейшем
// не используется, т.к. нумерация уровней
// временного ряда начинается с 1
// Функция f1(x)
float f1x (float A,float B,float C,float t)
{ return (A+B*t+C*t*t); }
// Функция GaussMethod - решает СЛУ размерности 3
// Входные параметры: А - матрица, В - вектор, Х - вектор неизвестных
void GaussMethod(float A[3][3],float B[3],float X[3])
{
int i,j; // счетчики циклов
// Решение системы уравнений
// k-счетчик циклов
// numb-номер строки с ведущим элементом
// max-максимальный по модулю элемент непреобразованного столбца
// str,bstr- используются при перестановке строк
// L-коэффициент преобразования
int numb=0, k;
float max, str, bstr, L;
// Приведение матрицы к U-виду
for (j=0;j<2;j++)
{
max=fabs(A[j][j]);
numb=j;
// Определение максимального элемента в столбце
for (i=j;i<3;i++)
{
if (max<fabs(A[i][j]))
{ max=fabs(A[i][j]); numb=i; };
};
// Если максимум - не диагональный элемент, то...
if (numb!=j)
{
// ...замена строк
for (i=0;i<3;i++)
{
str=A[numb][i];
A[numb][i]=A[j][i];
A[j][i]=str;
};
bstr=B[numb];
B[numb]=B[j];
B[j]=bstr;
};
// Преобразование столбца
for (i=j+1;i<3;i++)
{
L=-(A[i][j]/A[j][j]);//вычисление коэффициента
A[i][j]=0.0;
// Обнуление элемента текущего столбца
for (k=j+1;k<3;k++) { A[i][k]=A[i][k]+A[j][k]*L; };
// и вычисление последующих в строке
B[i]=B[i]+B[j]*L;
};
};
// Решение системы линейных уравнений
for (j=2;j>=0;j--)
{
X[j]=B[j]/A[j][j];
if (j!=2)
{
for (i=2;i>j;i--) {X[j]=X[j]-A[j][i]*X[i]/A[j][j];};
};
};
}
// Главная функция
void main()
{
clrscr();
int Ti[25]; // массив Ti[n+4], Ti[i] - номер уровня временного ряда
float Pi[25], // массив Pi[n+4], Pi[i] - значение тренда
a[3][3], b[3], x[3]; // а - матрица, b - вектор,
// x - вектор незвестных
float A=0,B=0,C=0, // искомые коэффициенты функции g(x)
R=0; //среднеквадратичная погрешность
int p=3; //число параметров, входящих в формулу, описывающую тренд
// Обнуление элементов матриц
for (int i=0;i<=n+3;i++)
{ Ti[i]=0; Pi[i]=0; }
// Заполнение массива Ti[i] значениями номеров уровней временного ряда
for(i=1;i<=n;i++) Ti[i]=i;
// Обнуление элементов матрицы а и вектора b
for(i=0;i<3;i++)
{
b[i]=0;
for(int j=0;j<3;j++) { a[i][j]=0;}
}
// Заполнение матрицы а и вектора b
for(i=1;i<=n;i++)
{
a[0][1]=a[0][1]+Ti[i];
a[0][2]=a[0][2]+Ti[i]*Ti[i];
a[1][2]=a[1][2]+Ti[i]*Ti[i]*Ti[i];
a[2][2]=a[2][2]+Ti[i]*Ti[i]*Ti[i]*Ti[i];
b[0] =b[0] +Yi[i];
b[1] =b[1] +Ti[i]*Yi[i];
b[2] =b[2] +Yi[i]*Ti[i]*Ti[i];
}
a[0][0]=n;
a[1][0]=a[0][1];
a[1][1]=a[0][2];
a[2][0]=a[0][2];
a[2][1]=a[1][2];
// Нахождение неизвестных х[3] методом Гаусса с ЧВВЭ
GaussMethod(a,b,x);
A=x[0];B=x[1];C=x[2]; //искомые коэффициенты A,B,C
// Сглаживание
for(i=1;i<=n;i++)
{
Pi[i]=f1x(A,B,C,Ti[i]); //вычисление значений тренда для i от 1 до n
// Вычисление
R=R+pow(Yi[i]-Pi[i],2);
}
// Вычисление среднеквадратичной погрешности
R=sqrt(R/(n-p-1));
// Прогнозирование для i от n+1 до n+3
for(i=n+1;i<=n+3;i++)
{
Ti[i]=i;
Pi[i]=f1x(A,B,C,Ti[i]);
}
// Вывод значений
printf("\n Значение среднеквадратичной погрешности R=%.2g",R);
printf ("\n Номер уровня ряда Ti\t Прогноз\n");
for(i=n+1;i<=n+3;i++)
printf(" %d\t\t %.2f \n",Ti[i],Pi[i]);
getch();
}
