double findaroot(double x1, double x2){ //finds the root between two values
double gap = Math.abs(x1 - x2); //find the initial interval
while(gap > INTERVAL) { //check for precision
gap = gap/2; //halve the interval
double x3 = x1 + gap;
if (f(x3) == 0) { //check for symmetry
return x3;
} else if (Math.signum(f(x1)) == Math.signum(f(x3))){
x1 = x3; //redefine the interval
} else {
x2 = x3; //redefine the interval
}
findaroot(x1, x2); //call again
}
return (x1 + x2)/2; //return the mean
}
Я пытаюсь найти решение для f (x) = - 21x^2 + 10x-1 в интервалах (-143, 0.222222). В руководящих принципах указано, что я должен реализовать метод деления пополам, чтобы решить эту проблему. В настоящее время этот метод отлично работает для 8 из 10 тестовых случаев, которые я должен пройти, но для вышеупомянутых значений он дает ошибку «превышение по времени». Для того, чтобы приблизиться к корню, требуется 15 секунд, если заданный уровень точности не менее 0,000001 между интервалами.Как оптимизировать метод bisection для поиска полиномиальных корней в Java?
Я не уверен, как я могу сделать это более эффективным, не меняя метод. Я уже внедрил метод Хорнера для вычисления функции, потому что Math.pow(x1, x2)
занимал слишком много времени.
Не могли бы вы рассказать, в чем смысл сделать рекурсивный вызов 'findaroot (x1, x2);'? Вы не используете его результат. –
Вы оцениваете 'f (x3)' дважды. Это расточительно. – OldCurmudgeon
Я так глуп, да, вы правы, большое вам спасибо. Это первый раз, когда мы должны использовать рекурсию, и я думал, что для ее работы необходим рекурсивный вызов. – user2806648