Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3

.pdf
Скачиваний:
6
Добавлен:
24.01.2025
Размер:
1 Мб
Скачать
☆

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

значениями, полученными в пункте 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