From 9cda130c071d9454a78e217c9ae781044eaceb4d Mon Sep 17 00:00:00 2001 From: spamegg <4255997+spamegg1@users.noreply.github.com> Date: Sat, 1 Aug 2020 09:02:31 +0300 Subject: [PATCH] added type hints and doctests to arithmetic_analysis/intersection.py (#2242) continuing #2128 --- arithmetic_analysis/intersection.py | 33 ++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/arithmetic_analysis/intersection.py b/arithmetic_analysis/intersection.py index 8d14555b3..204dd5d8a 100644 --- a/arithmetic_analysis/intersection.py +++ b/arithmetic_analysis/intersection.py @@ -1,15 +1,38 @@ import math +from typing import Callable -def intersection(function, x0, x1): +def intersection(function: Callable[[float], float], x0: float, x1: float) -> float: """ function is the f we want to find its root x0 and x1 are two random starting points + >>> intersection(lambda x: x ** 3 - 1, -5, 5) + 0.9999999999954654 + >>> intersection(lambda x: x ** 3 - 1, 5, 5) + Traceback (most recent call last): + ... + ZeroDivisionError: float division by zero, could not find root + >>> intersection(lambda x: x ** 3 - 1, 100, 200) + 1.0000000000003888 + >>> intersection(lambda x: x ** 2 - 4 * x + 3, 0, 2) + 0.9999999998088019 + >>> intersection(lambda x: x ** 2 - 4 * x + 3, 2, 4) + 2.9999999998088023 + >>> intersection(lambda x: x ** 2 - 4 * x + 3, 4, 1000) + 3.0000000001786042 + >>> intersection(math.sin, -math.pi, math.pi) + 0.0 + >>> intersection(math.cos, -math.pi, math.pi) + Traceback (most recent call last): + ... + ZeroDivisionError: float division by zero, could not find root """ - x_n = x0 - x_n1 = x1 + x_n: float = x0 + x_n1: float = x1 while True: - x_n2 = x_n1 - ( + if x_n == x_n1 or function(x_n1) == function(x_n): + raise ZeroDivisionError("float division by zero, could not find root") + x_n2: float = x_n1 - ( function(x_n1) / ((function(x_n1) - function(x_n)) / (x_n1 - x_n)) ) if abs(x_n2 - x_n1) < 10 ** -5: @@ -18,7 +41,7 @@ def intersection(function, x0, x1): x_n1 = x_n2 -def f(x): +def f(x: float) -> float: return math.pow(x, 3) - (2 * x) - 5