Загрузка данных


import math

EPS = 1e-15
N_MAX = 10**6

def f(x):
    # TODO: замените на вашу функцию
    return x**3 - x - 2

def df(x):
    # TODO: замените на производную вашей функции
    return 3*x**2 - 1

def bisection(a, b, eps=EPS, n_max=N_MAX):
    fa = f(a)
    fb = f(b)

    if fa * fb > 0:
        raise ValueError("На отрезке [a, b] нет гарантированного изменения знака.")

    x_prev = None
    for n in range(1, n_max + 1):
        x = (a + b) / 2.0
        fx = f(x)

        if x_prev is not None and abs(fx - f(x_prev)) < eps:
            return x, n

        if abs(fx) < eps:
            return x, n

        if fa * fx < 0:
            b = x
            fb = fx
        else:
            a = x
            fa = fx

        x_prev = x

    return x, n_max

def newton(a, b, eps=EPS, n_max=N_MAX):
    x = (a + b) / 2.0

    for n in range(1, n_max + 1):
        fx = f(x)
        dfx = df(x)

        if abs(fx) < eps:
            return x, n

        if dfx == 0:
            raise ZeroDivisionError("Производная равна нулю, метод Ньютона невозможен.")

        x_new = x - fx / dfx

        if abs(f(x_new) - fx) < eps:
            return x_new, n

        x = x_new

    return x, n_max

if __name__ == "__main__":
    a = float(input("Введите a: "))
    b = float(input("Введите b: "))

    try:
        root_bis, iter_bis = bisection(a, b)
        print(f"Метод бисекции: x = {root_bis:.17f}, итераций = {iter_bis}")

        root_new, iter_new = newton(a, b)
        print(f"Метод касательных: x = {root_new:.17f}, итераций = {iter_new}")

    except Exception as e:
        print("Ошибка:", e)