Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования
МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ
Факультет «Радио и телевидение»
Кафедра «Системы и сети радиосвязи и телерадиовещания»
Лабораторная работа № 8
по дисциплине «Информационные технологии и программирование»
«Интегрирование численными методами»
Выполнил:
Вариант №13
Цель работы
Изучить численные алгоритмы интегрирования, сравнить их точность.
Задание 1.
Выберите для выполнения лабораторной работы свой вариант (Таблица 3). Аналитическим методом найдите значение интеграла. Для выбранного варианта графически (с помощью любого математического пакета) изобразите заданную функцию и пределы ее интегрирования. Зарисуйте блок-схему изученных алгоритмов нахождения интеграла численными методами.
Задание 2.
На изучаемом языке программирования напишите функции для нахождения значения интеграла численными методами (на каждый метод свою функцию) по методам интегрирования заданным в Таблице 3. В этой таблице приняты следующие сокращения: МЛП – метод левых прямоугольников, МПП – метод правых прямоугольников, МСП – метод средних прямоугольников, МТ – метод трапеций, МП – метод парабол.
Прототипы функций задайте самостоятельно. Продумайте, какие аргументы должна принимать функция. Каждая из функций должна возвращать значения интеграла и точность, с которой эти значения вычислены. Функции не должны использовать операции консольного ввода-вывода.
В основной программе осуществляется консольный ввод числа интервалов разбиения n, вызов разработанных функций, а также вывод значений, полученных в результате численного интегрирования. Выполните расчеты для четырех произвольных интервалов разбиения n, 10 ≤ n ≤ 100 и занесите результаты, полученные для каждого метода в таблицу (Таблица 1). Сравните результаты. Сделайте выводы.
Рисунок 1 – Заданная функция
Задание 3.
Для тех же вариантов заданий на изучаемом языке программирования напишите функции для нахождения интеграла при заданном значении точности.
Прототипы функций задайте самостоятельно. Продумайте, какие аргументы должна принимать функция. Каждая из функций должна возвращать значения интеграла и число интервалов, для которых было достигнуто заданное значение точности. Функции не должны использовать операции консольного ввода-вывода.
В основной программе осуществляется консольный ввод заданной точности, вызов разработанных функций, а также вывод значений, полученных в результате численного интегрирования.
Выполните расчет для заданного значения точности и занесите результаты в таблицу (Таблица 2). Сравните результаты. Сделайте выводы.
Ход работы
Задание 1:
— особый
интеграл. Интеграл соответствует функции
ошибок Гаусса.
Построим график заданной функции, используя калькулятор Windows 10:
Рисунок 2 – График заданной функции с границами интегрирования
Рисунок 3 – блок-схема для метода прямоугольников (задано число разбиений)
Рисунок 4 – Блок-схема для метода Трапеций (задано число разбиений)
Рисунок 5 – Блок-схема для метода парабол (задано число разбиений)
Рисунок 6 – блок-схема для метода прямоугольников (задана точность)
Рисунок 7 – Блок-схема для метода Трапеций (задана точность)
Рисунок 8 – Блок-схема для метода парабол (задана точность)
Программа для выполнения задания 2 и 3:
import math
def f(x):
return math.e**(-(x)**2)
def metod1_n(a, b, n):
x0=a
xn=b
summ=0
while x0<b-(abs(b-a)/n):
x=x0+(abs(a-b)/n)
summ+=f(x0)*(x-x0)
x0=x
return summ, (abs(a-b)/n)
def metod2_n(a, b, n):
x0=a
xn=b
summ=0
while x0<b-(abs(b-a)/n):
x=x0+(abs(a-b)/n)
summ+=(f(x0)+f(x))*((x-x0)/2)
x0=x
return summ, (abs(a-b)/n)
def TheSimpsons_n(a, b, n):
x0=a
x=x0+(abs(a-b)/n)
summ=f(a)*((x-x0)/3)
k=2
while x0<b-(abs(b-a)/n):
x=x0+(abs(a-b)/n)
summ+=(2**k)*f(x)*((x-x0)/3)
x0=x
if k==2:
k=1
else:
k=2
summ+=f(b)*((x-x0)/3)
return summ, (abs(a-b)/n)
def metod1_e(a, b, e):
summ = 0
step = 0.5
I_const = 0.74682413
while abs(I_const - summ) > e:
n = 0
x0 = a
summ = 0
while x0 < b - step:
n += 1
x = x0 + step
summ += f(x0 + step / 2) * (x - x0)
x0 = x
step /= 2
return summ, n
def metod2_e(a, b, e):
summ = 0
step = 0.5
I_const = 0.74682413
while abs(I_const - summ) > e:
n = 0
x0 = a
summ = 0
while x0 < b - step:
n += 1
x = x0 + step
summ += (f(x0) + f(x)) * (x - x0) / 2
x0 = x
step /= 2
return summ, n
def TheSimpsons_e(a, b, e):
step = 0.5
summ = (f(a) + f(b)) * (step) / 3
I_const = 0.74682413
while abs(I_const - summ) > e:
counter = 1
n = 0
x0 = a
summ = (f(a) + f(b)) * (step) / 3
while x0 < b - step:
n += 1
x = x0 + step
summ += (2 ** (counter % 2 + 1)) * f(x) * (x - x0) / 3
x0 = x
counter += 1
step /= 2
return summ, n
p1=int(input('Выберите метод нахождения интеграла:\n1. Метод прямоугольников\n2. Метод трапеций\n3. Метод Симпсона\nВведите номер выбранного варианта: '))
p2=int(input('\nВыберите вариант вычисления:\n1. Задать число разбиений n\n2. Задать точность е\nВведите номер выбранного варианта: '))
a=0
b=1
print('Границы интегрирования: [',a,';',b,']')
if p2==1:
n = int(input('Введите количество разбиений n: '))
if p1==1:
s,e=metod1_n(a,b,n)
if p1==2:
s,e=metod2_n(a,b,n)
if p1==3:
s,e=TheSimpsons_n(a,b,n)
if p2==2:
e = float(input('Введите точность е: '))
if p1==1:
s, n=metod1_e(a,b,e)
if p1==2:
s, n=metod2_e(a,b,e)
if p1==3:
s, n=TheSimpsons_e(a,b,e)
print('Интеграл заданной функции равен ', s, '\nТочность - ', e, '\nКоличество разбиений - ', n)
Конец программы
Рисунок 9 – метод прямоугольников (задаётся разбиение)
Рисунок 10 – метод прямоугольников (задаётся точность)
Рисунок 11 – метод трапеций (задаётся разбиение)
Рисунок 12 – метод трапеций (задаётся точность)
Рисунок 13 – метод Симпсона (задаётся разбиение)
Рисунок 14 – метод Симпсона (задаётся точность)
|
n=10 |
n=30 |
n=70 |
n=100 |
Метод левых прямоугольников |
||||
I |
0,777816 |
0,757291 |
0,751326 |
0,746225 |
ε |
0,1 |
0,03 |
0,01 |
0,01 |
Метод Трапеций |
||||
I |
0,746210 |
0,746756 |
0,746811 |
0,743102 |
ε |
0,1 |
0,03 |
0,01 |
0,01 |
Метод Симпсона |
||||
I |
0,759087 |
0,750911 |
0,748575 |
0,745597 |
ε |
0,1 |
0,03 |
0,01 |
0,01 |
Таблица 1 – Сравнение результатов выполнения программы по заданию 2
-
ε=0,003
Метод левых прямоугольников
Метод Трапеций
Метод Симпсона
I
0,747769
0,746823
0,747191
n
127
127
1
Таблица 2 – Сравнение результатов выполнения программы по заданию 3
Вывод:
В ходе данной работы научились пользоваться библиотекой math для построения использования дополнительным математических функций в python, из которой использовали функцию math.e. Также изучили 3 метода нахождения интеграла численными методами (метод левых прямоугольников, метод трапеций и метод Симпсона) на заданном интервале и реализовали каждый метод двумя способами: через задание количества разбиений либо необходимой точности эпсилон.
Можно заметить, что, чем больше разбиений задаётся, тем точнее результат вычисления интеграла. А также, что при задании эпсилон, наиболее точный результат получается при вычислении методом трапеций.
Для каждого метода отдельные подпрограммы, а также вынесли подсчет значения функции отдельные подпрограммы, что помогло структурировать программу для лучшего понимания.
Москва 2024
