巴比倫算法是針對求根號m的近似值情況的,它的思想是這樣的:
設根號m=X0,則如果枚舉有答案X(X<X0),則m/X>X0,當精度要求不高的時候,我們可以看成X=m/X=X0,而如果精度要求比較高,我們只需取X和m/X的平均值作為新的枚舉答案X再進行操作,可以證明這樣會一直逼近答案,至于做幾次完全取決于精度要求。而實踐證明這樣求根號的速度極快
% 計算數字m的平方根的巴比倫算法:?
% (1)先猜一個答案guess(可以將m/2作為第一個答案);
% (2)計算r=m/guess;?
% (3)令guess=(guess+r)/2;?
% (4)如有必要返回第2步重復多次。步驟2和步驟3的重復次數越多, guess就越接近m的平方根。
—————————————————————————————————————————————————————————————————————————
然后本渣又想到能不能推廣到n次方根,和HZH大神討論無果后又問大神,大神給出了……一個解答……:
算法的正確性依賴于x=sqrt(N)為差分方程a(n+1)=(an+N/an)/2的吸引不動點吧,如果推廣到高次根可能會使耗散力增加而導致周期倍分叉而不可做吧
(PS:本渣真是數學弱爆了完全讀不懂,這里mark一下希望以后能看懂……(眾:你這渣渣一輩子都不懂……))
額用人話解釋一下:由于2次根號太特殊所以高次根號不能推廣(BY YJT大神)
?
但不久后,vfk大神有說:
如果我沒有腦殘的話……
真相是,那家伙就是牛頓迭代
f(x) = x^2 - a
f'(x) = 2x
所以式子為
x' = x - (x^2 - a) / (2x) = (x + a / x) / 2
所以說,要想拓展到m次……
f(x) = x^m - a
f'(x) = m * x^(m - 1)
所以式子為
x' = x - (x^m - a) / (m * x^(m - 1)) = x * (1 - 1 / m) + a / (m * x^(m - 1))
只要初始估計充分接近根就可以獲得很好的效果……看起來abs(f''(r) / (2 * f'(r)))不是很大的樣子
大家好我是不會證其無論取何初始值一定收斂的sb
(PS:雖然本渣看不懂但是Vfk說的大概是取適當的初始貌似可以……)