问题描述:利用python实现开根号操作
1.调用库的方法
import math
res = math.sqrt(x)
或者一个python特性的方法
res = x ** 0.5
2.二分法实现
二分法实现要主要x的范围,对应的二分范围也不同:
时,二分的范围应该是,这个可以求导得到
时,范围应该是
二分法应该给定一个精度,每次二分的结果平方和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)=0,有
对于f(x),导数为2x,求得:
每次按照上面的公式更新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))