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