牛顿迭代法求开方
-
牛顿迭代法
作用: 求f(x) = 0 的解
方法:假设任意一点 x0, 求切线与x轴交点坐标x1, 再求切线与x轴交点坐标x2,一直重复,直到f(xn) 与0的差距在一个极小的范围内 -
牛顿迭代法为什么收敛
这里的f(x) = x^2 - a^2
如果当前点是x,那么下一个点就是 x2 = (x^2 -a^2)/2x
1) 假设解为a, 如果x>a, 则 x-x2 = (x + a^2/x)/2 , 因为a>0, 所以x必然大于x2
2) 假设x<a, 从图上容易得出,此时f(x)<0, 下一个点也就是x2会大于a, 然后就会进入上边的1)开始不断逼近解。 -
我们来看看收敛的充分条件:
若 二阶可导,那么在待求的零点 周围存在一个区域,只要起始点 位于这个邻近区域内,那么牛顿-拉弗森方法必定收敛。
也就是说,在这个区域内,用切线代替曲线这个直觉是合理的。
但是,因为我们不知道根点到底在哪里,所以起始点 选择就不一定在这个区域内,那么这个直觉就不可靠了。还有很多找不到解的情况,比如离解越来越远或者驻点,具体参考原文:https://blog.csdn.net/ccnt_2012/article/details/81837154
-
实现代码
# 牛顿迭代求开方: def extract(x): print('#=======%s========' % str(x)) y = 1.0 while(abs(x-y**2) > 0.00001): y = (y+x/y)/2 print(y) extract(0.01) extract(16) extract(256) #=======0.01======== 0.505 0.2624009900990099 0.15025530119986813 0.10840434673026925 0.10032578510960605 0.10000052895642693 #=======16======== 8.5 5.1911764705882355 4.136664722546242 4.002257524798522 4.000000636692939 #=======256======== 128.5 65.24610894941634 34.58485728656987 20.993470372021676 16.59386909154118 16.010626831390027 16.00000352670594 16.00000000000039
很多个n的平方分之一 求和
1+1/2²+1/3²+···+1/n²= 2
H (调和数)
n
1+1/2²+1/3²+···+1/n²+···=π^2/6
证明:可以参见黎曼zeta函数.
一个有意思的推导是欧拉给出的
考虑Sin(x)/x
泰勒展开后有 sin(x)/x = 1 - x^2/3!+ .
另外,sin(x)/x 在x = n Pi 的时候有零点.我们假设可以用这些零点来表示sin(x)/x 那么有
sin(x)/x = (1-x/Pi)(1+x/Pi)(1-x/(2Pi))(1+x/(2Pi)...
(成立因为左边有右边的零点必须相同)
也就等于 (1-x2/Pi2)(1-x2/(4Pi2)).
展开上面的连积,然后取x^2项目的系数有
-(1/Pi2+1/(4Pi2)+1/(9Pi^2)+.) = - 1/Pi^2 (1+1/4+1/9+...1/n^2)
这个既然是x^2项目的系数,自然应该等于 1/3!= 1/6.
所以得到
1+1/4+1/9+.= Pi^2/6.
或者:
函数f(x)=-x,-π