欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python二分法求平方根 - 求任意方根

程序员文章站 2022-06-17 19:45:52
...

Python二分法求平方根 - 求任意方根
如上图,开方函数 y = x 1 n y = x^\frac{1}{n} y=xn1 是幂函数,且在定义域内单调递增,当 n 为偶数时,定义域在 [0,+ ∞ \infty );当 n 为奇数时,定义域在(- ∞ \infty ,+ ∞ \infty )

二分法原理:

以二分法求 2 \sqrt{2} 2 为例,1的平方等于1,2的平方等于4,4 > 2,因为函数单调递增,所以 2 \sqrt{2} 2 的值肯定是在(1,2)之间,然后取中间数1.5,而1.5的平方等于2.25,2.25 > 2,进一步缩小范围, 2 \sqrt{2} 2 的值肯定是在(1,1.5)之间,再取中间数1.25,1.25的平方等于1.5625,1.5625 < 2,则 2 \sqrt{2} 2 的值肯定是在(1.25,1.5)之间,依次类推就可以一步步的逼近真实值。

""" num:被开方的数  lower:区间更小的值, 这里初始值设置为0
    upper:区间更大的值   error: 允许的误差值   power: 开几次方根 """
def root(num, upper, lower=0, error=0.01, power=2):
    # 先用两个区间边界判断是否符合,省得递归,比方说求根号1的值,直接就可以得到1
    if abs(upper ** power - num) <= error:
        return upper
    if abs(lower ** power - num) <= error:
        return upper

    result = (lower + upper) / 2  # 取中间值
    if abs(result ** power - num) <= error:  # 如果中间值的次方在误差内,就可以返回结果了
        return result

    if result ** power > num:  # 如果中间值的次方不在误差内,根据结果缩小区间,递归
        return root(num, result, lower)
    else:
        return root(num, upper, result)


if __name__ == '__main__':
    for i in range(1, 11):
        # 这里暂时不考虑负数
        # 分数的开方的要比它本身小,使得结果不在区间中,没办法用二分法
        # 所以当i为分数时,取更大的值为1,当i不是分数时,取本身的值就可以了,因为本身的值的次方一定是大于等于本身的
        upper = max(i, 1)
        print('root(%d) = %.5f' % (i, root(i, upper)))

输出:

root(1) = 1.00000
root(2) = 1.41406
root(3) = 1.73438
root(4) = 2.00000
root(5) = 2.23633
root(6) = 2.44922
root(7) = 2.64551
root(8) = 2.82812
root(9) = 3.00146
root(10) = 3.16162