มีซอฟต์แวร์ที่สามารถสร้างรูทีนจุด C ที่แม่นยำและเป็นตัวเลขโดยอัตโนมัติจากสูตรสัญลักษณ์หรือไม่?


25

ได้รับฟังก์ชั่นจริงของตัวแปรจริงมีซอฟต์แวร์ที่สามารถสร้างโค้ดที่มีความแม่นยำเชิงตัวเลขเพื่อคำนวณฟังก์ชั่นของอินพุตทั้งหมดบนเครื่องที่มีการคำนวณทางคณิตศาสตร์ IEEE 754 หรือไม่?

ตัวอย่างเช่นถ้าฟังก์ชันจริงที่ต้องประเมินคือ:

f (a, b, c) = \ frac {-b - \ sqrt {b ^ 2 - 4ac}} {2a}

ซอฟต์แวร์จะพิจารณาการยกเลิกอย่างรุนแรงและอาจค้นหาตารางผลลัพธ์สำหรับชุดอินพุตบางชุดเพื่อหลีกเลี่ยงการสูญเสียความแม่นยำในการคำนวณ

อีกทางหนึ่งมีซอฟต์แวร์ที่สามารถสร้างรูทีนการค้นหาตามตารางที่บริสุทธิ์เพื่อคำนวณฟังก์ชันที่กำหนดให้มีความแม่นยำสูงหรือไม่?


5
ปัญหาทั่วไปโดยทั่วไป
dmckee

1
หากปัญหาเกี่ยวกับการคำนวณรูท (หรือการแยกตัวประกอบ) ของโพลีโนมโดยเฉพาะจะมีไลบรารี C (หรือ C ++) ออกมา
moala

2
คุณอาจต้องการที่จะตรวจสอบริชาร์ดแฮร์ริสชุดที่ดีของบทความในACCUวารสารเกินเกี่ยวกับลอยจุดบลูส์ ฉันจัดทำดัชนีพวกเขาผ่านทาง Programmers.SX สำหรับผู้ที่อาจสนใจ
Mark Booth

คำตอบ:


25

ทางออกที่ดีที่สุดที่ฉันรู้คือการเขียนโปรแกรมการแสดงออกสัญลักษณ์ในMathematica , MapleหรือSymPy ; ลิงก์ทั้งหมดไปที่เอกสารการสร้างรหัสโดยตรง โปรแกรมทั้งหมดข้างต้นสามารถสร้างรหัสใน C หรือ Fortran

ไม่มีโปรแกรมใดที่กล่าวถึงความแม่นยำในเลขคณิต IEEE 754 โดยทั่วไปจะเป็นเรื่องยากที่จะคาดการณ์แหล่งที่มาของการยกเลิกความหายนะทั้งหมดตามที่ @dmckee notes เป็นการยากที่จะแทนที่ความเชี่ยวชาญของมนุษย์ในการวิเคราะห์เชิงตัวเลข

เพื่อให้ตัวอย่างที่เป็นรูปธรรมให้พิจารณาการคำนวณฟังก์ชันตรีโกณมิติความแม่นยำสูงสำหรับปัจจัยการผลิตโดยพลการใน ] มีกลยุทธ์มากมายสำหรับการทำเช่นนั้นบางฮาร์ดแวร์แม้กระทั่งขึ้นจะเป็นเห็นในบทความวิกิพีเดียตารางตรีโกณมิติ อัลกอริธึมทั้งหมดต้องการความเฉลียวฉลาดและการวิเคราะห์เชิงตัวเลขแม้แต่อัลกอริธึมที่ขึ้นอยู่กับตารางการค้นหาและเทย์เลอร์ซีรีส์หรือการแก้ไข (ดูบทความ Wikipedia The Dilemma ของ Table-Maker ) สำหรับรายละเอียดเพิ่มเติมโปรดดูคำถามเกี่ยวกับ Stack Overflow ที่เกี่ยวข้องฟังก์ชันตรีโกณมิติทำงานอย่างไร .[0,2π]

ซอฟต์แวร์ที่สร้างรหัสหรือรูทีนเพื่อคำนวณฟังก์ชันตามอำเภอใจเพื่อความแม่นยำสูงไม่เพียง แต่ต้องตระหนักถึงข้อผิดพลาดในการยกเลิกเท่านั้น แต่ยังต้องใช้ชุดประมาณ (Taylor, Padé, Chebyshev, rational, etc. ) สำหรับการคำนวณฟังก์ชันที่ไม่ได้กำหนดไว้ จำนวน จำกัด ของการบวกการลบการคูณการหารและการเลื่อนบิต (ดูทฤษฎีการประมาณ )


4
"เป็นการยากที่จะแทนที่ความเชี่ยวชาญของมนุษย์ในการวิเคราะห์เชิงตัวเลข" - สิ่งนี้สมควรได้รับ +1
JM

"มันยาก" ไม่ใช่สิ่งเดียวกับ "มันเป็นไปไม่ได้" มี "ทฤษฎีการจ้างงานเต็มรูปแบบ" สำหรับงานบางอย่าง (เช่นนักเขียนคอมไพเลอร์) มีนักวิเคราะห์ตัวเลขหรือไม่?
นามแฝง

ใช่. ข้าวทฤษฎีบท
Geoff Oxberry

14

หากคุณต้องการความคิดของได้ไกลแค่ไหนเราอยู่ห่างจากแพคเกจซอฟต์แวร์ดังกล่าวโปรดดูที่ 2001 LAPACK บันทึกการทำงานบนคอมพิวเตอร์ผลัด Givens น่าเชื่อถือและมีประสิทธิภาพ ฉันคาดหวังว่าผู้ที่ไม่ใช่ผู้เชี่ยวชาญ (และผู้เชี่ยวชาญจำนวนมาก!) ในการวิเคราะห์เชิงตัวเลขจะต้องประหลาดใจที่การวิเคราะห์จำนวนมากไปสู่การแก้ปัญหาอย่างง่ายเช่นนี้:

f,gCcRsC

R(c,s)[fg]=[css¯c][fg]=[r0]

R(c,s)


1
+1 นี่เป็นตัวอย่างที่ดีขอบคุณ ฉันเดาว่าถ้ามีทางออกสำหรับ reals อยู่มันอาจถูกดัดแปลงให้เป็นจำนวนเชิงซ้อน
Daniel Trebbien

ฉันควรจะพูดถึงความยากลำบากพื้นฐานไม่ได้อยู่ในความจริงที่ว่า s สามารถซับซ้อน แต่ในการหลีกเลี่ยงล้นที่ไม่จำเป็นและ / หรือ underflow มันเกี่ยวข้องกับฟังก์ชั่น hypot: en.wikipedia.org/wiki/Hypot
Jack Poulson

11

การสร้างรหัสและการคอมไพล์ล่วงหน้าของนิพจน์ทางคณิตศาสตร์กำลังเป็นที่นิยมมากขึ้น

ในขณะที่แพคเกจสัญลักษณ์เช่น SymPy, Mathematica และ Maple อาจรวมถึงการสร้างรหัสฉันไม่มั่นใจว่าสิ่งใด ๆ ที่พวกเขาคิดอย่างหนักเกี่ยวกับตัวเลข

มีโครงการอื่นอีกสองโครงการที่เรามองว่ามีความสนใจทั้งในเชิงสัญลักษณ์และเชิงตัวเลข

Theanoเป็นโครงการที่มุ่งเน้นการดำเนินงานของอาร์เรย์ พวกเขาจะระบุและแทนที่การดำเนินการบางอย่างที่รู้จักกันว่าเป็นตัวเลขที่ไม่ดี ฉันไม่แน่ใจว่านี่รวมถึงกรณีเฉพาะของคุณ แต่มันคุ้มค่าที่จะดู

หมุนวนอาจจะน่าสนใจสำหรับคุณ พวกเขายังทำการคอมไพน์ทรีไวยากรณ์ที่เป็นนามธรรมและคอยตรวจสอบปัญหาตัวเลข พวกเขาเกี่ยวข้องกับการใช้งานสเกลาร์มากกว่า (เช่นตัวอย่างของคุณ) อย่างไรก็ตามพวกเขายังมีความเชี่ยวชาญในโดเมนเฉพาะ

อย่างไรก็ตามการเติบโตในสาขานี้เป็นกำลังใจให้ อาจเป็นแง่ดีว่าคำถามของคุณจะมีคำตอบที่ดีขึ้นในอีกไม่กี่ปี


2
ตกลงกัน; บางทีคำตอบของฉันออกมาในแง่ร้ายเกินไปเนื่องจากมีวิธีแก้ปัญหาเฉพาะโดเมนมากมาย แต่ปัญหาทั่วไปคือ ... ยาก
Jack Poulson

4

ไม่โดยทั่วไปฉันสามารถพูดได้อย่างปลอดภัยว่าตัวดำเนินการของตัวสร้างโค้ดใน SymPy ไม่ได้ลอง = P

Paolo Bientinesi พัฒนาวิธีการสร้างการพิสูจน์ความเสถียรของอัลกอริทึมพีชคณิตเชิงเส้นซึ่งสร้างขึ้นโดยใช้สัญกรณ์ FLAME ของ Robert van de Geijn

ดูกระดาษนี้หรือรุ่นโน้ตยาวขึ้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.