ฉันมีฟังก์ชั่นสองมิติ ซึ่งมีค่าที่ฉันต้องการตัวอย่าง ฟังก์ชั่นนั้นมีราคาแพงมากในการคำนวณและมันมีรูปร่างที่ซับซ้อนดังนั้นฉันต้องหาวิธีที่จะได้รับข้อมูลมากที่สุดเกี่ยวกับรูปร่างของมันโดยใช้จำนวนจุดตัวอย่างน้อยที่สุด
มีวิธีการอะไรที่ดีในการทำสิ่งนี้?
สิ่งที่ฉันมีจนถึงตอนนี้
ฉันเริ่มต้นจากชุดของจุดที่มีอยู่ซึ่งฉันได้คำนวณค่าฟังก์ชันแล้ว (ซึ่งอาจเป็นจุดที่เป็นรูปสี่เหลี่ยมจัตุรัสหรืออย่างอื่น)
จากนั้นฉันคำนวณ Delaunay Triangulation ของจุดเหล่านี้
ถ้าสองจุดที่อยู่ใกล้เคียงในการหาสมการ Delaunay อยู่ไกลพอ ( ) และค่าฟังก์ชันแตกต่างกันพอสมควร ( ) จากนั้นฉันก็แทรกจุดใหม่ที่อยู่ตรงกลางระหว่างพวกเขา ฉันทำสิ่งนี้สำหรับแต่ละจุดที่อยู่ใกล้เคียง
เกิดอะไรขึ้นกับวิธีนี้?
มันใช้งานได้ค่อนข้างดี แต่ในฟังก์ชั่นที่คล้ายกับอันนี้มันไม่เหมาะเพราะจุดตัวอย่างมีแนวโน้มที่จะ "กระโดดข้าม" สันเขาและไม่สังเกตว่ามันอยู่ที่นั่น
มันสร้างผลลัพธ์เช่นนี้ (หากความละเอียดของตารางจุดเริ่มต้นหยาบพอสมควร):
พล็อตด้านบนนี้แสดงจุดที่คำนวณค่าฟังก์ชัน (จริง ๆ แล้วเซลล์ Voronoi รอบตัวพวกเขา)
พล็อตด้านบนนี้แสดงการประมาณค่าเชิงเส้นที่สร้างจากจุดเดียวกันและเปรียบเทียบกับวิธีการสุ่มตัวอย่างแบบบิวท์อินของ Mathematica (สำหรับความละเอียดเริ่มต้นเดียวกัน)
จะปรับปรุงได้อย่างไร?
ฉันคิดว่าประเด็นหลักที่นี่คือวิธีการของฉันตัดสินใจว่าจะเพิ่มจุดการปรับแต่งหรือไม่ขึ้นอยู่กับการไล่ระดับสี
มันจะดีกว่าที่จะคำนึงถึงความโค้งหรืออย่างน้อยอนุพันธ์อันดับสองเมื่อเพิ่มคะแนนการปรับแต่ง
คำถาม
อะไรคือวิธีที่ง่ายมากในการนำวิธีการพิจารณาอนุพันธ์อันดับสองหรือความโค้งเมื่อตำแหน่งของคะแนนของฉันไม่ถูก จำกัด เลย? (ฉันไม่จำเป็นต้องมีสี่เหลี่ยมจัตุรัสจุดเริ่มต้นที่นี่ควรเป็นเรื่องทั่วไป)
หรือมีวิธีอื่นใดอีกในการคำนวณตำแหน่งของคะแนนการปรับแต่งในวิธีที่เหมาะสมที่สุด?
ฉันจะนำไปใช้ใน Mathematica แต่คำถามนี้ส่วนใหญ่เกี่ยวกับวิธีการ สำหรับบิต "ใช้งานง่าย" ไม่นับว่าฉันใช้ Mathematica (เช่นนี้ทำได้ง่ายมากเพราะมีแพ็คเกจสำหรับทำ Delaunay triangulation)
มีปัญหาอะไรในทางปฏิบัติที่ฉันใช้กับสิ่งนี้
ฉันกำลังคำนวณแผนภาพเฟส มันมีรูปร่างที่ซับซ้อน ในภูมิภาคหนึ่งค่าของมันคือ 0 ในอีกภูมิภาคหนึ่งอยู่ระหว่าง 0 ถึง 1 มีการกระโดดที่คมชัดระหว่างสองภูมิภาค (มันไม่ต่อเนื่อง) ในภูมิภาคที่ฟังก์ชันมีค่ามากกว่าศูนย์มีทั้งความแปรผันที่ราบรื่นและความไม่ต่อเนื่องสองสามอย่าง
ค่าฟังก์ชันถูกคำนวณตามการจำลองของ Monte Carlo ดังนั้นบางครั้งคาดว่าจะมีค่าฟังก์ชั่นหรือเสียงรบกวนที่ไม่ถูกต้อง ปัจจัยสุ่ม)
ฉันเคยถามสิ่งนี้ใน Mathematica.SE แล้วแต่ฉันไม่สามารถลิงก์กับมันได้ คำถามนี้เกี่ยวกับวิธีการไม่ใช่การนำไปใช้
ตอบกลับ @suki
นี่คือประเภทของการแบ่งที่คุณแนะนำคือการใส่จุดใหม่ในช่วงกลางของสามเหลี่ยมหรือไม่?
ความกังวลของฉันที่นี่คือดูเหมือนว่าจะต้องมีการจัดการเป็นพิเศษที่ขอบของภูมิภาคมิฉะนั้นจะให้สามเหลี่ยมยาวมากและบางมากดังที่แสดงข้างต้น คุณถูกต้องสำหรับสิ่งนี้?
UPDATE
ปัญหาที่ปรากฏขึ้นทั้งกับวิธีที่ฉันอธิบายและด้วยคำแนะนำของ @ suki ในการวางแบ่งย่อยตามรูปสามเหลี่ยมและใส่จุดแบ่งย่อยภายในรูปสามเหลี่ยมก็คือเมื่อมีความไม่ต่อเนื่อง (เช่นในปัญหาของฉัน) การคำนวณสมการสามเหลี่ยมใหม่ ทำให้รูปสามเหลี่ยมเปลี่ยนและบางทีสามเหลี่ยมขนาดใหญ่ปรากฏขึ้นซึ่งมีค่าฟังก์ชั่นต่างกันในสามจุดยอด
นี่คือสองตัวอย่าง:
ครั้งแรกจะแสดงผลลัพธ์ที่ได้เมื่อสุ่มตัวอย่างรอบความไม่ต่อเนื่องตรง ที่สองแสดงการกระจายจุดตัวอย่างสำหรับกรณีที่คล้ายกัน
มีวิธีง่าย ๆ ที่จะหลีกเลี่ยงสิ่งนี้? ขณะนี้ฉันกำลังแบ่งย่อย egdes ที่หายไปหลังจากการจับกลับคืน แต่สิ่งนี้ให้ความรู้สึกเหมือนเป็นแฮ็คและต้องทำด้วยความระมัดระวังในกรณีของตาข่ายแบบสมมาตร สุ่มหลังจากการจับคู่