SICP习题1.45 为什么做average damp的次数需要大于等于log2n

简单粗暴的标题,这个推导是我看了知乎的两篇文章之后,结合自己的理解写的,多画了几个图像,力求通俗易懂

知乎的参考文章如下

https://zhuanlan.zhihu.com/p/25601871

https://www.zhihu.com/question/28838814/answer/42283723

最初我们需要求解的fixed-point函数如下

y=\frac{x}{y^{n-1}}

经过m次average damp后,fixed-point函数变为

y=\frac{1}{2^m}(\frac{x}{y{n-1}}+(2^m-1)y)

每次fixed-point迭代计算,第k次迭代可以写成如下形式,直到y_{k+1}\approx y_k迭代结束

y_{k+1}=\frac{1}{2^m}(\frac{x}{y_k{n-1}}+(2^m-1)y_k)

y_{k+1}作为自变量,变换一下上面的公式,可以得到函数,这条直线的斜率为2^my_k^{n-1}

g(y_{k+1})=2^my_k^{n-1}y-x-(2^m-1)y_k^n

每次迭代求 y_{k+1}就等同于求函数g(y_{k+1})的零点

设函数f(y)=y^n-x,该函数零点就是我们所要求的平方根,去掉g(y_{k+1})的下标k+1,得到g(y)

为了更好地理解,以一个例子代入,求解\sqrt[2]{16},初始值为1

1、不做average damp

两个函数是这样

\left\{ \begin{aligned} f(y)&=y^2-16\\ g(y)&=y_ky-16 \end{aligned} \right.

第一次迭代,y_1=1,得出y_2=16

第二次迭代, y_2=16,得出y_3=1

第三次迭代, y_3=1,得出y_3=16

陷入了死循环,非常夭寿

2、做一次average damp

两个函数是这样

\left\{ \begin{aligned} f(y)&=y^2-16\\ g(y)&=2y_ky-16-y_k^2 \end{aligned} \right.

第一次迭代,y_1=1,得出y_2=8.5

第二次迭代, y_2=8.5,得出y_3=5.19

第三次迭代, y_3=5.19,得出y_3=4.14

每次迭代的直线如下,可以看到直线的零点和曲线的零点越来越接近

对比一下上面的两个图的区别,不做average damp的时候,直线是在曲线零点的两边晃来晃去导致震荡不收敛,做了average damp后,直线一直在曲线的一侧,慢慢贴近

如何保证直线不在曲线零点两边晃来晃去呢

看一下知乎大神给出的这个图,蓝色曲线表示f(y),其他直线表示g(y),红点表示(y_k,y_k^n-x)这个点,曲线和直线是必然通过这个点的,代入函数验证一下就可以知道

现在看绿线,绿线的零点就是下一次的y_{k+1},和这次的y_k分布在了曲线零点的两端,这两个y值我用绿点标出来了,由上述分析可以知道,每次迭代y都分布在曲线零点两端就会引起震荡,所以绿线这种情况是不能收敛的,红线和黄线的零点一直分布在曲线零点的一侧,可以收敛

 

很直观可以看出来,只要每次在曲线直线交点处,直线的斜率大于等于曲线斜率即可,上面已经说了交点就是(y_k,y_k^n-x)

曲线斜率为ny^{n-1},在交点处,斜率为ny_k^{n-1}

直线斜率为2^my_k^{n-1}

因此满足2^m\geqslant n,即m\geqslant log_2{n}

猜你喜欢

转载自blog.csdn.net/jiangxuege/article/details/84024062