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

7. Визуализация

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()

  • x_vals — массив значений xx на интервале [a,b][a,b].

  • y_vals — значения функции f(x)f(x) в этих точках.

  • График включает:

    • Кривую функции f(x)f(x).

    • Горизонтальную линию y=0y=0 (ось абсцисс).

    • Точки найденных корней (красные маркеры).

    • Легенду, заголовок, подписи осей и сетку.

Итоговый вывод работы программы

Пример вывода:

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

Точность ε = 0.01:

Корень: 1.41421356

Итераций: 3

Проверка f(root) = 0.000e+00

Точность ε = 0.0001:

Корень: 1.41421356

Итераций: 4

Проверка f(root) = 0.000e+00

Точность ε = 1e-06:

Корень: 1.41421356

Итераций: 5

Проверка f(root) = 0.000e+00

  • Метод Ньютона быстро сходится к корню 2≈1.414213562​≈1.41421356 за 3–5 итераций.

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

Задания 1.2

import numpy as np def func(x): return (x - np.sqrt(2)) ** 3 def numerical_derivative(f, x, h=1e-5): return (f(x + h) - f(x - h)) / (2 * h) def bisection_method(f, l, j, epsilon, max_iter=1000): calls = 0 for i in range(max_iter): c = (l + j) / 2 fc = f(c) calls += 1 if abs(fc) < epsilon: return c, calls if f(l) * fc < 0: j = c else: l = c raise ValueError(f"Метод не сошелся за {max_iter} итераций") def newton_method(f, z, epsilon, max_iter=1000): x = z calls = 0 for i in range(max_iter): fx = f(x) calls += 1 if abs(fx) < epsilon: return x, calls dfx = numerical_derivative(f, x) calls += 2 # Два дополнительных вызова в numerical_derivative if abs(dfx) < 1e-12: 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] exact_root = np.sqrt(2) # Заголовок таблицы print(f"{'Метод':<15} | {'Точность':<10} | {'Корень':<15} | {'Вызовов':<7} | {'Ошибка':<10}") print("-" * 70) # Сравнение методов для каждой точности for eps in epsilons: # Метод бисекции try: bisect_root, bisect_calls = bisection_method(func, a, b, eps) bisect_error = abs(bisect_root - exact_root) print(f"{'Бисекция':<15} | {eps:<10} | {bisect_root:.10f} | {bisect_calls:<7} | {bisect_error:.2e}") except ValueError as e: print(f"{'Бисекция':<15} | {eps:<10} | Ошибка: {str(e)}") # Метод Ньютона try: newton_root, newton_calls = newton_method(func, a, eps) newton_error = abs(newton_root - exact_root) print(f"{'Ньютон':<15} | {eps:<10} | {newton_root:.10f} | {newton_calls:<7} | {newton_error:.2e}") except ValueError as e: print(f"{'Ньютон':<15} | {eps:<10} | Ошибка: {str(e)}") print("-" * 70) # Визуализация 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()

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