用牛顿法求算术平方根
要求
不用数学库函数sqrt()函数求一个数的平方根
解法
采用牛顿迭代法也就是牛顿法求解
通过迭代公式来求得f(x)=0的解
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n- \frac{f(x_n)} {f'(x_n)} xn+1=xn−f′(xn)f(xn)
这个公式源于泰勒展开式
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
+
1
2
f
′
′
(
x
0
)
(
x
−
x
0
)
2
+
⋯
+
1
n
!
f
n
(
x
0
)
(
x
−
x
0
)
n
f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{1}{2}f''(x_0)(x-x_0)^2+\cdots+\frac{1}{n!}f^n(x_0)(x-x_0)^n
f(x)=f(x0)+f′(x0)(x−x0)+21f′′(x0)(x−x0)2+⋯+n!1fn(x0)(x−x0)n
如果只考虑前两项的话,那么就可以得到一个近似的等式
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
f(x)=f(x_0)+f'(x_0)(x-x_0)
f(x)=f(x0)+f′(x0)(x−x0)
令f(x)=0,对x求解,就可以得到一个近似解
x
=
x
0
−
f
(
x
0
)
f
′
(
x
0
)
x=x_0-\frac{f(x_0)}{f'(x_0)}
x=x0−f′(x0)f(x0)
得到迭代公式后,就可以进行求解了
求一个数m的算术平方根,也就是对 x 2 − m = 0 x^2-m=0 x2−m=0 求解
将f(x)和f’(x)=2x代入上面的迭代公式,可以得到
x
n
+
1
=
x
n
−
x
n
2
−
m
2
x
n
=
x
n
2
−
m
2
x
n
x_{n+1}=x_n-\frac{x_n^2-m}{2x_n}=\frac{x_n}{2}-\frac{m}{2x_n}
xn+1=xn−2xnxn2−m=2xn−2xnm
python实现
def newton(m):
x0=m/2 #初始化初始点,任意点即可
x1=x0/2+m/(x0*2)
while abs(x1-x0)>1e-5: #精确到小数点后四位,近似解十分接近的时候停止迭代
x0=x1
x1 = x0 / 2 + m / (x0 * 2)
return x1
print('%.4f'%newton(2))
运行结果
1.4142