วิธีจัดการกับความซับซ้อนในรหัสตัวเลขเช่นเมื่อต้องรับมือกับเมทริกซ์จาโคเบียนขนาดใหญ่?


10

ฉันกำลังแก้ไขระบบที่ไม่ใช่เชิงเส้นของสมการคู่และได้คำนวณจาโคเบียนของระบบที่แยกส่วน ผลลัพธ์มีความซับซ้อนมากด้านล่างคือ (เท่านั้น!) 3 คอลัมน์แรกของเมทริกซ์3×9

เมทริกซ์ Jacobian บางส่วน

(ความซับซ้อนเกิดขึ้นส่วนหนึ่งเนื่องจากโครงร่างตัวเลขต้องมีการปรับแบบเอ็กซ์โปเนนเชียลเพื่อความมั่นคง)

ฉันมีคำถามทั่วไปเกี่ยวกับการใช้รหัสตัวเลขโดยใช้ Jacobians

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

ก่อนอื่นฉันวางแผนที่จะดีบัก Jacobian เชิงวิเคราะห์ด้วยการประมาณความแตกต่างอัน จำกัด ฉันควรทราบถึงข้อผิดพลาดหรือไม่? คุณจัดการกับปัญหาที่คล้ายกันในรหัสของคุณได้อย่างไร

ปรับปรุง

ฉันกำลังเขียนโค้ดนี้ใน Python และใช้sympyเพื่อสร้าง Jacobian บางทีฉันสามารถใช้คุณสมบัติการสร้างรหัสได้หรือไม่


คุณใช้ Computer Algebra System เพื่อสร้างการแสดงออกของ Jacobian? หากคุณใช้ Maple คุณอาจต้องการดูcodegenแพ็คเกจในนั้นเพราะสามารถสร้างรหัส C หรือ Fortran ที่กะทัดรัดและมีประสิทธิภาพสำหรับนิพจน์แต่ละรายการหรือทั้งหมดโดยอัตโนมัติ
เปโดร

มีคำตอบที่เป็นประโยชน์มากมายที่นี่มันไม่มีเหตุผลที่จะเลือก ฉันควรทำให้โพสต์นี้เป็น Community Wiki หรือไม่
boyfarrell

คำตอบ:


6

หนึ่งคำ: Modularity

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

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

ข้อเสนอแนะอีกประการหนึ่งก็คือดูที่ห้องสมุดสร้างความแตกต่างโดยอัตโนมัติสำหรับการประกอบยาโคเบียน ไม่มีการรับประกันว่าปราศจากข้อผิดพลาด แต่อาจจะมีการดีบัก / ข้อผิดพลาดน้อยลงกว่าการเขียนของคุณเอง นี่คือบางส่วนที่คุณอาจต้องการดู:

  • Sacado (Sandia Labs)
  • ADIC (อาร์กอน)

ขออภัยเพิ่งเห็นว่าคุณกำลังใช้หลาม ScientificPython รองรับ AD


คำปรึกษาที่ดี. นิพจน์ระดับกลางมักไม่จำเป็นต้องมีฟังก์ชั่นของตัวเองเพียงแค่เก็บไว้ในตัวแปรกลาง
David Ketcheson

5

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

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

  • ในนิพจน์ที่มีความยาวเช่นเดียวกับที่สร้างขึ้นโดยระบบ CA มีความเสี่ยงในการถูกลบอย่างมาก คำนวณจำนวนมากจำนวนมากเพียงเพื่อจะพบว่าพวกเขาทั้งหมดยกเลิกซึ่งกันและกันเพื่อให้ได้จำนวนน้อย

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

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

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

ทดสอบรหัส ตรวจสอบสัญญาซื้อขายล่วงหน้า

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

หากคุณใช้อนุพันธ์การวิเคราะห์ให้ใส่รหัสเหล่านั้นเพื่อนำคำศัพท์มาใช้ซ้ำ นี่อาจเป็นการประหยัดเวลาอย่างจริงจังและอาจลดข้อบกพร่องจริง ๆ แล้วประหยัดเวลาของคุณเอง แต่จากนั้นตรวจสอบตัวเลขเหล่านั้น!


5

มีหลายกลยุทธ์ที่ควรพิจารณา:

  1. ค้นหาอนุพันธ์ในรูปแบบสัญลักษณ์โดยใช้ CAS จากนั้นส่งออกรหัสสำหรับคำนวณอนุพันธ์

  2. ใช้เครื่องมือสร้างความแตกต่างอัตโนมัติ (AD) เพื่อสร้างรหัสที่คำนวณอนุพันธ์จากรหัสเพื่อคำนวณฟังก์ชัน

  3. ใช้การประมาณค่าผลต่าง จำกัด เพื่อประมาณจาโคเบียน

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



1

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

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