1. 问题
求取根号5,并且满足精度小于10的负6次方。
2. 方法
记 f ( x ) = x 2 − 5 f(x) = x^2-5 f(x)=x2−5; 问题转换成:求取方程 等于0 的根。
方法一:二分法
不断维护
l
e
f
t
,
r
i
g
h
t
left, right
left,right ,使得两者相乘小于0。
方法二:迭代法
根据泰勒展开:
如果使用牛顿法,有以上的公式。
然后不断迭代。
3. 实现
迭代法:
acc = 1e-5
x_k = 2.5
x_kp1 = x_k - (x_k**2-5)/(2.0*x_k)
count = 1
while abs(x_kp1-x_k)>acc:
x_k = x_kp1
x_kp1 = x_k - (x_k**2-5)/(2.0*x_k)
count += 1
print(x_kp1)
print(round(x_kp1,5))#2.23607
print("count", count)#4
二分法:
# 二分法
left = 2.0
right = 3.0
res = (left**2 -5)*(right**2-5)
count = 0
while abs(left-right)>acc:
mid = (left+right)/2
if (left**2 -5)*(mid**2-5)<0:
right=mid
else:
left = mid
print(left)
count += 1
print(round(left,5))#2.23606
print(round(right,5))#2.23607
print("count", count)#17
迭代法是比二分法更快的,因为迭代法用到了一阶信息,沿着切线方向进行找解。
参考: