อะไรคือวิธีที่ทันสมัยในการใช้งานฟังก์ชั่นพิเศษที่มีความแม่นยำสองเท่า ฉันต้องการอินทิกรัลต่อไปนี้: สำหรับและซึ่งสามารถเขียนได้ในรูปของฟังก์ชันแกมม่าที่ไม่สมบูรณ์ต่ำกว่า นี่คือการใช้ Fortran และ C ของฉัน:เมตร=0,1,2, . . t>0
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 คำว่าได้รับเท่ากับ 1e-303 และสำหรับ "m" ที่สูงขึ้นมันก็เริ่มให้คำตอบที่ไม่ถูกต้อง ฟังก์ชั่นของฉันไม่ได้มีปัญหานี้เพราะผมใช้การขยายตัวชุด / การกำเริบความสัมพันธ์โดยตรงF_mนี่คือตัวอย่างของค่าที่ถูกต้อง: Fm
(1e-6)=4.97511945200351715E-003
,
แต่ฉันไม่สามารถรับสิ่งนี้โดยใช้ SLATEC เพราะตัวส่วนระเบิด อย่างที่คุณเห็นค่าจริงของนั้นดีและเล็ก
อัปเดต 2 :
เพื่อหลีกเลี่ยงปัญหาดังกล่าวข้างต้นหนึ่งสามารถใช้ฟังก์ชั่นdgamit
(ไม่สมบูรณ์ฟังก์ชันแกมมา Tricomi ของ) จากนั้นF(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2
จึงมีปัญหาเกี่ยวกับการไม่มีอีกต่อไป แต่โชคร้ายพัดขึ้นสำหรับ172 อย่างไรก็ตามเรื่องนี้อาจจะสูงพอเพื่อฉันm ≈ 172 mgamma(m+0.5_dp)