Есть две проблемы с бесконечными интегралами: сходимость и значение сходимости. То есть интеграл сходится? Если да, то к какому значению это сходится? Существуют интегралы, которые гарантированно сходятся, но их значение невозможно точно определить (попробуйте интеграл от 1 до бесконечности e ^ (- x ^ 2)). Если это не может быть точно возвращено, то точный ответ не возможен математически, который оставляет только приближение. Apache Commons использует несколько различных схем аппроксимации, но все они требуют использования конечных границ для корректности.
Лучший способ получить соответствующий ответ - многократно оценивать конечные интегралы с постоянно растущими границами и сравнивать результаты. В псевдокоде это будет выглядеть примерно так:
double DELTA = 10^-6//your error threshold here
double STEP_SIZE = 10.0;
double oldValue=Double.MAX_VALUE;
double newValue=oldValue;
double lowerBound=-10; //or whatever you want to start with--for (-infinity,1), I'd
//start with something like -10
double upperBound=1;
do{
oldValue = newValue;
lowerBound-= STEP_SIZE;
newValue = integrate(lowerBound,upperBound); //perform your integration methods here
}while(Math.abs(newValue-oldValue)>DELTA);
В конце концов, если интеграл сходится, то вы получите достаточно важных вещей, так как дальнейшее расширение границ не даст значимой информации.
Хотя слово для мудрых: такого рода вещи могут быть чрезвычайно плохими, если интеграл не сходится. В этом случае может возникнуть одна из двух ситуаций: либо условие завершения никогда не выполняется, и вы попадаете в бесконечный цикл, либо значение интеграла колеблется бесконечно вокруг значения, что может привести к неправильному выполнению условия завершения (давая неверные результаты).
Чтобы избежать первого, лучший способ - ввести максимальное количество шагов, которые необходимо выполнить перед возвратом - это должно остановить потенциально бесконечный цикл, который может привести к этому.
Чтобы избежать второго, надейтесь, что этого не произойдет, или докажите, что интеграл должен сходиться (три ура для Calculus 2, кто-нибудь?; -)).
Чтобы ответить на ваш вопрос формально, нет, нет других подобных способов выполнить ваши вычисления в Java. На самом деле, нет никаких гарантированных способов сделать это на любом языке, с любым алгоритмом - математика просто не работает так, как мы этого хотим. Однако на практике многие (хотя и не все!) Практических интегралов сходятся; По моему опыту, всего около ~ 20 итераций даст вам приблизительную точность, и Apache должен быть достаточно быстрым, чтобы справиться с этим, не занимая до абсурда много времени.