- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathbisection_2.py
63 lines (53 loc) · 1.38 KB
/
bisection_2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""
Given a function on floating number f(x) and two floating numbers `a` and `b` such that
f(a) * f(b) < 0 and f(x) is continuous in [a, b].
Here f(x) represents algebraic or transcendental equation.
Find root of function in interval [a, b] (Or find a value of x such that f(x) is 0)
https://en.wikipedia.org/wiki/Bisection_method
"""
defequation(x: float) ->float:
"""
>>> equation(5)
-15
>>> equation(0)
10
>>> equation(-5)
-15
>>> equation(0.1)
9.99
>>> equation(-0.1)
9.99
"""
return10-x*x
defbisection(a: float, b: float) ->float:
"""
>>> bisection(-2, 5)
3.1611328125
>>> bisection(0, 6)
3.158203125
>>> bisection(2, 3)
Traceback (most recent call last):
...
ValueError: Wrong space!
"""
# Bolzano theory in order to find if there is a root between a and b
ifequation(a) *equation(b) >=0:
raiseValueError("Wrong space!")
c=a
while (b-a) >=0.01:
# Find middle point
c= (a+b) /2
# Check if middle point is root
ifequation(c) ==0.0:
break
# Decide the side to repeat the steps
ifequation(c) *equation(a) <0:
b=c
else:
a=c
returnc
if__name__=="__main__":
importdoctest
doctest.testmod()
print(bisection(-2, 5))
print(bisection(0, 6))