การเลือกตัวแก้ปัญหา: NonlinearBlockGS กับ NewtonSolver
ฉันมีกลุ่ม openmdao สองกลุ่มที่มีการพึ่งพาแบบวนรอบระหว่างกลุ่ม ฉันคำนวณอนุพันธ์โดยใช้ขั้นตอนที่ซับซ้อน ฉันมีตัวแก้ที่ไม่ใช่เชิงเส้นสำหรับการพึ่งพาและใช้ SLSQP เพื่อเพิ่มประสิทธิภาพฟังก์ชันวัตถุประสงค์ของฉัน ปัญหาอยู่ที่ตัวเลือกของตัวแก้ปัญหาที่ไม่ใช่เชิงเส้น เมื่อฉันใช้NonlinearBlockGSการเพิ่มประสิทธิภาพจะประสบความสำเร็จในการทำซ้ำ 12 ครั้ง แต่เมื่อฉันใช้NewtonSolverกับDirectsolverหรือScipyKrylovการปรับให้เหมาะสมล้มเหลว (เกินขีด จำกัด การทำซ้ำ) แม้จะมีmaxiter=2000. การเชื่อมต่อแบบวนรอบมาบรรจบกัน แต่เป็นเพียงการที่ตัวแปรการออกแบบไปไม่ถึงค่าที่เหมาะสมที่สุด ความแตกต่างระหว่างตัวแปรการออกแบบในการทำซ้ำติดต่อกันอยู่ในลำดับ 1e-5 และสิ่งนี้จะเพิ่มการทำซ้ำที่จำเป็น นอกจากนี้เมื่อฉันเปลี่ยนการคาดเดาเริ่มต้นเป็นค่าที่ใกล้เคียงกับค่าที่เหมาะสมที่สุดก็จะใช้ได้
เพื่อตรวจสอบเพิ่มเติมฉันได้แปลงโมเดลเป็น IDF (โดยการสร้างสำเนาของตัวแปรการมีเพศสัมพันธ์และข้อ จำกัด ด้านความสอดคล้อง) ดังนั้นจึงไม่จำเป็นต้องใช้ตัวแก้ ตอนนี้การเพิ่มประสิทธิภาพประสบความสำเร็จในการทำซ้ำ 5 ครั้งและผลลัพธ์จะคล้ายกับผลลัพธ์เมื่อNonlinearBlockGSถูกใช้
ทำไมสิ่งนี้ถึงเกิดขึ้น? ฉันพลาดอะไรไปรึเปล่า? เมื่อใดที่ฉันควรใช้NewtonSolverกับผู้อื่น? ฉันรู้ว่ามันเป็นเรื่องยากที่จะตอบโดยไม่ต้องเห็นรหัส แต่เป็นเพียงว่ารหัสของฉันยาวโดยมีส่วนประกอบหลายชิ้นและฉันไม่สามารถสร้างปัญหาขึ้นมาใหม่ด้วยโมเดลของเล่นได้ ดังนั้นความเข้าใจทั่วไปใด ๆ จึงได้รับการชื่นชมมาก
คำตอบ
หากไม่เห็นรหัสแสดงว่าคุณคิดถูกแล้วที่ระบุรายละเอียดได้ยาก
พูดอย่างกว้าง ๆ บางครั้งนิวตันอาจมีปัญหาในการบรรจบกันมากกว่า NLBGS (หมายเหตุ: นี่ไม่เป็นความจริงอย่างแน่นอน แต่เป็นกฎง่ายๆ) ดังนั้นสิ่งที่ฉันเดาได้ก็คือในการทำซ้ำครั้งแรกหรือครั้งที่สองของคุณตัวแก้นิวตันไม่ได้มาบรรจบกัน คุณสามารถตรวจสอบได้โดยการตั้งค่าnewton.options['iprint']=2และดูประวัติการทำซ้ำในขณะที่เครื่องมือเพิ่มประสิทธิภาพวนซ้ำ
เมื่อคุณมีตัวแก้ในการเพิ่มประสิทธิภาพสิ่งสำคัญคือคุณต้องตรวจสอบให้แน่ใจด้วยว่าคุณตั้งค่าให้เกิดข้อผิดพลาดในการไม่บรรจบกัน เครื่องมือเพิ่มประสิทธิภาพบางตัวสามารถจัดการกับข้อผิดพลาดนี้ได้และจะย้อนกลับในการค้นหาบรรทัด คนอื่นก็จะตาย ไม่ว่าจะด้วยวิธีใดมันก็สำคัญ มิฉะนั้นคุณจะให้เครื่องมือเพิ่มประสิทธิภาพเป็นกรณีที่ไม่ได้รับการยืนยันซึ่งไม่ทราบว่าไม่ได้รับการยืนยัน
สิ่งนี้ไม่ดีด้วยเหตุผลสองประการ ประการแรกวัตถุประสงค์และค่า จำกัด ที่ได้รับจะไม่ถูกต้อง! ประการที่สองและที่สำคัญกว่านั้นคืออนุพันธ์ที่คำนวณได้จะผิด! คุณสามารถอ่านรายละเอียดได้ [ในคู่มือทฤษฎี] แต่โดยสรุปวิธีการวิเคราะห์อนุพันธ์ที่ OpenMDAO ใช้จะถือว่าเศษเหลือเป็น 0 หากไม่เป็นเช่นนั้นคณิตศาสตร์จะแยกย่อยออกไป แม้ว่าคุณจะสร้างความแตกต่างแบบ จำกัด แบบเต็มรูปแบบ แต่แบบจำลองที่ไม่ได้มาบรรจบกันก็เป็นปัญหา คุณจะได้รับขยะที่มีเสียงดังเมื่อคุณพยายาม FD 2
ดังนั้นสมมติว่าคุณตั้งค่าแบบจำลองของคุณอย่างถูกต้องและคุณมีตัวแก้ปัญหาเชิงเส้นตั้งค่าปัญหา (ดูเหมือนว่าคุณจะทำเนื่องจากทำงานกับ NLBGS) เป็นไปได้มากว่าตัวแก้นิวตันจะไม่มาบรรจบ ใช้ iprint ซึ่งอาจรวมกับการพิมพ์ดีบักไดรเวอร์เพื่อตรวจสอบด้วยตัวคุณเอง หากเป็นเช่นนั้นคุณต้องหาวิธีทำให้นิวตันทำงานได้ดีขึ้น
มีเคล็ดลับบางประการที่เป็นประโยชน์ทั่วไป นอกจากนี้คุณยังสามารถลองใช้การค้นหาเส้น armijoซึ่งมักจะทำให้นิวตันคงที่โดยเสียค่าใช้จ่ายบางส่วน
สุดท้าย ... นิวตันไม่ใช่คำตอบที่ดีที่สุดในทุกสถานการณ์ หาก NLBGS มีเสถียรภาพมากขึ้นและมีราคาถูกกว่าคุณควรใช้ ขอปรบมือให้กับความปรารถนาของคุณที่จะให้มันทำงานร่วมกับนิวตัน คุณควรติดตามอย่างแน่นอนว่าทำไมถึงไม่เป็นเช่นนั้น แต่ถ้าปรากฎว่านิวตันไม่สามารถแก้ปัญหาคู่ของคุณได้อย่างน่าเชื่อถือนั่นก็โอเคเช่นกัน!