问题描述:利用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))