quantum-dev/ps16-3.py
2024-04-09 12:50:41 -04:00

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))