배정도 특수 기능을 구현하는 최첨단 방법은 무엇입니까? 다음 적분이 필요합니다. 대m=0,1,2,. . . 및t>0, 이는 불완전한 감마 함수의 하에서 작성 될 수있다. 다음은 Fortran 및 C 구현입니다.
https://gist.github.com/3764427
시리즈 확장을 사용하고 주어진 정확도까지 항을 합한 다음 재귀 관계를 사용하여 더 낮은 값을 효율적으로 얻습니다 . 나는 그것을 잘 테스트했고 필요한 모든 매개 변수 값에 대해 1e-15의 정확도를 얻었습니다. 자세한 내용은 Fortran 버전의 주석을 참조하십시오.
그것을 구현하는 더 좋은 방법이 있습니까? gfortran의 감마 함수 구현은 다음과 같습니다.
https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781
내가하고있는 무한 시리즈를 합산하는 대신 합리적인 함수 근사법을 사용하고 있습니다. 나는 그것이 더 나은 접근 방법이라고 생각합니다. 왜냐하면 균일 한 정확도를 얻어야하기 때문입니다. 이러한 것들에 접근하는 정식적인 방법이 있습니까, 아니면 각 특수 기능에 대한 특수 알고리즘을 찾아야합니까?
업데이트 1 :
주석을 기반으로 SLATEC을 사용한 구현은 다음과 같습니다.
https://gist.github.com/3767621
그것은 대략 1e-15 정확도 수준에서 내 자신의 기능에서 값을 재현합니다. 그러나 t = 1e-6 및 m = 50의 경우 t m + 1 이라는 문제를 발견했습니다. 항은 1e-303과 같고 "m"이 높을수록 오답을주기 시작합니다. Fm에대해 직접 직렬 확장 / 재귀 관계를 사용하기 때문에 함수에이 문제가 없습니다. 올바른 값의 예는 다음과 같습니다.
,(1e-6)=4.97511945200351715E-003
하지만 분모가 터지기 때문에 SLATEC를 사용하여 이것을 얻을 수 없습니다. 보다시피 의 실제 값 은 훌륭하고 작습니다.
업데이트 2 :
위의 문제를 피하기 위해 함수 dgamit
(Tricomi의 불완전한 감마 함수)를 사용하면 더 이상 t에F(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2
아무런 문제가 없지만 불행히도 m ≈ 172 의 타격이 발생합니다 . 그러나 이것은 충분히 높은 수 있습니다 m 내 목적을 위해.gamma(m+0.5_dp)