2009-12-04 3 views
1

좋아, 그래서 아파치 커먼즈 수학 라이브러리를 사용하여 이중 적분을 계산하려고하는데 음의 무한대 (약 1)에서부터 계산할 시간이 오래 걸린다. Java에서 이러한 작업을 수행하는 다른 방법이 있습니까? 아니면 "빨리"(내가 죽기 전에 언젠가 결과를 실제로 볼 수 있음을 의미한다) 나는 틀린 일을하고 있습니까?자바의 수치 계산

편집 : 답변 해 주셔서 감사합니다. 가우스 접합부의 내가 그것을 계산하기 위해 노력했습니다에 관해서는 : alt text

그래서 우리는 논쟁이 개 역 표준 정규 누적 분포 함수로 소요 표준 이변 량 정규 누적 분포 함수를하고 난 (그 계산에 정수가 필요합니다 표준 정규 누적 분포에 대한 Apache Commons Math 함수가 있지만 inverse와 bivariate 버전을 찾지 못했습니다.)

EDIT2 : 내 친구가 한 번 말했듯이 나는 등 확률

+2

예, 무한대로 계산하는 데 약간의 시간이 걸리는 경향이 있습니다. – ChssPly76

+0

다른 방식으로 문제를 조사해 보셨습니까? 1에서 적분을 시작하고 음의 무한대로 가면서, 용어가 작은 델타보다 더 많이 기여하지 않을 때 멈추는 것과 같습니다. – jabbie

+0

Wolfram Alpha에서 함수를 던지려고 시도 했습니까 (가능한 경우)? –

답변

2

을 위해 그것을 포기하지 않을 -수렴. 즉, 적분은 수렴 하는가? 그렇다면 어떤 가치에 수렴 하는가? 수렴을 보장하는 적분 값이 있지만 그 값이 정확히 결정할 수는 없습니다 (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); 

결국, 적분 수렴 경우, 당신은 경계가 더 의미있는 정보를 생산하지 않습니다 확대한다는 점에서 중요한 물건을 충분히 얻을 것이다.

지혜로운 말 : 정수가 수렴하지 않으면 이런 종류의 일은 폭발적으로 나빠질 수 있습니다. 이 경우 두 가지 상황 중 하나가 발생할 수 있습니다. 종료 조건이 충족되지 않고 무한 루프에 빠지거나 적분 값이 무한대로 진동하여 종료 조건이 잘못 충족 될 수 있습니다. 잘못된 결과).

첫 번째를 방지하려면 가장 좋은 방법은 반환하기 전에 걸릴 최대 단계 수를 두는 것입니다. 이렇게하면 잠재적으로 발생할 수있는 무한 루프가 중지되어야합니다.

두 번째를 피하려면, 그것이 일어나지 않거나 필수 요소가 수렴되어야한다는 것을 (3 개의 미적분학을위한 건배?

정식으로 질문에 답하려면 아니요, Java에서 계산을 수행하는 다른 방법은 없습니다. 사실, 언어로 알고리즘을 사용하는 보장 된 방법이 없습니다. 수학은 우리가 원하는 방식대로 작동하지 않습니다. 그러나 실제적으로 실용적인 통합의 많은 부분 (비록 전부는 아니지만!)은 수렴합니다. 그 경험은 약 20 회 정도만 반복하면 합당한 정확도를 얻을 수 있으며, 아파치는 어리석게 오래 걸리지 않고 신속하게 처리 할 수 ​​있어야합니다.

1
여기 http://www.iro.umontreal.ca/~simardr/ssj/ 아주 좋은 라이브러리 필요한 모든 것을 발견 "아 예 자바의 아름다움은, 상관없이 당신이 원하는 무엇을, 누군가가 이미 완료 없다"

한계 중 하나가 무한대 인 수치 적분의 결과는 무한대가 될 수있는 좋은 기회입니다. 그리고 증명할 수있는 무한한 시간이 걸릴 것입니다.)

따라서 계산할 수있는 동일한 수식 (실제 수치 사용)을 찾거나 합리적인 큰 음수 값으로 하한을 바꾸고보세요. 적분에 대한 좋은 추정. 융합과 가치의 :

아파치 코 몬즈 수학은 유한 한 시간에 무한의 경계를 가지는 적분에 대한 수치 적분을 할 수 있다면, 그들은 무한 적분 두 가지 문제가 있습니다 무료 ;-)

2

f (x) over-infinity를 1로 통합한다고 가정하고 x = 2 - 1/(1-t)를 대입하고 0 .. 1의 범위를 계산하십시오. substition, 나는 약간 녹슬고 너무 늦었 어.

+0

함수에 따라 변환이 도움이 될 수 있습니다. – duffymo

0

아마도 알고리즘입니다.

심슨의 규칙처럼 순진한 뭔가를하는 경우 매우 오랜 시간이 걸릴 수 있습니다.

가우스 또는 로그 구적법을 사용하는 경우 행운을 누릴 수 있습니다.

통합하려는 기능은 무엇이며 사용중인 알고리즘은 무엇입니까?