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

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.

Ключевые выводы

  1. Метод бисекции:

    • Гарантированно сходится.

    • Требует больше итераций, чем метод Ньютона.

    • Не использует производную.

  2. Метод Ньютона:

    • Сходится быстрее (меньше итераций).

    • Требует вычисления производной (численно или аналитически).

    • Может не сойтись при плохом начальном приближении.

  3. Результаты:

    • Для ϵ=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)

  • Сравнивает квантили распределения с квантилями нормального

  • Если точки лежат на прямой - распределение нормальное

Ключевые моменты:

  1. Демонстрируется работа ЦПТ - сумма всего 6 величин уже близка к нормальному распределению

  2. Сравниваются три подхода:

    • Эмпирическая гистограмма

    • Непараметрическая оценка плотности (KDE)

    • Теоретическая нормальная кривая

  3. Проверяется нормальность распределения суммы

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

Пример вывода покажет:

  • Гистограмму и гладкую оценку плотности

  • Основные статистические характеристики

  • QQ-plot, подтверждающий нормальность распределения суммы

  • Для n_vars=6 распределение суммы уже очень близко к N(0,√6)

Заключение

В ходе выполнения лабораторной работы я освоил численные методы для решения двух типов задач:

  1. Поиск корней функций (метод Ньютона и бисекции)

  2. Анализ распределения случайных величин (сумма независимых нормальных величин)

Что было особенно интересно:

  • Метод Ньютона оказался быстрее, но иногда капризным — если производная близка к нулю, он может не сойтись.

  • Метод бисекции работает медленнее, но зато гарантированно находит корень, если он есть в заданном интервале.

  • Сумма случайных величин уже при n = 6 дает распределение, близкое к нормальному — это удивительно, ведь исходные величины могли бы вести себя хаотично, но нет, статистика работает!

Что было сложным:

  • Подбор начального приближения для метода Ньютона (если взять точку далеко от корня, метод может "улететь").

  • Понимание, почему KDE (ядерная оценка плотности) дает более гладкий график, чем гистограмма.

Где это можно применить:

  • В инженерии (расчеты в физике, механике).

  • В анализе данных (предсказание рисков, обработка сигналов).

  • В машинном обучении (оптимизация моделей).

Вывод:

Работа помогла не только разобраться в теории, но и научиться применять методы на практике с помощью Python. Теперь я лучше понимаю, как: ✔ Искать корни уравнений разными способами. ✔ Анализировать распределения случайных величин. ✔ Визуализировать результаты для наглядности.

23

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