Làm thế nào để sử dụng chức năng polylogarithm trong c ++?


9

Có bất kỳ chỉ thị tiền xử lý nào có thể được sử dụng để sử dụng chức năng polylog không? Hoặc nó được bao gồm trong cmath? Nếu vậy, bạn gọi nó bằng Li hoặc bằng polylog?


EDIT: Những gì tôi thực sự đang cố gắng làm là đưa ra một giá trị phân tích cho tích phân không xác định của hàm

x3ex1

trong đó liên quan đến chức năng polylogarithm. Nhưng nếu bất cứ ai có đề xuất về một cách khác để tích hợp chức năng này một cách phân tích, tôi sẽ được hoan nghênh mọi ý tưởng.



Đối với mục đích tìm kiếm: chức năng được xem xét trong OP có liên quan đến các chức năng Debye . Lưu ý này có thể là một số sử dụng.
JM

Một mối quan hệ chặt chẽ khác là tích phân Fermi-Dirac không hoàn chỉnh .
hardmath

Câu trả lời:


7

Có thư viện GPL'd C, ANANT - Thuật toán trong Lý thuyết số phân tích của Linas Vepstas, bao gồm triển khai đa bội hóa của polylogarithm, xây dựng trên GMP .

Từ tệp README của nó:

Dự án này chứa các triển khai đặc biệt của các chức năng phân tích quan tâm trong lý thuyết số, bao gồm chức năng gamma, chức năng Riemann zeta, polylogarithm và chức năng đánh dấu câu hỏi Minkowski. Việc triển khai sử dụng thư viện Đa chính xác Gnu (GMP) để thực hiện tất cả các hoạt động cấp thấp. Mã ở đây được cấp phép theo các điều khoản của giấy phép Gnu GPLv3.

GSL (Thư viện khoa học GNU) dường như chỉ có chức năng Dilogarithm . Tuy nhiên, theo gợi ý từ @JM, người ta sẽ tìm thấy hàm Debye cung cấp tích phân thầm kín (tối đa bội vô hướng) được triển khai với độ chính xác kép (xem các lệnh Debye Hàm GSL 7.10 từ 1 đến 6):

Dn(x)=nxn0xtndtet1


Phần mềm tích hợp tượng trưng như Mathicala hoặc Maxima cung cấp:

0xt3dtet1=6Li4(ex)6xLi3(ex)+3x2Li2(ex)+x3log(1ex)x44π415

x>0ex>1

0xt3dtet1=6Li4(ex)6xLi3(ex)3x2Li2(ex)x3Li1(ex)+π415

[0,1]x=0x

π4/15

0t3dtet1=Γ(4)ζ(4)=6π490

Bây giờ chúng ta có thể xem lại câu hỏi tiêu đề, Làm thế nào để sử dụng chức năng polylogarithm trong c ++? Điểm đáng nói là không có triển khai chuẩn của các hàm polylogarithm cho C hoặc thậm chí C ++ . Nếu mục tiêu là để tránh bất kỳ thư viện bổ sung nào cho việc triển khai của bạn, thì điều đó khá tốt cho bạn thực hiện các thói quen của riêng mình, có lẽ dọc theo dòng được đề xuất bởi bài báo của David C. Wood mà Câu trả lời của GertVdE liên kết.

Bên cạnh các thói quen đa hướng được đề xuất trong phần đầu của Câu trả lời của tôi, còn có một thư viện toán chính xác kép (miễn phí) trưởng thành trong Cephes của Stephen L. Moshier, thực hiện cả hai phiên bản thực ( polylog) và phức tạp ( cpolylog) của các hàm đặc biệt polylogarithm. Mặc dù độ chính xác của chúng phụ thuộc một phần vào các hàm toán học tiêu chuẩn cơ bản của C, tài liệu nguồn Cephes báo cáo các thử nghiệm và sai số cực đại lý thuyết cho các đơn hàng 1 đến 4 về các giới hạn của độ chính xác kép.

Ngoài ra, bạn có thể muốn sử dụng phần mềm khác để kiểm tra trực tiếp (không tham chiếu các đa giác) các thói quen bậc hai mà bạn đã viết cho tích phân của mình. Như tôi đã phác thảo trong Câu hỏi Math.SE này, chuỗi lũy thừa tập trung ở gốc cho tích phân có độ hội tụ hạn chế, nhưng điều này có thể được giảm thiểu bằng cách sử dụng mở rộng phân đoạn tiếp tục.

Để hài lòng ngay lập tức, tôi khuyên bạn nên sử dụng các thói quen QUADPACK bậc hai (miễn phí) trong Maxima , cụ thể quad_qag. Ví dụ: tìm tích phân trên [0,5] bằng lệnh Maxima này:

(%i1) quad_qag(x^3/(%e^x - 1), x, 0, 5, 2);
(%o1) [4.899892158330582,5.4399730923588665*10^-14,21,0]

Trong số các đối số đầu vào chỉ có cuối cùng có một lời giải thích. Đối số thứ năm để quad_qagchỉ định quy tắc nào sẽ được áp dụng trong phương trình bậc hai thích ứng. Các giá trị có thể là 1 đến 6 và tăng độ tinh vi / chính xác. Dòng đầu ra đưa ra phương trình số đầu tiên, theo sau là ước tính sai số tuyệt đối của nó, số lượng các khoảng / bước được sử dụng và mã trả về (ở đây không có nghĩa là không tìm thấy lỗi hoặc điều kiện đặc biệt).


1
"Ngay cả C ++", một liên kết tốt hơn cho các chức năng đặc biệt sẽ là en.cppreference.com/w/cpp/numeric/special_math , mặc dù chức năng này vẫn chưa có. Điều đáng ngạc nhiên là nó thậm chí không có trong thư viện Boost.Math boost.org/doc/libs/1_68_0/libs/math/doc/html/special.html .
alfC

1
@alfC: Cảm ơn vì liên kết tốt hơn. Tôi sẽ sử dụng điều đó ở trên, để minh họa việc tiếp tục thiếu hỗ trợ tiêu chuẩn cho chức năng / họ chức năng này.
hardmath

4

Trước hết, bạn nên chọn dựa trên ứng dụng của mình nếu bạn cần số học có độ chính xác cao (nghĩa là bạn sẽ hài lòng với kết quả chính xác kép của IEEE cho các hàm polylog hay bạn cần độ chính xác cao hơn)? Nếu bạn cần độ chính xác cao, bạn có thể tìm trong nhóm các công cụ xung quanh thư viện GMP.

Nếu bạn không, bạn có thể sử dụng xấp xỉ. Một số nghiên cứu văn học đã chỉ cho tôi bài viết này . Ở cuối bài viết, là một "bảng lựa chọn": dựa trên các đối số của các polylog mà bạn cần, bạn có thể chọn một công thức gần đúng. Nhưng hãy cẩn thận để kiểm tra sự ổn định và chính xác.

Nếu bạn không cần quá nhiều đánh giá (không phải trong một vòng lặp lồng nhau), tôi sẽ chỉ sử dụng phương pháp số phương bằng cách sử dụng phương pháp lũy thừa kép.


Độ chính xác cần thiết sẽ vào khoảng 10 ^ -6. Bạn có biết cách nào khác không liên quan đến việc sử dụng bất kỳ thư viện bổ sung nào không?
flamingohats

x

0xt3et1dtx[0,10]

xin lỗi tôi đã nhầm lẫn Tôi đã tính xấp xỉ tích phân từ 0,65 đến 5,025 bằng phương pháp Trapezoidal và tôi cần một công thức để tìm giá trị chính xác để tôi có thể so sánh giá trị gần đúng với giá trị phân tích. Tôi biết điều này sẽ gần đúng vì nó là số dấu phẩy động, vì vậy độ chính xác 1e-6 sẽ ổn. Nếu tôi có thể bằng cách nào đó học cách nhập hàm polylog vào IDE thì nó sẽ hoạt động.
flamingohats

1
0.655.205t3et1dt=4.8498308528256668370925

3

Fj(x)jj=12,12,32

Fj(x)=Lij+1(ex)
x
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.