Eksik gama fonksiyonunun hızlı ve doğru çift hassas uygulaması


10

Çift hassasiyetli özel fonksiyonların uygulanmasında son teknoloji nedir? Aşağıdaki integrale ihtiyacım var: içinm=0,1,2,. . . vedaha düşük eksik gama fonksiyonu açısından yazılabilent>0. İşte benim Fortran ve C uygulamam:

Fm(t)=01u2metu2du=γ(m+12,t)2tm+12
m=0,1,2,...t>0

https://gist.github.com/3764427

seri genişletmeyi kullanan, belirtilen doğruluk derecesine kadar terimleri toplar ve daha sonra düşük için değerleri etkin bir şekilde elde etmek için özyineleme ilişkilerini kullanır . İyi test ettim ve ihtiyacım olan tüm parametre değerleri için 1e-15 doğruluğu elde ediyorum, ayrıntılar için Fortran sürümünün yorumlarına bakın.m

Uygulamanın daha iyi bir yolu var mı? İşte gfortran'da bir gama fonksiyonu uygulaması:

https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781

yaptığım sonsuz dizileri toplamak yerine rasyonel fonksiyon yaklaşımı kullanıyor. Bence bu daha iyi bir yaklaşım, çünkü tek biçimli doğruluk elde edilmelidir. Bunlara yaklaşmanın kanonik bir yolu var mı, yoksa her özel fonksiyon için özel bir algoritma mı bulmak gerekiyor?

Güncelleme 1 :

Yorumlara dayanarak, SLATEC kullanan uygulama:

https://gist.github.com/3767621

kabaca 1e-15 doğruluk seviyesinde kendi fonksiyonumdan değerler üretir. Ancak, t = 1e-6 ve m = 50, t m + 1 için bir sorun fark ettim.tm+12Fm

F100(1e-6)=4.97511945200351715E-003

Fm

Güncelleme 2 :

dgamitF(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2tgamma(m+0.5_dp)m172m


2
Neden kendi fonksiyonunuzu kodluyorsunuz? GSL, cephes ve SLATEC bunların hepsini uygular.
Geoff Oxberry

SLATEC'i neden kullanmadığım sorusunu güncelledim.
Ondřej Čertík

@ OndřejČertík Görünüşe göre bir hata keşfettiniz! Sorunuz yükseldi!
Ali

γ(z,x)tm+12Fm(t)γ(z,x)Fm(t)

@ OndřejČertík Tamam, üzgünüm, hatam, yorumumu yapmadan önce kodunuzu kontrol etmedim.
Ali

Yanıtlar:


9

1015

mam+112

Büyük tartışmalar için

Fm(a)=12γ(m+12,a)×p×p,  p=a12(m+12)

Bu işlem sırası, erken taşmayı önler. Tamamen genel olarak daha düşük tamamlanmamış bir gama fonksiyonu yerine burada yarı-tamsayı sıralarının sadece daha düşük tamamlanmamış gama fonksiyonuna ihtiyacımız olduğundan, performans açısından hesaplamak avantajlıdır

γ(m+12,a)=Γ(m+12)Γ(m+12,a)

tablo değerlerini kullanarakΓ(m+12)Γ(m+12,a)aγ(m+12,a)=Γ(m+12)

Küçük argümanlar için, daha düşük eksik gama fonksiyonu için bir dizi genişleme ile başladım.

A. Erdelyi, W. Magnus, F. Oberhettinger ve FG Tricomi, "Yüksek Transandantal Fonksiyonlar, Cilt 2". New York, NY: McGraw-Hill 1953

Fm(a)

Fm(a)=121m+12exp(a)(1+n=1an(1+m+12)× ... ×(n+m+12))

m=0,1,2,3F0(a)=π4aerf(a)erfERFerferff

m=1,2,3a<212Fm(a)=12a((2m1)Fm1(a)exp(a))

ammFm1=12m1(2a Fm(a)+exp(a))


Büyük cevap için @njuffa'ya teşekkürler. Kodunuzu bu açık kaynak için yaparsanız, birçok insan için çok yararlı olacağını düşünüyorum.
Ondřej Čertík

1
Şu anda, açıklanan algoritmanın CUDA uygulaması NVIDIA'nın geliştirici web sitesinden ücretsiz olarak indirilebilir (CUDA geliştiricisi olarak ücretsiz kayıt gerektirir, genellikle bir iş günü içinde onay gerektirir). Kod, hemen hemen her türlü projeyle uyumlu olması gereken BSD lisansı altındadır.
njuffa


4

Abramowicz & Stegun'un kitabına ya da NIST'in birkaç yıl önce yayınladığı yeni revizyona bir göz atacağım ve bu çevrimiçi olduğuna inanıyorum. Ayrıca, şeyleri istikrarlı bir şekilde uygulamanın yollarını tartışırlar.


Bunu kullanıyordum: dlmf.nist.gov/8 , uygularken, ama muhtemelen başka bir kaynak. Sayısal Tarifler bölüm 5 de ilginç bilgi var, ama sadece bir değişkenin fonksiyonları için geçerlidir.
Ondřej Čertík

2001 referanslarından çok daha yeni bir şey bulacağınızı sanmıyorum; SLATEC bundan daha yaşlı olacaktır.
Geoff Oxberry

1

Olması görünmüyor state-of-the-art ama SLATEC NETLIB teklifler de "1400 genel amaçlı matematiksel ve istatistiksel rutinleri." Eksik Gamma, buradaki özel işlevler altında bulunabilir .

Bu tür fonksiyonları uygulamak zaman alıcı ve hataya yatkındır, bu yüzden kesinlikle gerekli olmadıkça kendim yapmam. SLATEC bir süredir ortalıkta ve en azından indirme sayılarına dayanarak yaygın olarak kullanılıyor , bu yüzden uygulamanın olgunlaşmasını bekliyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.