/
dichotomy.py
66 lines (55 loc) · 1.51 KB
/
dichotomy.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
64
65
66
import segmentation
import polinom
import math
EPSILON = segmentation.EPSILON
def f(x):
return segmentation.f(x)
def binsearch(l, r):
global dihLog
sgn = f(l)
if sgn==0:
dihLog.append([l,r,l,0]);
return l
sgn = sgn/abs(sgn)
while(r-l>EPSILON):
x = l + (r-l)/2
vv = f(x)
v = vv/sgn
if v!=0: v = v/abs(v)
dihLog.append([l,r,x,vv,v]);
if v>0:
l = x
else:
r = x
return l + (r-l)/2
def dichotomy(polignom, a, b):
global dihLog
dihLog = []
points = segmentation.segmentationPoli(polignom,a,b);
roots = [];
for i in range(len(points)-1):
x, y = points[i],points[i+1]
dihLog.append([]);
p = binsearch(x,y)
if len(roots)==0:
roots.append(p)
elif abs(roots[-1]-p)>=EPSILON:
roots.append(p)
return roots
def printDihLog():
global dihLog
if len(dihLog)==0:
print("dihLog is empty")
return
i = 0
for l in dihLog:
if len(l)==5:
i += 1
print("{0:>2} | ".format(i)+"{0[0]: .10f} | {0[1]: .10f} | {0[2]: .10f} | {0[4]: 3n} | {0[3]: .10f}".format(l))
else:
i = 0
print("\nIt | {0:^13} | {1:^13} | {2:^13} | {4:^3} | {3:^16}".format("L","R","Xn","f(Xn)","L/R"))
return
if __name__ == "__main__":
print(dichotomy(polinom.formPolinom([1.0, -1.0, 2.0, math.pi, math.e]), -4.23423425, 3.265621616))
printDihLog()