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)