Python计算平方根
用Match包
import math
( x )
自己实现
二分法
步骤:
①low = 0;high = x;
②guess = (low + high) / 2
③如果guess² == x,则输出guess,程序结束;
④如果guess² > x,则high = guess,继续执行步骤②
⑤如果guess² < x,则low = guess,继续执行步骤②
def dichotomy_sqrt(x):
if x > 1: #在0到1之间的数,我们知道0到1之间的任何一个数平方后的结果都小于原值(0,1除外),因此如果要沿用上面的程序达不到“逼近”的作用,反而扩大了
a = 1.0
b = x
else:
a = x
b = 1.0
y = (a + x)/2
while abs(y * y - x) > 1e-6:
if y * y > x:
b = y
y = (y + a) /2
else:
a = y
y = (y + b) /2
return y
牛顿迭代法 百度百科
#牛顿迭代法
def Newton_sqrt(x,y=1):
z = x/y
if abs(z - y) < 0.000001:
return z
else:
y = (y + z)/2
return Newton_sqrt(x,y)
def sqrt1(x, y=1):
return x / y if abs(x/y - y) < 0.000001 else sqrt(x, (x/y + y)/2)
sqrt2 = lambda x, y=1:x / y if abs(x/y - y) < 0.000001 else sqrt2(x, (x/y + y)/2)
思路
牛顿迭代
仔细思考一下就能发现,我们需要解决的问题可以简单化理解。
从函数意义上理解:我们是要求函数f(x)=x²,使f(x)=num的近似解,即x²-num=0的近似解。
从几何意义上理解:我们是要求抛物线g(x)=x²-num与x轴交点(g(x)=0)最接近的点。
我们假设g(x0)=0,即x0是正解,那么我们要做的就是让近似解x不断逼近x0,这是函数导数的定义:
image.png
可以由此得到
从几何图形上看,因为导数是切线,通过不断迭代,导数与x轴的交点会不断逼近x0。
对于一般情况:
将m=2代入:
利用“将长方形变得更像正方形”的思路也可以得到求 A
的算数平方根的迭代公式