Thực hiện chính xác kép nhanh và chính xác của chức năng gamma chưa hoàn thành


10

Trạng thái của nghệ thuật thực hiện các chức năng đặc biệt chính xác kép là gì? Tôi cần tích phân sau:

Fm(t)= =01bạn2me-tbạn2dbạn= =γ(m+12,t)2tm+12
chom= =0,1,2,...t>0, có thể được viết dưới dạng hàm gamma chưa hoàn thành thấp hơn. Đây là triển khai Fortran và C của tôi:

https://gist.github.com/3764427

trong đó sử dụng mở rộng chuỗi, tính tổng các số hạng cho đến độ chính xác đã cho và sau đó sử dụng các quan hệ đệ quy để thu được các giá trị cho thấp hơn một cách hiệu quả m. Tôi đã kiểm tra nó tốt và tôi nhận được độ chính xác 1e-15 cho tất cả các giá trị của các tham số mà tôi cần, xem các nhận xét của phiên bản Fortran để biết chi tiết.

Có cách nào tốt hơn để thực hiện nó? Đây là một triển khai chức năng gamma trong gfortran:

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

nó đang sử dụng xấp xỉ hàm hợp lý thay vì tóm tắt một số chuỗi vô hạn mà tôi đang làm. Tôi nghĩ đó là một cách tiếp cận tốt hơn, bởi vì người ta nên có được độ chính xác đồng đều. Có một số cách kinh điển để tiếp cận những điều này, hoặc người ta phải tìm ra một thuật toán đặc biệt cho mỗi chức năng đặc biệt?

Cập nhật 1 :

Dựa trên các ý kiến, đây là việc triển khai bằng SLATEC:

https://gist.github.com/3767621

nó tái tạo các giá trị từ hàm riêng của tôi, đại khái ở mức độ chính xác 1e-15. Tuy nhiên, tôi nhận thấy một vấn đề là với t = 1e-6 và m = 50, tm+12Fm

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

Fm

Cập nhật 2 :

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


2
Tại sao mã chức năng của riêng bạn? GSL, cephes và SLATEC đều thực hiện nó.
Geoff Oxberry

Tôi đã cập nhật câu hỏi tại sao tôi không sử dụng SLATEC.
Ondřej Čertík

@ OndřejČertík Bạn đã phát hiện ra một lỗi! Nâng cao câu hỏi của bạn!
Ali

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

@ OndřejČertík OK, xin lỗi, lỗi của tôi, tôi đã không kiểm tra mã của bạn trước khi đưa ra nhận xét của mình.
Ali

Câu trả lời:


9

10-15

mmộtm+112

Đối với các đối số lớn, tôi tính toán

Fm(một)= =12γ(m+12,một)×p×p,  p= =một-12(m+12)

Thứ tự hoạt động này tránh dòng chảy sớm. Vì chúng ta chỉ cần hàm gamma chưa hoàn thành thấp hơn của các đơn đặt hàng nửa số nguyên ở đây chứ không phải là hàm gamma chưa hoàn chỉnh tổng quát thấp hơn, nên thuận lợi từ góc độ hiệu năng để tính toán

γ(m+12,một)= =Γ(m+12)-Γ(m+12,một)

Γ(m+12)Γ(m+12,một)mộtγ(m+12,một)= =Γ(m+12)

Đối với các đối số nhỏ, tôi bắt đầu mở rộng chuỗi cho hàm gamma chưa hoàn thành thấp hơn từ

A. Erdelyi, W. Magnus, F. Oberhettinger và FG Tricomi, "Chức năng siêu việt cao hơn, Tập 2". New York, NY: McGraw-Hill 1953

Fm(một)

Fm(một)= =121m+12điểm kinh nghiệm(-một)(1+Σn= =1mộtn(1+m+12)× ... ×(n+m+12))

m= =0,1,2,3F0(một)= =π4mộterf(một)erfERFerferff

m= =1,2,3một<212Fm(một)= =12một((2m-1)Fm-1(một)-điểm kinh nghiệm(-một))

mộtmmFm-1= =12m-1(2một Fm(một)+điểm kinh nghiệm(-một))


Cảm ơn @njuffa cho câu trả lời tuyệt vời. Nếu bạn tạo mã cho nguồn mở này, tôi nghĩ nó sẽ rất hữu ích với nhiều người.
Ondřej Čertík

1
Hiện tại, một triển khai CUDA của thuật toán được mô tả có sẵn để tải xuống miễn phí từ trang web của nhà phát triển NVIDIA (yêu cầu đăng ký miễn phí với tư cách là nhà phát triển CUDA, thường được phê duyệt trong vòng một ngày làm việc). Mã theo giấy phép BSD, tương thích với bất kỳ loại dự án nào.
njuffa


4

Tôi sẽ xem cuốn sách của Abramowicz & Stegun, hoặc bản sửa đổi mới hơn mà NIST đã xuất bản vài năm trước và tôi tin rằng nó có sẵn trực tuyến. Họ cũng thảo luận về các cách để thực hiện mọi thứ một cách ổn định.


Tôi đã sử dụng cái này: dlmf.nist.gov/8 , khi thực hiện nó, nhưng đó có lẽ là một tài nguyên khác. Chương 5 trong Công thức số cũng có thông tin thú vị, nhưng chỉ áp dụng cho các chức năng của một biến.
Ondřej Čertík

Tôi không nghĩ rằng bạn sẽ tìm thấy bất cứ điều gì gần đây hơn nhiều so với tài liệu tham khảo năm 2001 của họ; SLATEC sẽ cũ hơn thế.
Geoff Oxberry

1

Nó dường như không phải là hiện đại nhưng SLATEC tại Netlib cung cấp "1400 thói quen toán học và thống kê cho mục đích chung". Gamma chưa hoàn chỉnh có sẵn theo các chức năng đặc biệt ở đây .

Việc thực hiện các chức năng như vậy rất tốn thời gian và dễ bị lỗi nên tôi sẽ không tự làm trừ khi thực sự cần thiết. SLATEC đã xuất hiện khá lâu và được sử dụng rộng rãi, ít nhất là dựa trên số lượng tải xuống , vì vậy tôi hy vọng việc triển khai sẽ hoàn thiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.