
Лаб. 4 - Численное интегрирование - СФ
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕЕНЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
Численное интегрирование Отчет по лабораторной работе №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