前段时间去面试,被问到“如何在不调用库函数的前提下最快速地求出根号2,结果保留6位有效数字?”
方法一:简单暴力的逼近法
def approach(a):
x = 0.0
count = 0
while 1:
count += 1
x += 0.00001
if x*x >= a:
break
print x
print count
思路就是:x先取0,步长取0.00001,使得x^2逐步逼近2;
使用此方法求得的结果为1.41422,但是此方法循环竟然执行了141422次,实在是不快;
回去之后想了下又在网上查了下,了解到下面的方法二
方法二:牛顿迭代法
(1)先设f(x)=x^2 - a;
(2)求f(x)的一阶导数,即斜率;
(3)得到xn+1与xn的迭代关系式
化简上述斜率公式,即得到:
xn+1=1/2*(xn+a/xn);
(4)代码实现
def sqrt(a):
x=0.0
y=a/2
count = 0
while(x!=y):
print 'x=',x,'y=',y
count += 1
x=y
y=(x+a/x)/2
print count
return x
此方法计算出的结果为:1.41421356237,且只迭代了6次;
总结:
牛顿迭代法的本质是求出xn与xn+1的迭代关系式,此方法可以推广至求任意次方根,例如求立方根:xn+1=1/3*(2*xn+a/xn^2);
def sqrt_3(a):
x=0.0
y=a/2
count = 0
while(x!=y):
print 'x=',x,'y=',y
count += 1
x=y
y=(2*x+a/(x*x))/3
print count
return x
参考资料:http://wenku.baidu.com/link?url=pVNsUdORMzEUz6VqcXo1JLpHi1SN7by7DhkCwvmufIdRsuvVL_lWRYAwLWjXdINg_ZOMqP8KTYOYlneT18cRv8Lv5IOccauJV74D8m_gQSm