在区间上 [ a , b ] [a, b] [a,b]使用二分法求近似根,n次操作后的区间长度为 b − a 2 n frac{b-a}{2^n} 2nb−a,选择其中点作为近似根,则误差小于区间长度的一半。即: e r r < = b − a 2 n + 1 err<=frac{b-a}{2^{n+1}} err<=2n+1b−a,且函数的计算次数为 n + 2 n+2 n+2。
tips:要求根精确度为小数点后p位,即: e r r < = 0.5 × 1 0 − p err<=0.5times10^{-p} err<=0.5×10−p
例子:x 3 = 9 x^3 = 9 x3=9,精确到小数点后6位。
python程序"""程序还可以优化,执行过程重复步骤多导致程序冗余。
"""
class BT:
def __init__(self, a, b, q):
self.a = a
self.b = b
self.q = q
self.p = None
def func(self, x):
"""定义方程"""
f = x**3 - 9
return f
def bisect_methed(self):
"""传入参数为[a, b]:区间,p:精确度。
"""
if (self.b - self.a)/2 <= 0.5 * 10**(-self.q):
self.p = (self.a+self.b)/2
else:
if self.func(self.a) * self.func(self.b) > 0:
raise ValueError('区间错误')
elif self.func(self.a) * self.func(self.b) == 0:
if self.func(self.a) == 0:
return self.a
else:
return self.b
else:
c = (self.a + self.b)/2
if self.func(self.a) * self.func(c) < 0:
self.b = c
self.bisect_methed()
else:
self.a = c
self.bisect_methed()
return self.p
if __name__ == '__main__':
demo = BT(2, 3, 6)
print(demo.bisect_methed())



