python 实现开方

问题描述:利用python实现开根号操作

1.调用库的方法

import math
res = math.sqrt(x)

或者一个python特性的方法

res = x ** 0.5

2.二分法实现

二分法实现要主要x的范围,对应的二分范围也不同:

0\leqslant x\leqslant 1时,二分的范围应该是\left [ 0,x+1/4 \right ],这个可以求导得到

x> 1时,范围应该是\left [ 1, x \right /2]

二分法应该给定一个精度,每次二分的结果平方和x比较,如果小于精度,则返回

import math
def sqrt_binary(num, p):
    """
    num为待开方数字
    p为给定的精度,例如1e-5
    """
    if num < 0:
        return None
    elif num > 1:
        l = 1
        r = num/2
    else:
        l = 0
        r = num + 0.25
    while l < r:
        mid = (l + r) / 2
        curnum = mid ** 2
        if abs(curnum - num) <= p:
            return mid
        elif curnum < num:
            l = mid
        else:
            r = mid

num = 100
print(sqrt_binary(num, 1e-06), math.sqrt(num))

3.牛顿法

问题可以等效与求解f(x)=x^{^{2}}-num的零点

泰勒一阶展开:f(x)=f(x_{0})+f^{'}(x_{0})(x-x_{0})

令f(x)=0,有x=x_{0}-f(x_{0})/f^{'}(x_{0})

对于f(x),导数为2x,求得:x=\frac{1}{2}(x_{0} + \frac{n}{x_{0}})

每次按照上面的公式更新x即可

def sqrt_newton(num, p):
    """
    num为待开方数字
    p为给定的精度,例如1e-5
    """
    if num == 0:
        return 0
    x = num / 2
    while abs(x ** 2 - num) > p:
        x = (x + num / x) / 2
    return x

num = 0.16
p = 1e-5
print(sqrt_newton(num, p))

 

  • 24
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值