1. 程式人生 > >SICP習題1.45 為什麼做average damp的次數需要大於等於log2n

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}