import math
from fractions import Fraction
def findk():#预估需要迭代的次数
m1=math.log(b-a,math.e)#ln(b-a)
m2=math.log(eps,math.e)#ln(eps)
m3=math.log(2,math.e)#ln2
global k
k=math.ceil((m1-m2)/m3)#(ln(b-a)-ln(eps))/ln(2)
print("迭代需%d次,迭代精度为%f" %(k,eps))
def f(x):
return 63*math.pow(x,5)-70*math.pow(x,3)+15*x #待迭代函数f(x)
def BisectionMethod():
global eps
eps=0.5*math.pow(10,-5)#精度设置
global a
global b
n=0.1 #查找间隔为1
a=-1;b=a+n;#通过设置a设置查找区间
flag=0#解的个数
maxlen=10#ab查找的最大区间
while(a<(maxlen+2)):#a在查找最大区间内
while(f(a)*f(b)>0):
a=a+n#不满足条件就累加
b=b+n
if(a>maxlen and flag==0):#没有解的情况
print("a在%d以内找不到解" %maxlen)
exit()#退出程序
if(f(a)*f(b)<0):#满足条件
flag=flag+1#解的个数加一
print("找到的第%d个解" %flag)
print("a=%f,b=%f使得f(a)*f(b)<0" %(a,b))
findk()#预估需要迭代的次数
x=(a+b)/2#第一次二分
print("第1次迭代,x的值为%f,其函数值为%f" %( x , f(x)))
for k1 in range(k-1):#进行迭代
print("第%d次迭代:" %(k1+1),end=" ")
if f(x)*f(b)<0:
a=x
else:
b=x
x=(a+b)/2
print("第1次迭代,x的值为%f,其函数值为%f" %( x , f(x)))
print("经历了%d次迭代,得到解为%.19f,函数值为%.19f"%(k,x,f(x)))
a=a+n#上一次迭代完成跳过上一解
b=a+n
print("\n")
if __name__ == "__main__":
BisectionMethod()#执行二分算法
【计算方法】【数值解】二分法python实现
于 2022-05-02 09:48:18 首次发布