Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2сем / лаб / ЛР-2.docx
Скачиваний:
0
Добавлен:
04.04.2026
Размер:
70.64 Кб
Скачать

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

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

МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

СВЯЗИ И ИНФОРМАТИКИ

(МТУСИ)

Факультет "Сети и системные связи"

Кафедра “ВвИТ"

ОТЧЕТ

по дисциплине "Введение в информационные технологии"

на тему: Введение в численные методы на Python: Вычисление корня функции и определение функции плотности вероятности

"Лабораторная работа №2"

Выполнил

Студент гр. БИН2412 ____________________ Джумъаев Ф.Н.

Проверил

Преподаватель ___________________

Дата защиты _________2025г.

Москва 2025

Цель работы

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

Задание 1.1 (обязательная часть) “Нахождение корня функции одного вещественного аргумента”

Задание 1.2 (дополнительная часть) “Сравнение эффективности методов нахождения корней функции одного вещественного аргумента”

Задание 2.1 (дополнительная часть) “Экспериментальное определение функции плотности вероятности случайной величины”

Введение

Блок 1 “Способы вычисления корня функции одного вещественного аргумента” Существуют несколько способов численного поиска корня функции одной вещественной переменной на отрезке. Предположим, что функция f(x) уже задана в программе. Рассмотрим некоторые методы поиска корня: 1. Метод бисекции (дихотомия). Если функция непрерывна и принимает значения разного знака на концах некоторого отрезка [a, b], то на этом отрезке есть корень. Вычислим значение функции в середине отрезка и выберем ту его половину, на концах которой функция вновь принимает значения разного знака. Будем продолжать процесс, пока длина отрезка не станет меньше требуемой точности. Середина отрезка будет искомым приближением к корню. 2. Метод хорд. Пусть на концах отрезка [a, b] функция принимает значения разных знаков f(a) и f(b). Аппроксимируем функцию на отрезке прямой, проходящей через точки (a, f(a)) и (b, f(b)) и найдем абсциссу c точки ее пересечения с осью x. Из двух отрезков [a, c] и [c, b] выберем тот, на концах которого функция принимает значения разных знаков. Продолжаем процесс, пока точка c не окажется удаленной от одного из концов текущего отрезка менее чем на требуемую точность. 3. Метод секущих. Пусть x0, x1 – два приближения к корню. Аппроксимируем функцию прямой (по 2-м точкам) и построим точку ее пересечения с осью абсцисс x2. Следующее приближение к корню (x3) построим, используя точки x1 и x2. Прекратим процесс, когда пара очередных точек (xj, xj-1) окажется достаточно близкой друг к другу. 4. Метод касательных (метод Ньютона). Выберем x0 – начальное приближение к корню и построим касательную к графику функции в этой точке. Найдем точку пересечения касательной с осью абсцисс x1 – это будет новое приближение к корню. Продолжаем процесс, пока очередная точка не станет отличаться от предыдущей менее, чем на требуемую точность. Для построения касательной требуется вычисление производной; рекомендуется использовать в качестве значения производной конечную разность f' ( x) ≈ f (x+ε) − f (x) ε .

Блок 2 “Экспериментальное определение функции плотности вероятности случайной величины” Для «экспериментального» определения функции плотности вероятности случайной величины можно использовать следующий прием. Интервал всех возможных значений случайной величины (например, [a, b]) разбивается на N равных диапазонов [xi, xi+1] (x0 = a, xN = b). Затем генерируется большая последовательность значений случайной величины, и для каждого значения определяется, в какой диапазон оно попало. Гистограмма количества попавших в диапазон точек будет тем ближе к искомой функции распределения (с точностью до нормировки), чем мельче диапазоны и чем больше точек.

Требования к знаниям студентов:

Основы синтаксиса Python 3:- умение работать с переменными и знание типов данных- умение работать со списками- умение считывать данные из файла- умение выводить данные в консоль/файл- знание условных конструкций if-elif-else- умение писать циклы for/while- умение создавать и вызывать функции, возращать значения- умение генерировать случайные числа с заданным распределением

Базовое владение математическим аппаратом: - понимание, что такое функция- понимание отличия нормального и равномерного распределений.

Задания 1.1

import numpy as np import matplotlib.pyplot as plt def f(x): return (x - np.sqrt(2)) ** 3 def df(x): # Производная функции return 3 * (x - np.sqrt(2)) ** 2 def newton_method(z, dz, x0, epsilon, max_iter=1000): x = x0 for i in range(max_iter): fx = z(x) if abs(fx) < epsilon: return x, i + 1 # Возвращаем корень и количество итераций dfx = dz(x) if dfx == 0: raise ValueError("Производная равна нулю. Метод не сходится.") x = x - fx / dfx raise ValueError(f"Метод не сошелся за {max_iter} итераций.") # Параметры a, b = 1.0, 2.0 # Интервал, содержащий корень √2 ≈ 1.4142 epsilons = [0.01, 0.0001, 0.000001] initial_guess = (a + b) / 2 # Начальное приближение - середина интервала # Вычисление корней с разной точностью results = [] for eps in epsilons: root, iterations = newton_method(f, df, initial_guess, eps) results.append((eps, root, iterations)) # Вывод результатов print("Результаты метода Ньютона:") for eps, root, iterations in results: print(f"Точность ε = {eps}:") print(f" Корень: {root:.8f}") print(f" Итераций: {iterations}") print(f" Проверка f(root) = {f(root):.3e}\n") # Визуализация x_vals = np.linspace(a, b, 400) y_vals = f(x_vals) plt.figure(figsize=(10, 6)) plt.plot(x_vals, y_vals, label='f(x) = $(x - \sqrt{2})^3$') plt.axhline(0, color='black', linewidth=0.5) plt.scatter([r[1] for r in results], [0]*len(results), color='red', label='Найденные корни', zorder=5) plt.title('График функции и найденные корни методом Ньютона') plt.xlabel('x') plt.ylabel('f(x)') plt.grid(True, alpha=0.3) plt.legend() plt.show()

1. Импорт библиотек

import numpy as np

import matplotlib.pyplot as plt

  • numpy (обычно импортируется как np) — библиотека для численных вычислений (работа с массивами, математические функции).

  • matplotlib.pyplot (обычно импортируется как plt) — библиотека для визуализации данных (построение графиков).

2. Определение функции и её производной

def f(x):

return (x - np.sqrt(2)) ** 3

def df(x): # Производная функции

return 3 * (x - np.sqrt(2)) ** 2

  • f(x) — заданная функция f(x)=(x−2)3f(x)=(x−2​)3, корень которой нужно найти (x=2x=2​).

  • df(x) — аналитически вычисленная производная функции: f′(x)=3(x−2)2f′(x)=3(x−2​)2.

3. Реализация метода Ньютона

def newton_method(z, dz, x0, epsilon, max_iter=1000):

x = x0

for i in range(max_iter):

fx = z(x)

if abs(fx) < epsilon:

return x, i + 1 # Возвращаем корень и количество итераций

dfx = dz(x)

if dfx == 0:

raise ValueError("Производная равна нулю. Метод не сходится.")

x = x - fx / dfx

raise ValueError(f"Метод не сошелся за {max_iter} итераций.")

  • newton_method(z, dz, x0, epsilon, max_iter) — функция, реализующая метод Ньютона.

    • z — функция, корень которой ищем.

    • dz — производная функции z.

    • x0 — начальное приближение корня.

    • epsilon — требуемая точность (критерий остановки: ∣f(x)∣<ϵ∣f(x)∣<ϵ).

    • max_iter — максимальное число итераций (защита от бесконечного цикла).

  • Алгоритм метода Ньютона:

  1. Вычисляем значение функции f(x)f(x) и проверяем, достигнута ли требуемая точность.

  2. Вычисляем производную f′(x)f′(x).

  3. Обновляем приближение корня по формуле:

xnew=x−f(x)f′(x)xnew​=xf′(x)f(x)​

  1. Если производная близка к нулю (f′(x)=0f′(x)=0), метод не сходится (возникает ошибка).

  2. Если за max_iter итераций корень не найден, выводится ошибка.

4. Параметры задачи

a, b = 1.0, 2.0 # Интервал, содержащий корень √2 ≈ 1.4142

epsilons = [0.01, 0.0001, 0.000001]

initial_guess = (a + b) / 2 # Начальное приближение - середина интервала

  • a, b — интервал [1.0,2.0][1.0,2.0], содержащий корень 2≈1.41422​≈1.4142.

  • epsilons — список точностей, для которых будет выполняться поиск корня.

  • initial_guess — начальное приближение (середина интервала).

5. Вычисление корней для разных точностей

results = []

for eps in epsilons:

root, iterations = newton_method(f, df, initial_guess, eps)

results.append((eps, root, iterations))

  • Для каждой точности из списка epsilons вызывается метод Ньютона.

  • Результаты сохраняются в список results в виде кортежей: (точность, найденный корень, число итераций).

6. Вывод результатов

print("Результаты метода Ньютона:")

for eps, root, iterations in results:

print(f"Точность ε = {eps}:")

print(f" Корень: {root:.8f}")

print(f" Итераций: {iterations}")

print(f" Проверка f(root) = {f(root):.3e}\n")

Выводятся:

  • Точность (ϵϵ).

  • Найденный корень (с 8 знаками после запятой).

  • Количество итераций.

  • Значение функции в найденном корне (проверка, что f(x)≈0f(x)≈0).

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