2013-10-09 99 views
0

目前我正在爲牛頓方法創建(嘗試)一個程序,並假設它允許您猜測初始根並給出根。但我無法弄清楚如何把 X1 = X-F(X0)/ F(X0)還需要一個循環 這裏是我的代碼目前:牛頓方法Java

import java.util.Scanner; 

public class NewtonsMethod { 

    public static void main(String[] args) { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Please enter your guess for the root:"); 
     double x = keyboard.nextDouble(); 
     double guessRootAnswer =Math.pow(6*x,4)-Math.pow(13*x,3)-Math.pow(18*x,2)+7*x+6; 
      for(x=x-f(x)/f(x)); 

     System.out.println("Your answer is:" + guessRootAnswer); 

    } 
} 
+0

那麼它需要一個函數來猜測根,你在那裏會得到F(X)?也許問用戶?也許你已經擁有它,只是想讓用戶猜測根?另外牛頓函數是一種迭代方法,你的x1(might)可以靠近,但是你什麼時候才能知道你已經找到根? – arynaq

+0

是的,我只是想讓用戶猜根。 – user2809115

回答

3

你說錯了如何牛頓法作品:

正確公式爲:

X n + 1個 < = X ñ -f(X ñ)/ F「(X ñ

請注意,第二個函數是第一個函數的一階導數。
一階導數看起來如何取決於函數的確切性質。

如果您知道f(x)的外觀,當您編寫程序時,您還可以填寫一階導數的代碼。如果你必須在運行時弄清楚它,它看起來更像是一個巨大的任務。

從下面的代碼:http://www.ugrad.math.ubc.ca/Flat/newton-code.html
演示概念:

class Newton { 

    //our functio f(x) 
    static double f(double x) { 
     return Math.sin(x); 
    } 

    //f'(x) /*first derivative*/ 
    static double fprime(double x) { 
     return Math.cos(x); 
    } 

    public static void main(String argv[]) { 

     double tolerance = .000000001; // Stop if you're close enough 
     int max_count = 200; // Maximum number of Newton's method iterations 

/* x is our current guess. If no command line guess is given, 
    we take 0 as our starting point. */ 

     double x = 0; 

     if(argv.length==1) { 
      x= Double.valueOf(argv[0]).doubleValue(); 
     } 

     for(int count=1; 
      //Carry on till we're close, or we've run it 200 times. 
      (Math.abs(f(x)) > tolerance) && (count < max_count); 
      count ++) { 

      x= x - f(x)/fprime(x); //Newtons method. 
      System.out.println("Step: "+count+" x:"+x+" Value:"+f(x)); 
     }  
     //OK, done let's report on the outcomes.  
     if(Math.abs(f(x)) <= tolerance) { 
      System.out.println("Zero found at x="+x); 
     } else { 
      System.out.println("Failed to find a zero"); 
     } 
    } 
}