求算术平方根的实现方法

一个比较适合warm up的问题

二分法实现

sqrt的实现有两种思路,第一种是使用二分法,类似心算,即取输入的一半,若平方后大于输入,则再取一半,若平方小于输入,则取上次和当前估计的平均,如此逼近,但是要注意0-1区间,需改变求值与左右界的更新方式。

epsilon = 1e-9
def sqrt_Bisection(y):
    if y < 0.0:
        raise ValueError("input is not non-negative")
    if y == 0.0 or y == 1.0:
        return y
    if y < 1:
        left = y
        right = 2 * y
        mid = (left + right) / 2
        res = mid ** 2 - y
        while abs(res) > epsilon:
            if res < 0:
                left = mid
                right = 2 * mid
            elif res > 0:
                right = mid
            mid = (left + right) / 2
            res = mid ** 2 - y
        return mid
    if y > 1:
        left = 0
        right = y
        mid = (left + right) / 2
        res = mid ** 2 - y
        while abs(res) > epsilon:
            if res < 0:
                left = mid
            elif res > 0:
                right = mid
            mid = (left + right) / 2
            res = mid ** 2 - y
        return mid

数值优化思路

这可视为最优估计问题,
y=f(P) y=f(P) y=f(P)
求给定观测y下参数P的最优估计,
f(P)=P2 f(P)=P^2 f(P)=P2
此问题,高斯牛顿法与梯度下降法得出同样的形式,
ϵ=f(P)−yΔ=−J−1ϵJ=2PP=P+Δ \epsilon=f(P)-y \\ \Delta = -J^{-1}\epsilon \\ J = 2P \\ P = P+\Delta ϵ=f(P)yΔ=J1ϵJ=2PP=P+Δ

epsilon = 1e-9
def sqrt_Gradient(y):
    if y < 0:
        raise ValueError("input is not non-negative")
    if y == 0.0 or y == 1.0:
        return y
    x = y / 2
    # $$/delta = -inv(J)/epsilon$$
    delta = (y - x ** 2) / (2 * x)
    while abs(y - x ** 2) > epsilon:
        x += delta
        delta = -(x ** 2 - y) / (2 * x)
    return x
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值