区间⼆分法(BisectionMethod)迭代求根的python程序
迭代法的作⽤
许多复杂的求解问题,都可以转换成⽅程f(x)=0的求解问题。这⼀系列的解叫做⽅程的根。对于⾮线性⽅程的求解,在⾃变量范围内往往有多个解,我们将此变化区域分为多个⼩的⼦区间,对每个区间进⾏分别求解。我们在求解过程中,选取⼀个近似值或者近似区间,然后运⽤迭代⽅法逐步逼近真实解。
⽅程求根的常⽤迭代法有:、、、。
⼆分法
求实根最简单有效的⽅法:⼆分法。易于在计算机上实现,且对于函数f(x)的性质要求不⾼,仅仅要求它在有根区间上连续,且区间端点的函数值异号即可。它的缺点是不能求偶数重根,也不能求复根,收敛速度与以1/2为公⽐的等⽐数列相同,不算太快,因此⼀般在求⽅程近似根时,不太单独使⽤,常⽤它来为其他⽅法求⽅程近似根提供好的初值区间(重要:初值区间的确定直接决定求解的速度)。
⼆分法基本思想
把函数f(x)的零点所在的区间[a,b](满⾜f(a)×f(b)<0)“⼀分为⼆”,得到[a,m]和[m,b]。根据“f(a)●f
(m)<0”是否成⽴,取出零点所在的区间[a,m]或[m,b],仍记为[a,b]。所对得的区间[a,b]重复上述步骤,直到包含零点的区间[a,b]“⾜够⼩”,则
[a,b]内的数可以作为⽅程的近似解。
⼆分法计算步骤
详细步骤:
例题
求⽅程式:x3 - 0.165*x2 + 3.993*10**(-4) = 0在(0,0.11)的根
⽜⼑⼩试
代码:
return f
for i in range(100):#进⾏100次迭代,迭代次数⾃⼰定
xm =(xl + xu)/2
if f(xm)==0:
break
else:
pass
if f(xl)* f(xm)<0:
xl =xl
xu = xm
elif f(xl)* f(xm)>0:
xl = xm
xu = xu
else:
break
print(xl , xu)
print('⽅程的根为:',(xl + xu)/2)
结果:
0.062377581513749480.06237758151374953
⽅程的根为:0.0623775815137495
约定⼀个误差,当误差⼩于某个数值的时候,迭代停⽌代码如下:
return f
xm_list =[]
m =0
while True:
xm =(xl + xu)/2
xm_list.append(xm)
m +=1
if f(xm)==0:
break
else:
pass
if f(xl)* f(xm)<0:
xl =xl
xu = xm
elif f(xl)* f(xm)>0:
xl = xm
xu = xu
else:
break
if len(xm_list)>1:
error =abs((xm_list[-1]- xm_list[-2])/ xm_list[-1])
if error <10**(-6):
print(f'迭代第{m}次后,误差⼩于10^(-6),误差为{error}')
break
python代码转换else:
pass
print(xl , xu)
print(f'得到⽅程的根为:{(xl + xu)/2}')
结果:
迭代第21次后,误差⼩于10^(-6),误差为8.408809405129639e-07 0.0623775434494018640.062377595901489266
得到⽅程的根为:0.06237756967544557
迭代⾄电脑默认误差为0
return f
m =0
while True:
xm =(xl + xu)/2
m +=1
if f(xm)==0:
break
else:
pass
if f(xl)* f(xm)<0:
xl =xl
xu = xm
elif f(xl)* f(xm)>0:
xl = xm
xu = xu
else:
break
print(xl , xu)
print(f'迭代第{m}次后,误差为0,得到⽅程的根为:{(xl + xu)/2}')结果:
0.062377581513749480.06237758151374953
迭代第52次后,误差为0,得到⽅程的根为:0.0623775815137495
画迭代图
代码:
import matplotlib.pyplot as plt
xl =0
xu =0.11
def f(x):
f = x**3-0.165*x**2+3.993*10**(-4)#需要求根的函数return f
xm_list =[]
x_values =[]
y_values =[]
m =0
while True:
xm =(xl + xu)/2
xm_list.append(xm)
m +=1
if f(xm)==0:
break
else:
pass
if f(xl)* f(xm)<0:
xl =xl
xu = xm
elif f(xl)* f(xm)>0:
xl = xm
xu = xu
else:
break
if len(xm_list)>1:
error =abs((xm_list[-1]- xm_list[-2])/ xm_list[-1])
x_values.append(m)
y_values.append(error)
if error ==0:
break
else:
pass
print(f'xl={xl},xu={xu}')
print(f'迭代第{m}次后,误差为0,得到⽅程的根为:{(xl + xu)/2}') #设置绘图风格
plt.style.use('ggplot')
#处理中⽂乱码
#坐标轴负号的处理
#横坐标是迭代次数
#纵坐标是误差值
plt.plot(x_values,
y_values,
color ='steelblue',# 折线颜⾊
marker ='o',# 折线图中添加圆点
markersize =3,# 点的⼤⼩
)
# 修改x轴和y轴标签
plt.xlabel('迭代次数')
plt.ylabel('误差值')
# 显⽰图形
plt.show()
结果:
xl=0.06237758151374948,xu=0.06237758151374953
迭代第52次后,误差为0,得到⽅程的根为:0.0623775815137495

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。