Лабораторная работа №3
.pdf
Вычисленные с помощью программы значения совпадают со
значениями, полученными в пункте 1.1.
3 Построение аппроксимирующей квадратной функции с помощью метода наименьших квадратов
Для построения аппроксимирующей квадратной функции было реализовано программное решение, представленное в приложении Б.
В основе программы лежит система для нахождения коэффициентов функции (1.2) и формула квадратичной функции (1.3):
(1.2)
(1.3)
Для решения системы уравнений используется метод Зейделя.
На рисунке 1.9 представлен результат работы программы для первой последовательности точек.
11
Рисунок 1.9 – Результат
На рисунке 1.10 представлен результат работы программы для второй последовательности точек.
Рисунок 1.10 – Результат
На рисунке 1.11 представлен результат работы программы для третьей последовательности точек.
12
Рисунок 1.11 – Результат
Для первой последовательности точек формула квадратичной функции
(1.4) имеет вид:
Для второй последовательности точек формула квадратичной функции
(1.5) имеет вид:
Для третьей последовательности точек формула квадратичной функции
(1.6) имеет вид:
На рисунке 2.12 представлен график аппроксимирующей функции и первой последовательности точек.
13
Рисунок 1.12 – Аппроксимация ряда точек
На рисунке 1.13 представлен график аппроксимирующей функции и второй последовательности точек.
Рисунок 1.13 – Аппроксимация ряда точек
На рисунке 1.14 представлен график аппроксимирующей функции и третьей последовательности точек.
14
Рисунок 1.14 – Аппроксимация ряда точек
4 Анализ результатов
В таблице 1.4 представлены результаты для первой последовательности точек.
Таблица 1.4 – Результаты для первой последовательности
x |
|
y(x) |
L2(x) |
∆x = |y(x) – L2(x)| |
f(x) |
∆x = |y(x) – (x)| |
|
|
|
|
|
|
|
xi = 1.4 |
31.051 |
31.051 |
0 |
27.95 |
3.101 |
|
|
|
|
|
|
|
|
x* = 1.1 |
– |
18.162 |
– |
20.907 |
2.745 |
|
|
|
|
|
|
|
|
1 |
= 3 |
– |
80.072 |
– |
92.825 |
12.753 |
|
|
|
|
|
|
|
2 |
= 4.5 |
– |
-253.234 |
– |
195.428 |
448.662 |
|
|
|
|
|
|
|
|
|
|
|
15 |
|
|
В таблице 1.5 представлены результаты для второй последовательности
точек.
Таблица 1.6 – Результаты для второй последовательности
x |
|
y(x) |
L2(x) |
∆x = |y(x) – L2(x)| |
f(x) |
∆x = |y(x) – (x)| |
|
|
|
|
|
|
|
xi = 1.4 |
1.713 |
1.713 |
0 |
1.713 |
0 |
|
|
|
|
|
|
|
|
x* = 1.1 |
1.775 |
1.775 |
0 |
1.776 |
0.001 |
|
|
|
|
|
|
|
|
1 |
= 3 |
1.354 |
1.354 |
0 |
1.358 |
0.004 |
|
|
|
|
|
|
|
2 |
= 4.5 |
0.944 |
0.944 |
0 |
0.994 |
0.05 |
|
|
|
|
|
|
|
|
В |
таблице |
1.7 |
представлены |
результаты |
для |
третьей |
|||||
последовательности точек. |
|
|
|
|
|
|
|
|
||||
Таблица 1.7 – Результаты для третьей последовательности |
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
||
x |
|
y(x) |
|
L2(x) |
∆x = |y(x) – L2(x)| |
|
f(x) |
|
∆x = |y(x) –f (x)| |
|
||
|
|
|
|
|
|
|
|
|
|
|
||
xi = 1.4 |
-0.898 |
|
-0,898 |
0 |
|
0.046 |
|
0.852 |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
||
x* = 1.1 |
0.3935 |
|
-0,243 |
0.6365 |
|
0.021 |
|
0.3725 |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
= 3 |
-0.326 |
|
-3,883 |
3.557 |
|
-0.1094 |
|
0.2166 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
= 4.5 |
0.078 |
|
-116,567 |
116.645 |
|
-0.7016 |
|
0.7796 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Из полученных результатов можно сделать вывод о том, что для функций, подобных первой последовательности точек, лучше использовать полином Лагранжа, так как в нем очень малая погрешность, по сравнению с МНК.
Для монотонно идущих функций лучше всего использовать полином Лагранжа для нахождения промежуточных точек графика и вычисления
16
значений прогнозных точек, в особенности для дальнего прогноза, так как погрешность мала.
Для периодических функций лучше использовать полином Лагранжа для нахождения промежуточных точек и МНК для расчета прогнозных точек.
Также можно сделать вывод, что существует зависимость от вида функции в выборе подхода к построению приближенной функции.
17
Заключение
В ходе данной лабораторной работы были построены квадратный интерполяционный полином Лагранжа для последовательности точек и для функции в аналитическом виде и аппроксимирующая квадратная функции для последовательности точек и для функции в аналитическом виде,
вычислены промежуточные точки, ближние и дальние прогнозные точки.
Отчет был написан согласно ОС ТУСУР 01-2021.
18
Приложение А
double[] X = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8 };
//для первой последовательности
//double[] Y = { 11.90124284, 7.780225365, 8.133003501, 14.86422968, 14.8352434, 15.76667923, 21.84483672, 31.05177674, 34.39567422, 40.52077947, 49.24113267, 56.22344744, 56.67521648, 74.42459163, 82.22353567 };
//для второй последовательности
//double[] Y = { 1.9968, 1.95679, 1.91671, 1.87651, 1.83611, 1.79544, 1.75443, 1.713, 1.67107, 1.62853, 1.58528, 1.5412, 1.49614, 1.44995, 1.40241};
//для третьей последовательности
double[] Y = { -0.91406, 0.98786, - 0.745458, 0.264446, 0.301212, - 0.770456, 0.993087, - 0.897845, 0.515215, 0.0323282, - 0.569524, 0.924423, - 0.983427, 0.727649, - 0.238961};
void Lagrange(double x)
{
if (x <= 0.0)
{
double y = (((x - X[1]) * (x - X[2])) / ((X[0] - X[1]) * (X[0] - X[2]))) * Y[0] + (((x - X[0]) * (x - X[2])) / ((X[1] - X[0]) * (X[1] - X[2]))) * Y[1] + (((x - X[0]) * (x - X[1])) / ((X[2] - X[0]) * (X[2] - X[1]))) * Y[2];
Console.WriteLine($"При x = {x}: y = {y}");
}
else if (x >= 2.8)
{
double y = (((x - X[13]) * (x - X[14])) / ((X[12] - X[13]) * (X[12] - X[14]))) * Y[12] + (((x - X[12]) * (x - X[14])) / ((X[13] - X[12]) * (X[13] - X[14]))) * Y[13] + (((x - X[12]) * (x - X[13])) / ((X[14] - X[12]) * (X[14] - X[13]))) * Y[14];
Console.WriteLine($"При x = {x}: y = {y}");
}
else
{
for (int i = 1; i < 13; i++)
{
if (X[i - 1] < x && X[i + 1] > x)
{
double y = (((x - X[i]) * (x - X[i + 1])) / ((X[i - 1] - X[i]) * (X[i - 1] - X[i + 1]))) * Y[i - 1] + (((x - X[i - 1]) * (x - X[i + 1])) / ((X[i] - X[i - 1]) * (X[i] - X[i + 1]))) * Y[i] + (((x - X[i - 1]) * (x - X[i])) / ((X[i + 1] - X[i - 1]) * (X[i + 1] - X[i]))) * Y[i + 1];
Console.WriteLine($"При x = {x}: y = {y}"); return;
}
}
}
}
for (int i = 0; i < X.Length; i++)
{
Lagrange(X[i]);
}
Console.WriteLine();
Lagrange(1.1);
Console.WriteLine();
Lagrange(3.0);
Lagrange(4.5);
19
Приложение Б
double[] X = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8 };
//для первой последовательности
double[] Y = { 11.90124284, 7.780225365, 8.133003501, 14.86422968, 14.8352434, 15.76667923, 21.84483672, 31.05177674, 34.39567422, 40.52077947, 49.24113267, 56.22344744, 56.67521648, 74.42459163, 82.22353567 };
//для второй последовательности
//double[] Y = { 1.9968, 1.95679, 1.91671, 1.87651, 1.83611, 1.79544, 1.75443, 1.713, 1.67107, 1.62853, 1.58528, 1.5412, 1.49614, 1.44995, 1.40241};
//для третьей последовательности
//double[] Y = { -0.91406, 0.98786, - 0.745458, 0.264446, 0.301212, - 0.770456, 0.993087, - 0.897845, 0.515215, 0.0323282, - 0.569524, 0.924423, - 0.983427, 0.727649, - 0.238961};
double SUM_x_1 = 0; double SUM_x_2 = 0; double SUM_x_3 = 0; double SUM_x_4 = 0; double SUM_y_1 = 0; double SUM_y_x_1 = 0; double SUM_y_x_2 = 0;
double a_start = 0; double b_start = 0; double c_start = 0; double n = 15;
double eps = 0.00001;
void SumsMLS()
{
for (int i = 0; i < 15; i++)
{
SUM_x_1 += X[i];
SUM_x_2 += Math.Pow(X[i], 2); SUM_x_3 += Math.Pow(X[i], 3); SUM_x_4 += Math.Pow(X[i], 4); SUM_y_1 += Y[i];
SUM_y_x_1 += Y[i] * X[i];
SUM_y_x_2 += Y[i] * Math.Pow(X[i], 2);
}
}
void MLS(double x)
{
double a = 0; double b = 0; double c = 0; do
{
a_start = a;
a= (-(b_start * SUM_x_3) - (c_start * SUM_x_2) + SUM_y_x_2) / (SUM_x_4); b_start = b;
b= (-(a * SUM_x_3) - (c_start * SUM_x_1) + SUM_y_x_1) / (SUM_x_2);
c_start = c;
c = (-(a * SUM_x_2) - (b * SUM_x_1) + SUM_y_1) / n;
}
while ((Math.Abs(a - a_start) >= eps) || (Math.Abs(b - b_start) >= eps) || (Math.Abs(c - c_start) >= eps));
{
double y = (a * x * x) + (b |
* x) + |
c; |
Console.WriteLine($"При x = |
{x}: y |
= {y}"); |
Console.WriteLine($"{a} |
{b} |
{c}"); |
}
}
SumsMLS();
20
