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

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,开发语言)