from typing import Callable import numpy as np z0 = 20 def find_root(f: Callable[[float], float], left: float, right: float, tolerance: float = 1e-6, max_iter: int = 100) -> float | None: a = f(left) b = f(right) x = None for _ in range(max_iter): if abs(a - b) < tolerance: break x = left - a * (left - right) / (a - b) y = f(x) if abs(y) < tolerance: break right, b = left, a left, a = x, y return x def cot(x): return 1 / np.tan(x) def func(z: float) -> float: first = np.sqrt((z0 / z) ** 2 - 1) second = cot(z) return first + second print(find_root(func, 0.1, 3, max_iter=1000)) print(find_root(func, 3.1, 6, max_iter=1000)) print(find_root(func, 6.1, 8, max_iter=1000)) print(find_root(func, 10, 12, max_iter=1000))