2016-02-28 112 views
1
public class Sqrt 
    { 
    public static void main(String[] args) 
     { 
      double EPS = 1E-15; 
      double c = Double.parseDouble(args[0]); 
      double t = c; 
       while (Math.abs(t - c/t) > t * EPS) 
         { t = (c/t + t)/2.0; } 
       System.out.println(t); 
      } 
     } 

以上是我在Java中發現的牛頓拉夫森的一個版本。 我想它可以工作,但我很難把它的實際工作包裹起來。 { t = (c/t + t)/2.0; }真的讓我困惑。Newton Raphson版本(牛頓法)

我熟悉的x_n+1 = x_n - f(x_n)/ f'(x_n)但沒有一個在上面的代碼中實現..

+0

你的函數f(x_n)是什麼? –

+0

我認爲這是'(c + t^2)/(2.0 * t)'的重寫,如果有幫助的話 –

回答

4

要能夠運用Newton-Raphson方法,你必須找到一個函數,其中零是你正在尋找的解決方案。在平方根的情況是這樣的:

f(x) = x^2 - c 

現在,如果你找到一個f(x) = 0x已經找到℃的平方根。

f'(x) = 2*x 

所以

x - f(x)/f'(x) = x - ((x^2 - c)/(2*x)) = 1/2 * (x + c/x) 

這是你的(c/t + t)/2.0來源。

+0

非常感謝! – stratofortress

1

t = sqrt(c)

=> t^2 = c 
=> 2t^2 - t^2 = c 
=> 2t^2 = t^2 + c 

讓通過2t分兩邊我們得到

=> t = (t^2 + c)/2t 
=> t = (t + c/t)/2 
=> t = (c/t + t)/2 
+0

這隻表明解決方案是遞歸方程的一個固定點 – leonbloy