35 lines
716 B
Python
35 lines
716 B
Python
|
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, 6.2, 6.4, max_iter=1000))
|