【计算方法】【数值解】二分法python实现···


 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()#执行二分算法