Вычисление многочлена с помощью алгоритма Хорнера и вычисление шагов (Java)

Мне нужна помощь в моем коде Java. Я пытаюсь вычислить размер каждого шага полинома: double s = (b-a)/nsteps; Входными данными для создаваемого полинома являются степень, коэффициент, начальное значение x, конечное значение x и количество шагов. Всякий раз, когда я пытаюсь запустить тест, мой вывод 0 для x и y, и я не уверен, что мне не хватает в моем коде. Вот мой тестовый запуск того, как это должно работать, но мой результат для x и y равен 0:

Enter degree:2
Enter coefficient 2:1
Enter coefficient 1:0
Enter coefficient 0:0
f(x) = 1.0x^2 + .0x^1 + 0.0
Enter initial x:0
Enter final x:10
Enter number of steps:20
x = 0.0; f(x) = 0.0
x = 0.5; f(x) = 0.25
x = 1.0; f(x) = 1.0
x = 1.5; f(x) = 2.25
x = 2.0; f(x) = 4.0
x = 2.5; f(x) = 6.25
x = 3.0; f(x) = 9.0
x = 3.5; f(x) = 12.25
x = 4.0; f(x) = 16.0
x = 4.5; f(x) = 20.25
x = 5.0; f(x) = 25.0
x = 5.5; f(x) = 30.25
x = 6.0; f(x) = 36.0
x = 6.5; f(x) = 42.25
x = 7.0; f(x) = 49.0
x = 7.5; f(x) = 56.25
x = 8.0; f(x) = 64.0
x = 8.5; f(x) = 72.25
x = 9.0; f(x) = 81.0
x = 9.5; f(x) = 90.25
x = 10.0; f(x) = 100.0 

и вот мой java-код:

import java.util.*;

public class PolyAreaTwo{
   //method evalpoly Horner's rule
        public static double evalpoly(double[] c, double x) {
                    int n = c.length - 1;
                    double y = c[n];
                    for (int i = n - 1; i >= 0; i--) {
                        y = c[i] + (x * y);
                    }
                    return y;
        }

    //main method
        public static void main(String[] args){
        Scanner in = new Scanner(System.in);
                 int n;
                 double a, b;
                 int nsteps;


                //input degree
                 System.out.print("Enter degree of polynomial:");
                 n = in.nextInt();

                //input n+1 coefficients
                 double[] c = new double[n+1];

                    for (int i=n; i>=0; i--) {
                            System.out.print("Enter coefficent " + i + ":");
                            c[i] = in.nextDouble();
                 }
                    for (double d : c) { 
                    System.out.print(" x ^ " + d); 

                    }

                //input starting value x = a
                 System.out.println("Enter starting x: ");
                 a = in.nextDouble();

                //input stopping value x = b
                 System.out.print("Enter stop x: ");
                 b = in.nextDouble();

                //input number of steps between starting x and stopping x
                 System.out.print("Enter steps: ");
                 nsteps = in.nextInt();

                //calculate size of each step
                 double s = (b-a)/nsteps;
                 int steps = 0;


             //loop to call the evalpoly method         
                for (double x = a; x <= b; x += s) {
                   double y = evalpoly(c, x);

                   System.out.println("x ="+x+ " , y ="+y);


                } 

            }

}

person huehuegg    schedule 05.03.2013    source источник
comment
while (steps < nsteps) Зачем нужен заведомо бесконечный цикл?   -  person default locale    schedule 05.03.2013


Ответы (1)


После удаления ненужного внешнего цикла while; рассмотрите возможность использования рассчитанного размера шага в цикле for: x += s.

Кроме того, ваша реализация метода Хорнера в evalpoly() может быть реализована более эффективным, как показано здесь и здесь, инициализируя y коэффициентом высшего порядка.

public static double evalpoly(double[] c, double x) {
    int n = c.length - 1;
    double y = c[n];
    for (int i = n - 1; i >= 0; i--) {
        y = c[i] + (x * y);
    }
    return y;
}
person trashgod    schedule 05.03.2013
comment
Спасибо, это сработало! :D Другой вопрос: как я могу отобразить f(x) после ввода окончательного коэффициента. Войдет ли это в мой цикл for (int i=n; i›=0; i--)? - person huehuegg; 06.03.2013
comment
Нет; после этого цикла выполните for (double d : c) { print("x ^ " + d); ... } или подобное. В дальнейшем вы можете принять этот ответ, щелкнув пустую галочку. отметьте слева. - person trashgod; 06.03.2013
comment
Я получаю эти результаты с помощью for (double d:c) {System.out.print(x ^ + d); ) loop Введите степень полинома: 2 Введите коэффициент 2:1 Введите коэффициент 1:0 Введите коэффициент 0:0 x ^ 0,0 x ^ 0,0 x ^ 1,0 Введите начальный x: - person huehuegg; 06.03.2013
comment
Похоже, вы вложили циклы; они должны быть последовательными. Если это не поможет, отредактируйте свой вопрос, чтобы показать текущий код. - person trashgod; 06.03.2013
comment
Нет, на самом деле я поставил цикл for, который вы предложили, после цикла для моих коэффициентов. См. редактирование. - person huehuegg; 06.03.2013
comment
Ах, вам может понадобиться обычный цикл for, чтобы иметь индекс, например. print(d + " * x ^ " + i); Ты этого добиваешься? - person trashgod; 06.03.2013
comment
Извините, я в замешательстве. Но да, в основном я хочу распечатать f (x) после ввода степени и коэффициента. Я не уверен, что нужно поместить в мой цикл ‹for›, чтобы сделать это. - person huehuegg; 06.03.2013
comment
Поскольку ваш массив находится в порядке убывания, вам понадобится дополнительная переменная для вычисления индекса, например. показатель степени для c[0] начинается с n; для c[1] это n - 1 и так далее до нуля. - person trashgod; 06.03.2013
comment
c[n] - это, согласно оценке в коде Хорнера, коэффициент x ^ n. Выведите c[0], затем, если c.length›1, выведите " + "+c[1]+" * X", затем, если c.length›2, зациклите k=2 до c.length-1 и выведите " + "+c[k]+" * X^"+k. С дополнительными усилиями можно было бы изменить знаки «+» для отрицательных коэффициентов. - person Lutz Lehmann; 12.12.2013