算法
牛顿迭代法
利用切线逼近曲线,求曲线零点,对于曲线
y
=
f
(
x
)
y = f(x)
y=f(x),采用迭代的方法求其零点,在点
(
x
n
,
f
(
x
n
)
)
(x_n, f(x_n))
(xn,f(xn))处曲线切线方程:
y
=
f
(
x
n
)
+
f
′
(
x
n
)
(
x
−
x
n
)
y = f(x_n) + f'(x_n)(x - x_n)
y=f(xn)+f′(xn)(x−xn),其与x轴交点横坐标即为下一个
x
n
x_n
xn,得到通用迭代公式:
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)
对于求已知参数
x
x
x 的平方根,即求方程
y
2
−
x
=
0
y^2 - x = 0
y2−x=0 的解,代入即可解得:
求
x
x
x平方根的迭代公式为:
y
n
+
1
=
y
n
+
x
y
n
2
y_{n+1}=\frac{y_n+\frac{x}{y_n}} {2}
yn+1=2yn+ynx
描述如下
- 对给定正整数 x x x和允许误差 e e e,令变量 y y y取任意正整数值,如令 y = x y=x y=x;
- 如果 y 2 y^2 y2与 x x x 足够接近,即 ∣ y 2 − x ∣ < e |y^2 - x| < e ∣y2−x∣<e,计算结束并把 y y y 作为结果;
- 取 z = y + x y 2 z = \frac{y + \frac{x}{y}}{2} z=2y+yx ;
- 将 z z z 作为 y y y 的新值,回到步骤1
函数代码
def sqrt(x):
y = 1.0
while abs(y * y - x) > 1e-6:
y = (y + x/y)/2
return y
调用函数
import sys
sys.path.append(r"D:\python")
import sqrt
y = sqrt.sqrt(5)
y