題目描述:
計算一個數(shù)字的立方根靡馁,不使用庫函數(shù)
首先最常見的方法是二分法進行求值,這里主要注意精度旨剥,還有就是二分法的求值,但是這種方法有時候不滿足題目給的時間復雜度的要求浅缸,那么需要一種新的方法來進行求值轨帜。
所以這里給出牛頓迭代法:
牛頓迭代法
這里應該大學都知道,一個函數(shù)f(x) = x^3-y 的可以在坐標系上畫出它的圖衩椒。
隨便找一個曲線上的A點(為什么隨便找蚌父,根據(jù)切線是切點附近的曲線的近似,應該在根點附近找毛萌,但是很顯然我們現(xiàn)在還不知道根點在哪里)苟弛,做一個切線,切線的根(就是和x軸的交點)與曲線的根朝聋,還有一定的距離嗡午。牛頓囤躁、拉弗森們想冀痕,沒關(guān)系,我們從這個切線的根出發(fā)狸演,做一根垂線言蛇,和曲線相交于B點,繼續(xù)重復剛才的工作:
之前說過宵距,B點比之前A點更接近曲線的根點腊尚,牛頓、拉弗森們很興奮满哪,繼續(xù)重復剛才的工作:
經(jīng)過多次迭代后會越來越接近曲線的根(下圖進行了50次迭代婿斥,哪怕經(jīng)過無數(shù)次迭代也只會更接近曲線的根,用數(shù)學術(shù)語來說就是哨鸭,迭代收斂了):
眾所周知民宿,f'(x) 是f(x)的導數(shù),也是在某點上的一個切線方程像鸡。
牛頓它們根據(jù)上面的方法活鹰,不斷的逼近根的方法,可以總結(jié)為以下的表示方法只估。
Xn+1 = Xn - f(Xn)/ f'(Xn)
從而對于求立方根的時候志群,我們可以假設
f(x) = X^3 - y
求y的立方根表示, f(x)=0的時候蛔钙,求x的值這樣的數(shù)學模型锌云。
根據(jù)上面的公式,我們可以得到
Xn+1 = Xn- (Xn^3 -y)/(3*Xn^2) = (2*Xn +y/(Xn*Xn))/3
根絕這里的公式吁脱,我們就可以寫出立方根的解法了桑涎。
#include <iostream>
using namespace std;
// 牛頓迭代法
// f(x) = X^3 - y, 當f(x) =0時,求x
// 根據(jù)牛頓迭代法子漩。Xn+1 = Xn - f(Xn)/ f'(Xn)
// 所以 xn+1 = x- (X^3 -y)/(3X^2) = X*2/3 + y/(*X^2) * 1/3
// Xn+1 = (X)/3
inline double abs(double x){return (x>0?x:-x);}
double getcudeRoot(double y) {
double x =1.0;
for (x = 1.0; abs(x*x*x -y) > 1e-6; x=(2*x+y/x/x)/3);
return x;
}
int main() {
double input;
while (cin >> input) {
printf("%.1f\n", getcudeRoot(input));
}
return 0;
}
參考:
牛頓迭代法