#На данном этапе программа может найти только два корня уравнения, как можно сделать программу более универсальной, чтобы к примеру если было 5 корней на отрезке, программа сразу нашла их#
def tangent_method(f, a, b, eps) -> float:
roots = []
delta = 0.1 * (b - a)
timeout = 1000
iter = 0
prev_a, prev_b = None, None
df = lambda x: (f(x + eps) - f(x)) / eps
while len(roots) < 2:
x0 = a + (b - a) * random.random()
f0 = f(x0)
prev_sign = f0 / abs(f0)
while iter < timeout:
x0 -= f0 / df(x0)
f0 = f(x0)
sign = f0 / abs(f0)
iter += 1
if abs(f0) < eps:
if len(roots) == 0 or abs(x0 - roots[-1]) > delta:
roots.append(x0)
prev_a, prev_b = a, b
break
if sign != prev_sign:
prev_sign = sign
if prev_a is not None and prev_b is not None:
a, b = prev_a, prev_b
prev_a, prev_b = None, None
else:
a, b = b, x0
break
else:
break
return tuple(roots)