- •1. Импорт библиотек
- •2. Определение функции и её производной
- •3. Реализация метода Ньютона
- •4. Параметры задачи
- •5. Вычисление корней для разных точностей
- •6. Вывод результатов
- •7. Визуализация
- •1. Импорт библиотек
- •2. Определение функции и численной производной
- •3. Метод бисекции
- •4. Метод Ньютона (касательных)
- •5. Параметры задачи
- •6. Сравнение методов
- •7. Визуализация
7. Визуализация
import matplotlib.pyplot as plt
x_vals = np.linspace(a, b, 400)
y_vals = func(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.axvline(exact_root, color='green', linestyle='--', label='Точный корень')
plt.title('График функции и расположение корня')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()
Строит график функции f(x)f(x).
Вертикальная линия — точное значение корня (22).
Горизонтальная линия — ось y=0y=0.
Ключевые выводы
Метод бисекции:
Гарантированно сходится.
Требует больше итераций, чем метод Ньютона.
Не использует производную.
Метод Ньютона:
Сходится быстрее (меньше итераций).
Требует вычисления производной (численно или аналитически).
Может не сойтись при плохом начальном приближении.
Результаты:
Для ϵ=0.000001ϵ=0.000001 оба метода находят корень с ошибкой ≈10−7≈10−7.
Метод Ньютона требует меньше вызовов функции для высокой точности.
Пример вывода:
Метод | Точность | Корень | Вызовов | Ошибка
----------------------------------------------------------------------
Бисекция | 0.01 | 1.4140625000 | 10 | 1.51e-04
Ньютон | 0.01 | 1.4142135624 | 9 | 0.00e+00
----------------------------------------------------------------------
Бисекция | 0.0001 | 1.4142011719 | 14 | 1.24e-05
Ньютон | 0.0001 | 1.4142135624 | 15 | 0.00e+00
----------------------------------------------------------------------
Бисекция | 1e-06 | 1.4142131805 | 21 | 3.82e-07
Ньютон | 1e-06 | 1.4142135624 | 21 | 0.00e+00
----------------------------------------------------------------------
Задания 2.1
import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm, gaussian_kde # Параметры эксперимента N = 100000 # Количество экспериментов n_vars = 6 # Количество случайных величин # 1. Генерация случайных величин (нормальное распределение) # Можно изменить на другие распределения (uniform, exponential и т.д.) mu, sigma = 0, 1 # Параметры нормального распределения xi = np.random.normal(mu, sigma, (N, n_vars)) # 2. Вычисление суммы случайных величин eta = np.sum(xi, axis=1) # 3. Гистограмма и оценка плотности plt.figure(figsize=(12, 6)) # Гистограмма plt.subplot(1, 2, 1) counts, bins, _ = plt.hist(eta, bins=50, density=True, alpha=0.6, color='g') plt.title('Гистограмма распределения η') plt.xlabel('Значение η') plt.ylabel('Плотность вероятности') # Ядерная оценка плотности plt.subplot(1, 2, 2) kde = gaussian_kde(eta) x_grid = np.linspace(eta.min(), eta.max(), 1000) plt.plot(x_grid, kde(x_grid), 'r-', linewidth=2) plt.title('Ядерная оценка плотности') plt.xlabel('Значение η') plt.ylabel('Плотность вероятности') plt.tight_layout() plt.show() # 4. Теоретическое распределение (ЦПТ) if n_vars >= 30: # Центральная предельная теорема theo_mu = n_vars * mu theo_sigma = np.sqrt(n_vars * sigma**2) x = np.linspace(theo_mu - 4*theo_sigma, theo_mu + 4*theo_sigma, 1000) plt.plot(x, norm.pdf(x, theo_mu, theo_sigma), 'b--', label='Теоретическое N(0,6)') plt.legend() # 5. Статистические характеристики print(f"Среднее значение: {np.mean(eta):.4f}") print(f"Дисперсия: {np.var(eta):.4f}") print(f"Стандартное отклонение: {np.std(eta):.4f}") print(f"Минимум: {np.min(eta):.4f}") print(f"Максимум: {np.max(eta):.4f}") # 6. Проверка нормальности (QQ-plot) from scipy.stats import probplot plt.figure(figsize=(8, 6)) probplot(eta, plot=plt) plt.title('QQ-plot для проверки нормальности') plt.show()
1. Импорт библиотек
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, gaussian_kde
numpy - для численных операций и работы с массивами
matplotlib.pyplot - для визуализации данных
scipy.stats - для статистических функций и анализа распределений
2. Параметры эксперимента
N = 100000 # Количество экспериментов
n_vars = 6 # Количество случайных величин в сумме
mu, sigma = 0, 1 # Параметры нормального распределения
Генерируем 100000 экспериментов по 6 случайных величин в каждом
Величины распределены по нормальному закону N(0,1)
3. Генерация данных
xi = np.random.normal(mu, sigma, (N, n_vars))
eta = np.sum(xi, axis=1)
xi - матрица размером 100000×6 нормальных случайных величин
eta - вектор сумм этих величин по строкам (100000 значений)
4. Визуализация распределения
Гистограмма:
plt.hist(eta, bins=50, density=True, alpha=0.6, color='g')
Строит гистограмму с 50 интервалами
density=True нормирует площадь под гистограммой к 1
Ядерная оценка плотности (KDE):
kde = gaussian_kde(eta)
plt.plot(x_grid, kde(x_grid), 'r-')
Сглаживает гистограмму, давая непрерывную оценку плотности
Использует гауссово ядро для сглаживания
5. Теоретическое распределение (ЦПТ)
theo_mu = n_vars * mu
theo_sigma = np.sqrt(n_vars * sigma**2)
По центральной предельной теореме:
Среднее суммы = сумме средних (0)
Дисперсия суммы = сумме дисперсий (6)
Стандартное отклонение = √6 ≈ 2.449
6. Статистические характеристики
Вычисляются базовые статистики:
Среднее (должно быть около 0)
Дисперсия (должна быть около 6)
Минимум/максимум для оценки размаха
7. Проверка нормальности (QQ-plot)
from scipy.stats import probplot
probplot(eta, plot=plt)
Сравнивает квантили распределения с квантилями нормального
Если точки лежат на прямой - распределение нормальное
Ключевые моменты:
Демонстрируется работа ЦПТ - сумма всего 6 величин уже близка к нормальному распределению
Сравниваются три подхода:
Эмпирическая гистограмма
Непараметрическая оценка плотности (KDE)
Теоретическая нормальная кривая
Проверяется нормальность распределения суммы
Программа позволяет исследовать, как ведет себя сумма случайных величин при разных N и n_vars, что важно для понимания статистических закономерностей.
Пример вывода покажет:
Гистограмму и гладкую оценку плотности
Основные статистические характеристики
QQ-plot, подтверждающий нормальность распределения суммы
Для n_vars=6 распределение суммы уже очень близко к N(0,√6)
Заключение
В ходе выполнения лабораторной работы я освоил численные методы для решения двух типов задач:
Поиск корней функций (метод Ньютона и бисекции)
Анализ распределения случайных величин (сумма независимых нормальных величин)
Что было особенно интересно:
Метод Ньютона оказался быстрее, но иногда капризным — если производная близка к нулю, он может не сойтись.
Метод бисекции работает медленнее, но зато гарантированно находит корень, если он есть в заданном интервале.
Сумма случайных величин уже при n = 6 дает распределение, близкое к нормальному — это удивительно, ведь исходные величины могли бы вести себя хаотично, но нет, статистика работает!
Что было сложным:
Подбор начального приближения для метода Ньютона (если взять точку далеко от корня, метод может "улететь").
Понимание, почему KDE (ядерная оценка плотности) дает более гладкий график, чем гистограмма.
Где это можно применить:
В инженерии (расчеты в физике, механике).
В анализе данных (предсказание рисков, обработка сигналов).
В машинном обучении (оптимизация моделей).
Вывод:
Работа помогла не только разобраться в теории, но и научиться применять методы на практике с помощью Python. Теперь я лучше понимаю, как: ✔ Искать корни уравнений разными способами. ✔ Анализировать распределения случайных величин. ✔ Визуализировать результаты для наглядности.
