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

Лаб. 4 - Численное интегрирование - СФ

.pdf
Скачиваний:
19
Добавлен:
07.11.2022
Размер:
321.26 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕЕНЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-

вычислительных систем (КИБЭВС)

Численное интегрирование Отчет по лабораторной работе №4 По дисциплине «Численные методы»

Студент гр. xxxxxx

________ xxxxxxxx

________

Принял Старший преподаватель КИБЭВС

________ xxxxxxxx

________

Томск 2022

1 Введение

Целью данной работы является изучение методов вычисления определенного интеграла, получение навыков работы с методами правых и левых прямоугольников, методом трапеций и методом Симпсона.

2

2 Ход работы

На рисунке 2.1 изображен индивидуальный определенный интеграл. А на рисунке 2.2 изображена функция данного интеграла.

Рисунок 2.1 – Интеграл

Рисунок 1.1 - График функции

Также для проверки верности решений методами был посчитан интеграл.

12 0.7 −1(0.24) = 1.0396

В формулах всех методов используется h – это шаг сетки, его формула:

3

−= ,

где n – число разбиение {4, 20, 100, 400},

a – начальная координата х,

b – конечная координата х.

2.1Метод правых и левых прямоугольников

Вметоде левых прямоугольников площадь под функцией заменяется элементарными прямоугольниками. Площадь фигуры – это сумма площадей прямоугольников. Площадь прямоугольника берется тогда, когда его высота равна значению функции по левой стороне прямоугольника. Формула для метода левых прямоугольников:

∫ ( ) ≈ (0 + 1 + + −1)

У метода правых прямоугольников практические такое же определение,

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

∫ ( ) ≈ (1 + 2 + + )

2.2Метод трапеций

Вэтом методе используется линейная интерполяция, она вычисляется полиномом Лагранжа первой степени. Интерполяция имеет приближенное значение. Затем интеграл считается от линейной функции. Формула для метода трапеции:

4

 

 

 

−1

 

 

∫ ( ) ≈

( + ) + ∑

2

 

0

 

 

 

=1

 

 

 

2.3 Метод Симпсона

Метод подходит только если число разбиений четное. В этом методе используется квадратичная интерполяция, она высчитывается полиномом Лагранжа второй степени. Площадь под кривой разбивается на четное количество отрезков и для вычислений берется 2 отрезка, т.е. 3 точки х, т.к.

используется полином Лагранжа второй степени, и функция на каждом из отрезков приближается параболой. Соответственно на каждой паре отрезков интегрирования функция интерполируется параболой по трем узлам. Формула для метода Симпсона:

 

 

 

−1

−2

 

 

 

 

2

2

 

 

 

 

 

∫ ( ) ≈

+ 4 ∑

+ 2 ∑ +

 

3

 

 

0

2 +1

2

 

 

 

=0

=0

 

 

 

[

]

 

 

 

 

2.4Сравнительная таблица

Втаблице 2.1 представлены значения полученный в ходе лабораторной

работы.

Таблица 2.1 – Сравнительная таблица

 

n = 4

n = 20

n = 100

n = 400

 

 

 

 

 

Метод левых

0.8786

1.0063

1.0329

1.0424

прямоугольников

 

 

 

 

Метод правых

1.2138

0.9826

1.0281

1.0413

прямоугольников

 

 

 

 

Метод трапеций

1.0462

1.0398

1.0396

1.0441

 

 

 

 

 

Метод Симпсона

1.1186

1.0554

1.0427

1.0404

 

 

 

 

 

5

3Заключение

Врезультате выполнения данной лабораторной работы были получены навыки разработки программ, использующих в своей работе методы левых,

правых прямоугольников, а также метод трапеций и метод Симпсона.

Из таблицы 2.1 видно, что метод Симпсона, при разбиении 400 ближе остальных методов к истинной площади, но метод трапеций при разбиении 20 и

100 больше остальных методов вычислил приближенный интеграл.

В приложении А представлен листинг программы.

6

Приложение А

(обязательное)

using System; namespace m44

{

class Program

{

private const double a = 1; private const double b = 2; private const int n1 = 4; private const int n2 = 20; private const int n3 = 100; private const int n4 = 400;

private const double h1 = (b - a) / n1; private const double h2 = (b - a) / n2; private const double h3 = (b - a) / n3; private const double h4 = (b - a) / n4; static double Function(double x)

{

return Math.Pow(Math.E, 0.7 * x) * Math.Atan(0.24 * x);

}

static void LeftRect(double[] SQ)

{

Console.WriteLine("Метод левых прямоугольников:"); for (double x = a; x < b; x += h1)

SQ[0] += Function(x);

Console.WriteLine($"Разбиений 4: {Math.Round(SQ[0] *h1,4)}"); for (double x = a; x < b; x += h2)

SQ[1] += Function(x);

Console.WriteLine($"Разбиений 20: {Math.Round(SQ[1] * h2, 4)}"); for (double x = a; x < b; x += h3)

SQ[2] += Function(x);

Console.WriteLine($"Разбиений 100: {Math.Round(SQ[2] * h3, 4)}"); for (double x = a; x < b; x += h4)

SQ[3] += Function(x);

Console.WriteLine($"Разбиений 400: {Math.Round(SQ[3] * h4, 4)}");

}

static void RightRect(double[] SQ)

{

Console.WriteLine("Метод праых прямоугольников: "); for (double x = a + h1; x <= b; x += h1)

SQ[0] += Function(x);

Console.WriteLine($"Разбиений 4: {Math.Round(SQ[0]*h1,4)}"); for (double x = a + h2; x <= b; x += h2)

SQ[1] += Function(x);

Console.WriteLine($"Разбиений 20: {Math.Round(SQ[1] * h2, 4)}"); for (double x = a + h3; x <= b; x += h3)

SQ[2] += Function(x);

Console.WriteLine($"Разбиений 100: {Math.Round(SQ[2] * h3, 4)}"); for (double x = a + h4; x <= b; x += h4)

SQ[3] += Function(x);

Console.WriteLine($"Разбиений 400: {Math.Round(SQ[3] * h4, 4)}");

}

static void Trapezoid(double[] SQ)

{

Console.WriteLine("Метод трапеций: "); for (double x = a + h1; x < b; x += h1)

SQ[0] += Function(x);

Console.WriteLine($"Разбиений 4: {Math.Round(h1 / 2 * (Function(a) + Function(b)) + h1 * SQ[0],4)}");

for (double x = a + h2; x < b; x += h2) SQ[1] += Function(x);

7

Console.WriteLine($"Разбиений 20: {Math.Round(h2 / 2 * (Function(a) + Function(b)) + h2 * SQ[1], 4)}");

for (double x = a + h3; x < b; x += h3) SQ[2] += Function(x);

Console.WriteLine($"Разбиений 100: {Math.Round(h3 / 2 * (Function(a) + Function(b)) + h3 * SQ[2], 4)}");

for (double x = a + h4; x < b; x += h4) SQ[3] += Function(x);

Console.WriteLine($"Разбиений 400: {Math.Round(h4 / 2 * (Function(a) + Function(b)) + h4 * SQ[3], 4)}");

}

static void MthSimpson(double[] C)

{

Console.WriteLine("Метод Симпсона: "); double[] SQ = { 0, 0, 0, 0 };

double[] SQ1 = { 0, 0, 0, 0 }; double x = 0;

for (int i = 0; i <= (n1-1)/2; i++)

{

x = a + (2 * i + 1) * h1; SQ[0] += Function(x);

}

for (int i = 0; i <= (n1-2)/2; i++)

{

x = a + 2 * i * h1; SQ1[0] += Function(x);

}

C[0] = h1 / 3 * (Function(a) + 4 * SQ[0] + 2 * SQ1[0] + Function(b)); Console.WriteLine($"Разбиений 4: {Math.Round(C[0], 4)}");

for (int i = 0; i <= (n2 - 1) / 2; i++)

{

x = a + (2 * i + 1) * h2; SQ[1] += Function(x);

}

for (int i = 0; i <= (n2 - 2) / 2; i++)

{

x = a + 2 * i * h2; SQ1[1] += Function(x);

}

C[1] = h2 / 3 * (Function(a) + 4 * SQ[1] + 2 * SQ1[1] + Function(b)); Console.WriteLine($"Разбиений 20: {Math.Round(C[1], 4)}");

for (int i = 0; i <= (n3 - 1) / 2; i++)

{

x = a + (2 * i + 1) * h3; SQ[2] += Function(x);

}

for (int i = 0; i <= (n3 - 2) / 2; i++)

{

x = a + 2 * i * h3; SQ1[2] += Function(x);

}

C[2] = h3 / 3 * (Function(a) + 4 * SQ[2] + 2 * SQ1[2] + Function(b)); Console.WriteLine($"Разбиений 100: {Math.Round(C[2], 4)}");

for (int i = 0; i <= (n4 - 1) / 2; i++)

{

x = a + (2 * i + 1) * h4; SQ[3] += Function(x);

}

for (int i = 0; i <= (n4 - 2) / 2; i++)

{

x = a + 2 * i * h4; SQ1[3] += Function(x);

}

C[3] = h4 / 3 * (Function(a) + 4 * SQ[3] + 2 * SQ1[3] + Function(b)); Console.WriteLine($"Разбиений 400: {Math.Round(C[3], 4)}");

8

}

static void Main(string[] args)

{

double[] SQl = {0,0,0,0}; double[] SQr = {0,0,0,0}; double[] SQt = {0,0,0,0}; double[] SQs = {0,0,0,0}; LeftRect(SQl); Console.WriteLine(); RightRect(SQr); Console.WriteLine(); Trapezoid(SQt); Console.WriteLine(); MthSimpson(SQs); Console.ReadLine();

}

}

}

9