38 lines
852 B
Python
38 lines
852 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, 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))
|