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

4 лаба численные методы

.pdf
Скачиваний:
3
Добавлен:
01.12.2023
Размер:
731.96 Кб
Скачать

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

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

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

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

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

Студент гр. 711-2

_______ Е. П. Толстолес

_______

Принял:

Ст. преподаватель кафедры КИБЕВС

_______ А. Ю. Якимук

_______

Томск 2022

1 Введение

Цель работы: Получение теоретических знаний и освоение навыков по работе с основными методами интерполяции и аппроксимации функций.

Задание: Необходимо рассчитать значение данного интеграла следующими методами:

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

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

3.Методом трапеций.

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

Задать числа разбиений n следующие: 4, 20, 100, 400. Число разбиений не должно увеличиваться в процессе вычисления интеграла. Сделать выводы о том, какой способ численного интегрирования предпочтительнее.

Индивидуальный интеграл:

2

= ∫ 0,71 cos(0,73 )

1

2

2 Ход работы

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

Метод прямоугольников — метод численного интегрирования функции одной переменной, заключающийся в замене подынтегральной функции на многочлен нулевой степени, то есть константу, на каждом элементарном отрезке. Этот метод является самым простым для приближенного вычисления определенного интеграла.

Данный метод основан на определении интеграла:

а ( ) = ∑ =1 (ξ) ∆ при х 0

где исходный отрезок [a, b] с помощью точек x0 = a, x1, x2, ..., xn−1, xn = b разбит на n подотрезков [ −1, ] и на каждом отрезке выбрана ξ [ −1, ] .

Если обозначить

 

 

 

̅̅̅̅̅̅̅̅̅̅

( ) = , = 0, − 1, а участки разбиения сделаем

 

 

 

 

 

 

 

 

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

∫ ( ) = (

+

+ +

, где h =

, n - число разбиений [a,b].

 

 

0

1

 

−1

 

 

 

 

 

 

 

Если обозначить

 

 

̅̅̅̅̅

( ) = , = 1, , получим формулу правых

 

 

 

 

 

 

 

 

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

 

 

 

 

 

∫ ( ) = (

+

+ + ,

где h =

, n - число разбиений [a,b]. Оба

 

 

1

2

 

 

 

 

 

 

 

 

 

этих метода были реализованы программно, полный листинг кода можно найти в приложении А, а результат работы программы на рисунке 2.1.

3

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

При увеличении числа разибений, погрешность итогового результата уменьшается. Результат программы корректен, значит программа работает правильно.

4

а ( )

2.2 Метод Симпсона и трапеций

Метод трапеций — метод численного интегрирования функции одной переменной, заключающийся в замене на каждом элементарном отрезке подынтегральной функции на многочлен первой степени, то есть линейную функцию. Площадь под графиком функции аппроксимируется прямоугольными трапециями. Рассматривая будем интерполировать подынтегральную функцию полиномом Лагранжа первой степени (линейной функцией). Формула трапеций для интеграла по всему отрезку [a,b] выглядит следующим образом: ∫ ( ) = 2 ( 0 + 1) + 2

( 1 + 2) + + 2 ( −1 + ) = 2 ( 0 + ) + ∑ =1−1

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

подынтегральной функции на отрезке [a,b] интерполяционным многочленом второй степени , то есть приближение графика функции на отрезке параболой. Если взять те же три отрезка, то метод Симпсона

даст ещё более точное приближение, чем метод прямоугольников или метод трапеций.

Формула Симпсона для интеграла по всему отрезку выглядит

следующим образом:

 

 

 

−1

 

−2

 

 

 

2

 

2

 

∫ ( ) =

+ 4

 

+ 2 ∑

+

 

 

3

0

 

2 +1

 

2

 

 

=0

 

=0

 

 

[

 

]

 

 

 

 

 

C помощью формулы была реализована программа по метод Симпсона.

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

5

Рисунок 2.2 – Результат работы программы по методу трапеции и Симпсона

Результаты всех вычислений приведены в таблице 2.1.

Таблица 2.1 - Результаты применения каждого метода

 

 

n=4

n=20

n=100

n=400

 

 

 

 

 

 

Метод

левых

1.33286

1.24084

1.22023

1.21628

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

 

 

 

 

 

 

 

 

 

 

Метод

правых

1.06831

1.18793

1.20965

1.21364

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

 

 

 

 

 

 

 

 

 

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

1.20058

1.21439

1.21494

1.21496

 

 

 

 

 

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

1.21494

1.21496

1.21496

1.21496

 

 

 

 

 

 

Наиболее точный метод вычисления – метод Симпсона, потому что приближение функции происходит по параболе. Чем больше разбиений, тем на более мелкие кусочки происходит разбиение и более точный результат.

6

3Заключение

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

Отчет написан согласно ОС ТУСУР 2021.

7

Приложение А

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

Листинг кода программы

from math import cos

def work1(f, a, b, n):

h = (b - a) / float(n)

total = sum([f((a + (k * h))) for k in range(0, n)]) result = h * total

return result

def f(x):

return (2.718 ** (0.71 * x)) * cos(0.73 * x)

print("\nМетод левых прямоугольников") n = 4

a1 = work1(f, 1, 2, n)

print("\nОтвет:", a1, "\nКоличество разбиений:", n) n = 20

a2 = work1(f, 1, 2, n)

print("\nОтвет:", a2, "\nКоличество разбиений:", n)

for i in range(10000000): n *= 5

a1 = work1(f, 1, 2, n)

print("\nОтвет:", a1, "\nКоличество разбиений:", n) n *= 4

a2 = work1(f, 1, 2, n)

print("\nОтвет:", a2, "\nКоличество разбиений:", n) if abs(a1 - a2) > 0.001:

break

def work1(f, a, b, n):

h = (a - b) / float(n)

total = sum([f((b + (k * h))) for k in range(0, n)]) result = -(h * total)

return result

print("\nМетод правых прямоугольников") n = 4

a1 = work1(f, 1, 2, n)

print("\nОтвет:", a1, "\nКоличество разбиений:", n) n = 20

a2 = work1(f, 1, 2, n)

print("\nОтвет:", a2, "\nКоличество разбиений:", n)

for i in range(10000000): n *= 5

a1 = work1(f, 1, 2, n)

print("\nОтвет:", a1, "\nКоличество разбиений:", n) n *= 4

a2 = work1(f, 1, 2, n)

print("\nОтвет:", a2, "\nКоличество разбиений:", n)

8

if abs(a1 - a2) > 0.001: break

def trapezoid_rule(f, a, b, n): dx = 1.0 * (b - a) / n

sum = 0.5 * (f(a) + f(b)) for i in range(1, n):

sum += f(a + i * dx) return sum * dx

print("\nВведите количество разбиений для метода трапеции") n = int(input())

print("\nМетод трапеции", "\nОтвет:", trapezoid_rule(f, 1, 2, n), "\nКоличество разбиений:", n)

def simpson_rule(func, a, b, n):

"""Правило трапеций

nseg - число отрезков, на которые разбивается [a;b]""" if n % 2 == 1:

n += 1

dx = 1.0 * (b - a) / n

sum = (func(a) + 4 * func(a + dx) + func(b)) for i in range(1, n // 2):

sum += 2 * func(a + (2 * i) * dx) + 4 * func(a + (2 * i + 1) * dx) return sum * dx / 3

print("\nВведите количество разбиений для метода Симпсона") n = int(input())

print("\nМетод Симпсона", "\nОтвет:", simpson_rule(f, 1, 2, n), "\nКоличество разбиений:", n)

9