Метод Ньютона Java

В настоящее время я создаю (пытаюсь) программу для метода Ньютона, и предполагается, что она позволит вам угадать начальный корень и дать вам корни. Но я не могу понять, как поставить x1=x0-f(x0)/f(x0) также нужен цикл Вот мой код в настоящее время:

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);

    }
}

person user2809115    schedule 09.10.2013    source источник
comment
Нужна функция, чтобы угадать корень, откуда взять f(x)? Может у пользователя спросить? Может быть, он у вас уже есть и вы просто хотите, чтобы пользователь угадал в корне? Также функция Ньютона - это итеративный метод, ваш x1 (мощь) становится ближе, но когда вы узнаете, что нашли корень?   -  person arynaq    schedule 10.10.2013
comment
Да, я просто хочу, чтобы пользователь угадал в корне.   -  person user2809115    schedule 10.10.2013


Ответы (1)


Вы неверно указали, как работает метод Ньютона:

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

xn+1 ‹= xn-f(xn)/f '(xn >)

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

Если вы знаете, как выглядит 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");
        }
    }   
}
person Johan    schedule 09.10.2013