2013-10-09 5 views
0

В настоящее время я создаю (пытается) программу для метода Ньютона и, предположим, позволяет угадать исходный корень и дать вам корни. Но я не могу понять, как поставить x1 = x0-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 (х)? Может быть, спросите пользователя? Может быть, у вас есть это уже и просто хотите, чтобы пользователь догадался о корне? Также функция newtons - это итеративный метод, ваш x1 (возможно) приближается, но когда вы узнаете, что нашли корень? – arynaq

+0

Да, я просто хочу, чтобы пользователь догадался о корне. – user2809115

ответ

3

Вы искажены, как ньютоновской метод работы :

правильная формула:

х п + 1 < = х п -f (х п)/Р «(х п)

Обратите внимание, что вторая функция является производной первого порядка первой.
Как выглядит производная первого порядка, зависит от точной природы функции.

Если вы знаете, что выглядит 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"); 
     } 
    } 
}