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

1 семестр / лаб 7 / Отчет лаб 7

.docx
Скачиваний:
0
Добавлен:
05.06.2026
Размер:
841.23 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ

Факультет «Радио и телевидение»

Кафедра «Системы и сети радиосвязи и телерадиовещания»

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

по дисциплине «Информационные технологии и программирование»

«Решение нелинейных уравнений численными методами»

Выполнил:

Вариант №13

Цель работы

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

Задание 1.

Изучите по указанной литературе численные алгоритмы нахождения корней нелинейных уравнений, зарисуйте блок-схемы изученных алгоритмов.

Задание 2.

Выберите для выполнения лабораторной работы свой вариант. На изучаемом языке программирования разработайте подпрограммы нахождения корня нелинейного уравнения на заданном интервале тремя методами (методом деления отрезка пополам, методом Ньютона и методом простой итерации), каждый для двух вариантов цикла: регулярного (число итераций N задано в таблице) и итерационного (точность ε задана в таблице). Основная программа работает следующим образом: сначала делается запрос на ввод начального приближения (это может быть α, β или x0) к тому корню, который надо получить; после того как введены требуемые данные, идет обращение к подпрограмме, выполняющей вычисления, а затем вывод результатов. Различные методы нахождения корня уравнения необходимо оформить в виде отдельных подпрограмм, всего должно быть шесть подпрограмм (функций). Прототипы функций задать самостоятельно. Организовать меню с возможностью выбора метода нахождения корней и вариантов цикла. Для итерационного цикла выполнять вычисления пока не будет достигнута точность, заданная в таблице 1. Предусмотреть вывод числа итераций на экран и сравнить их для разных методов нахождения корней уравнения. Для регулярного цикла, для заданного в таблице 1 числа итераций N, сравнить точность полученных результатов для разных методов нахождения корней уравнения. Результаты вычислений занести в Таблицу 2.

Рисунок 1 – Заданная функция

Задание 3.

Нарисовать график функции, а также график сходимости к указанному корню для первых пяти итераций, для чего предусмотреть в процедуре нахождения корня возможность вывода значений xk и dk =xk-xk-1. Данное задание можно выполнить с помощью любого доступного математического пакета. В конце работы необходимо сделать выводы по полученным 2 результатам.

Ход работы

Задание 1:

Рисунок 2 – блок-схема метода "Деление отрезка пополам"

Рисунок 3 – Блок-схема для метода Ньютона

Рисунок 4 – Блок-схема для метода последовательных приближений

Программа для выполнения задания 2 и 3:

import math

import matplotlib.pyplot as plt

import numpy as np

x_list = []

y_list = []

def f(x):

return x*math.tan(x)-(1/3)

def ff(x):

return math.tan(x)+(x/(math.cos(x)**2))

def fff(x):

return ((2*x*math.sin(x))+(2*math.cos(x)))/(math.cos(x)**3)

def fi(x):

return 1/(3*math.tan(x))

def delenie_e(a,b,E):

x=(a+b)/2

n=0

while abs(a-b)>E:

if n<5:

x_list.append(x)

y_list.append(f(x))

if f(a)*f(x)<0:

b=x

x=(b+a)/2

else:

a=x

x=(a+b)/2

n+=1

return x, n

def delenie_n(a,b,N):

x=(a+b)/2

for i in range(N+1):

if (i<5):

x_list.append(x)

y_list.append(f(x))

if f(a)*f(x)<0:

b=x

x=(b+a)/2

else:

a=x

x=(a+b)/2

e=abs(a-b)

return x, e

def newton_e(a,b,E):

if f(a)*fff(a)>0:

x=a

else:

x=b

if ff(x)!=0:

x1=x-f(x)/ff(x)

else:

return x1, 1

n=1

while abs(x1-x)>E and ff(x)!=0:

if n<5:

x_list.append(x)

y_list.append(f(x))

x=x1

x1=x-f(x)/ff(x)

n+=1

return x1, n

def newton_n(a,b,N):

if f(a)*fff(a)>0:

x=a

else:

x=b

if ff(x)!=0:

x1=x-f(x)/ff(x)

else:

return x1, 1

for i in range (N):

if (i<5):

x_list.append(x)

y_list.append(f(x))

if ff(x)!=0:

x=x1

x1=x-f(x)/ff(x)

e=abs(x-x1)

return x1, e

def pribl_e(x0,E):

x=x0

x1=fi(x)

n=1

while abs(x1-x)>E:

if n<5:

x_list.append(x)

y_list.append(f(x))

x=x1

x1=fi(x)

n+=1

return x1, n

def pribl_n(x0,N):

x=x0

x1=fi(x)

for i in range(N):

if (i<5):

x_list.append(x)

y_list.append(f(x))

x=x1

x1=fi(x)

e=abs(x1-x)

return x1, e

vibor=int(input('Выберите вариант вычисления и введите его номер:\n1. Метод деления отрезка пополам с заданным E\n2. Метод деления отрезка пополам с заданным N\n3. Метод Ньютона с заданным E\n4. Метод Ньютона с заданным N\n5. Метод последовательных приближений с заданным E\n6. Метод последовательных приближений с заданным N\nВведите ваш выбор: '))

if vibor==1:

a=float(input('Введите a: '))

b=float(input('Введите b: '))

E=float(input('Введите Эпсилон: '))

x,n=delenie_e(a,b,E)

print('x=', x, '; Число итераций - ', n )

if vibor==2:

a=float(input('Введите a: '))

b=float(input('Введите b: '))

N=int(input('Введите число итераций: '))

x,e=delenie_n(a,b,N)

print('x=', x, '; Точность - ', e )

if vibor==3:

a=float(input('Введите a: '))

b=float(input('Введите b: '))

E=float(input('Введите Эпсилон: '))

x,n=newton_e(a,b,E)

print('x=', x, '; Число итераций - ', n )

if vibor==4:

a=float(input('Введите a: '))

b=float(input('Введите b: '))

N=int(input('Введите число итераций: '))

x,e=newton_n(a,b,N)

print('x=', x, '; Точность - ', e )

if vibor==5:

x0=float(input('Введите x0: '))

E=float(input('Введите Эпсилон: '))

x,n=pribl_e(x0,E)

print('x=', x, '; Число итераций - ', n )

if vibor==6:

x0=float(input('Введите x0: '))

N=int(input('Введите число итераций: '))

x,e=pribl_n(x0,N)

print('x=', x, '; Точность - ', e )

if vibor<5:

x = np.arange(a, b, 0.01)

plt.plot(x, x*np.tan(x)-(1/3))

plt.plot(x_list, y_list)

plt.grid(True)

plt.show()

else:

x = np.arange(x0-0.5, x0+0.5, 0.01)

plt.plot(x, x * np.tan(x) - (1 / 3))

plt.plot(x_list, y_list)

plt.grid(True)

plt.show()

#По условию нужно ввести a=0.2 , b=1 , e=0.0001 , n = 16 :)

Конец программы

Рисунок 5 – метод деления отрезка пополам для заданного эпсилон

Рисунок 6 – метод деления отрезка пополам для заданного числа итераций

Рисунок 7 – метод Ньютона для заданного эпсилон

Рисунок 8 – метод Ньютона для заданного числа итераций

Рисунок 9 – метод последовательных приближений для заданного эпсилон

Рисунок 10 – метод последовательных приближений для заданного числа итераций

Точность ε при N=16

Число итераций N при ε = 0.0001

Метод деления отрезка пополам

6,1 * 10^-6

13

Метод Ньютона

0

5

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

2,1 * 10^-1

20884

Таблица 1 – Сравнение результатов выполнения программы

Рисунок 11 – график функции и график по 5 точкам

Вывод:

В ходе данной работы научились пользоваться библиотекой matplotlib для построения графиков в python, из которой использовала модуль pyplot для доступа к функциям plot(), show() и другим. Также изучили 3 метода нахождения корня нелинейного уравнения (Метод деления отрезка пополам, метод Ньютона и метод последовательных приближений) на заданном отрезке и реализовали каждый метод двумя способами: через задание количества итераций либо необходимого приближения эпсилон. Можно заметить, что метод Ньютона работает за наименьшее количество итераций по сравнению с другими методами.

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

Для каждого метода создали две подпрограммы, а также вынесли построение графика, подсчет значения функции и ее производной в отдельные подпрограммы, что помогло структурировать программу для лучшего понимания.

Москва 2024

Соседние файлы в папке лаб 7