- •1. Импорт библиотек
- •2. Определение функции и её производной
- •3. Реализация метода Ньютона
- •4. Параметры задачи
- •5. Вычисление корней для разных точностей
- •6. Вывод результатов
- •7. Визуализация
- •1. Импорт библиотек
- •2. Определение функции и численной производной
- •3. Метод бисекции
- •4. Метод Ньютона (касательных)
- •5. Параметры задачи
- •6. Сравнение методов
- •7. Визуализация
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()
