- •1. Импорт библиотек
- •2. Определение функции и её производной
- •3. Реализация метода Ньютона
- •4. Параметры задачи
- •5. Вычисление корней для разных точностей
- •6. Вывод результатов
- •7. Визуализация
- •1. Импорт библиотек
- •2. Определение функции и численной производной
- •3. Метод бисекции
- •4. Метод Ньютона (касательных)
- •5. Параметры задачи
- •6. Сравнение методов
- •7. Визуализация
1. Импорт библиотек
import numpy as np
numpy — библиотека для численных вычислений (работа с массивами, математические функции).
2. Определение функции и численной производной
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)
func(x) — заданная функция f(x)=(x−2)3f(x)=(x−2)3, корень которой нужно найти (x=2x=2).
numerical_derivative(f, x, h) — вычисляет производную функции f в точке x численно (метод центральных разностей с шагом h).
3. Метод бисекции
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} итераций")
Алгоритм:
Делит интервал [l, j] пополам.
Проверяет знак функции в середине интервала (c).
Выбирает подынтервал, где функция меняет знак (условие f(l)⋅f(c)<0f(l)⋅f(c)<0).
Повторяет до достижения точности epsilon или превышения max_iter.
calls — счетчик вызовов функции f(x).
4. Метод Ньютона (касательных)
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} итераций")
Алгоритм:
Использует итерационную формулу: xnew=x−f(x)f′(x)xnew=x−f′(x)f(x).
Производная вычисляется численно (numerical_derivative).
Критерий остановки: ∣f(x)∣<ϵ∣f(x)∣<ϵ.
calls — учитывает все вызовы f(x) (включая вычисление производной).
5. Параметры задачи
a, b = 1.0, 2.0 # Интервал, содержащий корень √2 ≈ 1.4142
epsilons = [0.01, 0.0001, 0.000001]
exact_root = np.sqrt(2) # Точное значение корня
Интервал [a, b] выбран так, чтобы функция имела один корень (22).
epsilons — список точностей для сравнения методов.
6. Сравнение методов
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)
Выводит таблицу с результатами для каждой точности:
Найденный корень.
Количество вызовов функции.
Ошибка (разница с точным значением 22).
