1 import math
2 from fractions import Fraction
3
4 def findk():#预估需要迭代的次数
5 m1=math.log(b-a,math.e)#ln(b-a)
6 m2=math.log(eps,math.e)#ln(eps)
7 m3=math.log(2,math.e)#ln2
8 global k
9 k=math.ceil((m1-m2)/m3)#(ln(b-a)-ln(eps))/ln(2)
10 print("迭代需%d次,迭代精度为%f" %(k,eps))
11
12 def f(x):
13 return 63*math.pow(x,5)-70*math.pow(x,3)+15*x #待迭代函数f(x)
14
15 def BisectionMethod():
16 global eps
17 eps=0.5*math.pow(10,-5)#精度设置
18 global a
19 global b
20 n=0.1 #查找间隔为1
21 a=-1;b=a+n;#通过设置a设置查找区间
22 flag=0#解的个数
23 maxlen=10#ab查找的最大区间
24 while(a<(maxlen+2)):#a在查找最大区间内
25 while(f(a)*f(b)>0):
26 a=a+n#不满足条件就累加
27 b=b+n
28 if(a>maxlen and flag==0):#没有解的情况
29 print("a在%d以内找不到解" %maxlen)
30 exit()#退出程序
31 if(f(a)*f(b)<0):#满足条件
32 flag=flag+1#解的个数加一
33 print("找到的第%d个解" %flag)
34 print("a=%f,b=%f使得f(a)*f(b)<0" %(a,b))
35 findk()#预估需要迭代的次数
36 x=(a+b)/2#第一次二分
37 print("第1次迭代,x的值为%f,其函数值为%f" %( x , f(x)))
38 for k1 in range(k-1):#进行迭代
39 print("第%d次迭代:" %(k1+1),end=" ")
40 if f(x)*f(b)<0:
41 a=x
42 else:
43 b=x
44 x=(a+b)/2
45 print("第1次迭代,x的值为%f,其函数值为%f" %( x , f(x)))
46 print("经历了%d次迭代,得到解为%.19f,函数值为%.19f"%(k,x,f(x)))
47 a=a+n#上一次迭代完成跳过上一解
48 b=a+n
49 print("\n")
50
51
52 if __name__ == "__main__":
53 BisectionMethod()#执行二分算法