ฉันจะเชื่อใจอินทิกรัลอินทิเกรตตัวเลขจาก Matlab ได้อย่างไร


15

คนวิทยาศาสตร์การคำนวณ:

ฉันโพสต์คำถามนี้ที่ Math Stack Exchangeและมีคนแสดงความคิดเห็นว่าฉันอาจได้รับคำตอบ "ดีกว่า" ที่นี่:

ฉันเป็นสามเณรด้วยวิธีการเชิงตัวเลขและ Matlab ฉันพยายามประเมินผลรวมของสามอินทิกรัลสองอันดังต่อไปนี้ (สามารถเขียนได้ง่ายกว่า แต่คุณยังไม่สามารถประเมินได้ว่าเป็นสัญลักษณ์ (?)) ฉันมีปัญหาในการทำให้ทำงานที่นี่ดังนั้นฉันลังเลที่จะแยกมันออกเป็นชิ้น ๆ ที่นี่: ฉันต้องการค้นหาผลรวมของLATEX

2((1/0.3)1)2(11/0.31r10r1r0F1(r0,r1,t)exp((0.3)2t24)dtdr0dr1),

และ

2((1/0.3)1)2(11/0.31r1r1r0r1+r0F2(r0,r1,t)exp((0.3)2t24)dtdr0dr1),

ที่ไหน

F1(r0,r1,t)=t2r03(0.3)32r13π

และ

F2(r0,r1,t)=(0.3)3π3/2(r0+r1t)4(t2+2t(r0+r1)3(r1r0)2)2288(43πr03)(43πr13).

แก้ไข (2 มีนาคม 2013): มีคนตอบว่าได้รับ Mathematica เพื่อทำอินทิกรัลเป็นสัญลักษณ์ ฉันพยายามทำสิ่งนี้ (ด้วยอินทิกรัลเวอร์ชันที่ง่าย) และ Mathematica สามารถทำได้เพียงสองส่วนนอกของอันแรกและหยุดชะงักในอันที่สอง ฉันขอขอบคุณความช่วยเหลือ นี่คือสิ่งที่ฉันทำ:

ฉันพยายามประเมิน

121r20r2r1r13t2exp(t2)r23dtdr1dr2
ผ่านทาง

รวม [r1 ^ 3 / r2 ^ 3 * t ^ 2 * Exp (-t ^ 2), {t, 0, r2 - r1}, {r1, 1, r2}, {r2, 1, 2}]

และ Mathematica กลับมา (ฉันมีปัญหากับที่นี่เพราะผลยาวฉันแบ่งมันเป็นสองสมการถ้าใครรู้วิธีที่ดีในการแสดงโปรดบอกฉัน):LATEX

12164R22อี-1-R22(2อี2R2(25+R2(19+2R2(1+R2)))-

อี1+R22(32R2(2+R22))+π(11+4R22(9+R22))erf[1-R2])dR2

จากนั้นฉันก็พยายามประเมิน

121R2R2-R1R2+R1...

...ประสบการณ์(-เสื้อ2)(R1+R2-เสื้อ)4(เสื้อ2+2เสื้อ(R1+R2)-3(R2-R1)2)2R13R23dเสื้อdRdR2

การใช้

รวม [(r1 + r2 - t) ^ 4 * (t ^ 2 + 2 * t * (r1 + r2) - 3 * (r2 - r1) ^ 2) ^ 2) Exp [-t ^ 2] / r1 ^ 3 / r2 ^ 3, {r2, 1, 2}, {r1, 1, r2}, {t, r2-r1, r2 + r1}]

ตอนนี้และ Mathematica ยังไม่ได้รับคำตอบหลังจากนั้นประมาณครึ่งชั่วโมง (แต่ตอนนี้ฉันมีปัญหาเครือข่ายคอมพิวเตอร์และพวกเขาอาจจะถูกตำหนิ)

[สิ้นสุดการแก้ไขเดือนมีนาคม 2]

ฉันใช้คำสั่ง "triplequad" ของ Matlab โดยไม่มีตัวเลือกพิเศษ ฉันจัดการขีด จำกัด ตัวแปรของการรวมด้วยฟังก์ชั่นหนักเพราะฉันไม่รู้วิธีอื่นที่จะทำ Matlab ให้ฉัน0.007164820144202 0.007164820144202

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

การทดลองที่ 1:0.007133292603256

การทดลองที่ 2:0.007120455071989

การทดลองที่ 3:0.007062595022049

การทดลองที่ 4:0.007154940168452

การทดลองที่ 5:0.007215000289130

แม้ว่าการทดลองแต่ละครั้งจะใช้ตัวอย่างเป็นล้านตัวอย่างค่าการจำลองจะเห็นด้วยในหลักสำคัญแรกเท่านั้น พวกเขาไม่ใกล้กันมากพอที่ฉันจะตัดสินว่าอินทิกรัลเชิงตัวเลขสามตัวนั้นถูกต้องหรือไม่

มีใครบอกฉันได้ไหมว่าฉันสามารถเชื่อถือผลลัพธ์ของ "triplequad" ที่นี่ได้หรือไม่และภายใต้สถานการณ์ใดที่เราสามารถเชื่อถือได้โดยทั่วไป

ข้อเสนอแนะข้อหนึ่งที่ฉันได้ที่ Math Stack Exchange คือการลองใช้ซอฟต์แวร์อื่นเช่น Mathematica, Octave, Maple และ SciPy นี่เป็นคำแนะนำที่ดีหรือไม่? ผู้คนทำงานเชิงตัวเลขใน Mathematica และ Maple จริงหรือไม่ อ็อกเทฟเป็นโคลน Matlab ดังนั้นฉันจะถือว่ามันใช้อัลกอริทึมการรวมเดียวกันได้หรือไม่? ฉันไม่เคยได้ยินเรื่อง SciPy มาก่อนและจะขอบคุณความคิดเห็นใด ๆ


UPDATE: ใครบางคนจากคณิตศาสตร์ Stack แลกเปลี่ยนไม่ได้ในเมเปิลและได้0.007163085468นั่นคือข้อตกลงกับสามตัวเลขที่สำคัญ นั่นเป็นสัญญาณที่ดี0.007163085468

นอกจากนี้ฉันขอขอบคุณข้อเสนอแนะเกี่ยวกับวิธีป้อนนิพจน์หลายบรรทัดแบบยาวในใน Stack Exchange คุณสามารถใช้สภาพแวดล้อม "ชิด" ที่นี่ได้ไหม? ฉันลองแล้วก็ใช้งานไม่ได้LATEX


2
ผลลัพธ์การจำลองของคุณนั้นสอดคล้องกับค่าตัวเลขที่ส่งคืนโดย Matlab: ค่าเฉลี่ยของพวกเขาที่นั้นเป็นเพียงข้อผิดพลาดมาตรฐานน้อยกว่า Matlab ที่ส่งคืน FWIW, Mathematicaผลตอบแทน0.00716308537นอกจากนี้ยังสามารถประเมินอินทิกรัลเหล่านี้อย่างเป็นสัญลักษณ์ในแง่ของพหุนามและฟังก์ชันข้อผิดพลาด 0.00713726-1.110.00716308537...
whuber

@whuber ขอบคุณ ฉันสาบานได้ว่าฉันลองมันเป็นสัญลักษณ์ใน Maple และ Maple ไม่สามารถทำได้ ฉันจะลองอีกครั้งในเมเปิลและถ้ามันไม่ได้ผลฉันจะลองในเมธามิกก้า BTW ฉันทำอินทิกรัลที่คล้ายคลึงกันใน Maple และฉันได้รับคำตอบเชิงสัญลักษณ์อย่างมาก ดูเหมือนว่าจะเป็นผลรวมและความแตกต่างของจำนวนมากที่มียอดรวมค่อนข้างเล็ก ฉันสงสัยว่าข้อผิดพลาด roundoff น่าจะเป็นคำตอบสุดท้าย ในปัญหาเช่นนี้คุณควรใช้คำตอบเชิงสัญลักษณ์หรือทำอินทิกรัลเชิงตัวเลข?
Stefan Smith

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

@ โฮเบอร์: ฉันพยายามทำอินทิกรัลที่เทียบเท่ากัน (เปลี่ยนค่าคงที่และลบค่าคงที่แบบหลายค่า) ใน Mathematica และ Mathematica ทำได้เพียงการรวมสององค์ประกอบภายนอกของอินทิกรัลแรกเข้า ฉันโพสต์รหัสและผลลัพธ์ด้านบน
Stefan Smith

1
Re การแก้ไขวันที่ 2 มีนาคม: โดยการลดอินทิกรัลอินทิกรัลเป็นสัญลักษณ์อินทิกรัลเดียว (ในครึ่งแรกของอินทิกรัล) คุณทำสำเร็จได้มาก อินทิเกรตนั้นทำตัวได้ดีมากและสามารถรวมเข้ากับตัวเลขเพื่อความแม่นยำสูงมากภายในเสี้ยววินาที
whuber

คำตอบ:


9

ก่อนอื่นมันไม่ใช่ซอฟต์แวร์ (หรืออย่างน้อยก็ไม่ควรจะเป็น) ที่กำหนดคุณภาพของการแก้ปัญหาคือคุณภาพและความเหมาะสมของอัลกอริทึมที่ใช้ คุณควรตรวจสอบว่าอัลกอริธึมที่ใช้โดย triplequad ใน Matlab (ฉันเดาว่ามันใช้การสร้างพื้นที่สี่เหลี่ยมจัตุรัส Gaussian แบบซ้อนกัน) และคุณควรตรวจสอบว่าความคลาดเคลื่อนที่ร้องขอคืออะไร (ต้องได้รับการยอมรับแบบสัมบูรณ์และการยอมรับแบบสัมพัทธ์) โดยปกติแล้วโอกาสที่จะถามคือความแม่นยำสัมพัทธ์เท่านั้น 10-8

คำตอบที่มาจาก Maple น่าจะทำโดย Computer Algebra และบางทีมันอาจหาวิธีแก้ปัญหาแบบปิดซึ่งประเมินโดยใช้จุดลอยตัวที่มีความแม่นยำสองเท่า นี่เป็นข้อได้เปรียบที่คุณไม่ได้ประมาณค่าอินทิกรัลโดยการรวมที่แน่นอน (และด้วยเหตุนี้จะแนะนำข้อผิดพลาดโดยประมาณ) แต่ระบบพีชคณิตของคอมพิวเตอร์จะค้นหานิพจน์สำหรับอินทิกรัลซึ่งสามารถประเมินได้ แน่นอนว่าต้องใช้ความระมัดระวังเมื่อประเมินการแสดงออกนี้ (สำหรับการปัดเศษ)

หากคุณต้องการทำเช่นนี้กับ SciPy คุณจะต้องหันไปใช้การสร้างพื้นที่สี่เหลี่ยมจัตุรัส Gaussian แบบซ้อนกันโดยใช้ Quadpack พื้นฐาน (Piessens et al.) ใน Octave คุณจะมีแนวทางเดียวกัน และฉันจะไม่ต้องแปลกใจเกินไปถ้า Matlab ยังใช้ Quadpack เป็นเครื่องมือสร้างพื้นที่สี่เหลี่ยมจัตุรัส (เพราะมันเป็นอ้างอิง)


@GretVdE: ขอบคุณสำหรับข้อมูล ฉันพยายามประเมินอินทิกรัลเป็นสัญลักษณ์แรกแล้วและเมเปิลไม่สามารถทำได้ (ดังนั้นจึงเป็นไปไม่ได้เลยที่จะใช้ฟังก์ชั่นมาตรฐาน) ดังนั้นฉันจึงขอให้เมเปิลทำตัวเลข ฉันไม่รู้ว่ามันใช้อัลกอริทึมอย่างไร
Stefan Smith

@StefanSmith: คุณจะพบว่าโดยการตั้งค่า infolevel infolevel[`evalf/int`] := 4ในเมเปิลไปนี้: คุณแน่ใจหรือไม่ว่า Mape ไม่พบโซลูชันที่ปิด อินทิกรัลไม่ซับซ้อนเกินไป คุณสามารถทำให้แผ่นงานเมเปิลของคุณเป็นที่สาธารณะได้หรือไม่?
GertVdE

@StefanSmith: ฉันจะโพสต์รหัส Maple ในคำถามข้างต้น
GertVdE

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