Saya memiliki fungsi dua dimensi yang nilainya ingin saya sampel. Fungsi ini sangat mahal untuk dikomputasi dan memiliki bentuk yang kompleks, jadi saya perlu mencari cara untuk mendapatkan informasi paling banyak tentang bentuknya menggunakan jumlah titik sampel yang paling sedikit.
Metode apa yang bagus untuk melakukan ini?
Apa yang saya miliki sejauh ini
Saya mulai dari set poin yang ada di mana saya sudah menghitung nilai fungsi (ini bisa berupa kisi persegi poin atau yang lainnya).
Lalu saya menghitung triangulasi Delaunay dari poin-poin ini.
Jika dua titik tetangga dalam triangulasi Delaunay cukup jauh ( ) dan nilai fungsi cukup berbeda di dalamnya ( > Δ f ), maka saya memasukkan titik baru di tengah-tengah di antara mereka. Saya melakukan ini untuk setiap pasangan titik tetangga.
Apa yang salah dengan metode ini?
Yah, itu bekerja relatif baik, tetapi pada fungsi yang mirip dengan ini tidak ideal karena titik sampel cenderung "melompati" punggungan dan bahkan tidak menyadari itu ada di sana.
Ini menghasilkan hasil seperti ini (jika resolusi grid titik awal cukup kasar):
Plot di atas menunjukkan titik di mana nilai fungsi dihitung (sebenarnya sel Voronoi di sekitarnya).
Plot di atas menunjukkan interpolasi linier yang dihasilkan dari titik yang sama, dan membandingkannya dengan metode pengambilan sampel bawaan Mathematica (untuk resolusi awal yang hampir sama).
Bagaimana cara memperbaikinya?
Saya pikir masalah utama di sini adalah bahwa metode saya memutuskan apakah akan menambahkan titik perbaikan atau tidak berdasarkan gradien.
Akan lebih baik untuk memperhitungkan kelengkungan atau setidaknya turunan kedua saat menambahkan poin perbaikan.
Pertanyaan
Apa cara yang sangat sederhana untuk menerapkan cara memperhitungkan turunan atau kelengkungan kedua ketika lokasi poin saya tidak dibatasi sama sekali? (Saya tidak harus memiliki kisi kuadrat dari titik awal, ini idealnya bersifat umum.)
Atau cara sederhana apa yang ada untuk menghitung posisi titik perbaikan secara optimal?
Saya akan menerapkan ini dalam Mathematica, tetapi pertanyaan ini terutama tentang metode ini. Untuk bit "mudah diimplementasikan" tidak dihitung bahwa saya menggunakan Mathematica (yaitu ini mudah dilakukan sejauh ini karena memiliki paket untuk melakukan triangulasi Delaunay)
Masalah praktis apa yang saya terapkan ini
Saya menghitung diagram fase. Ini memiliki bentuk yang rumit. Di satu wilayah nilainya 0, di wilayah lain itu antara 0 dan 1. Ada lompatan tajam antara kedua wilayah (itu terputus-putus). Di wilayah di mana fungsi lebih besar dari nol ada beberapa variasi halus dan beberapa diskontinuitas.
Nilai fungsi dihitung berdasarkan simulasi Monte Carlo, sehingga kadang-kadang nilai fungsi atau noise yang salah diharapkan (ini sangat jarang terjadi, tetapi untuk sejumlah besar titik itu terjadi, misalnya ketika kondisi mapan tidak tercapai karena beberapa faktor acak)
Saya sudah menanyakan ini di Mathematica.SE tetapi saya tidak dapat menautkannya karena masih dalam versi beta pribadi. Pertanyaan ini di sini adalah tentang metode, bukan implementasinya.
Balas ke @suki
Apakah ini jenis pembagian yang Anda sarankan, yaitu menempatkan titik baru di tengah segitiga?
Perhatian saya di sini adalah bahwa tampaknya memerlukan penanganan khusus di tepi wilayah, jika tidak akan memberikan segitiga yang sangat panjang dan sangat tipis, seperti yang ditunjukkan di atas. Apakah Anda benar untuk ini?
MEMPERBARUI
Masalah yang muncul baik dengan metode yang saya jelaskan dan dengan saran @ suki untuk menempatkan pembagian berdasarkan segitiga dan menempatkan titik pembagian di dalam segitiga adalah bahwa ketika ada diskontinuitas (seperti dalam masalah saya), mengkompilasi ulang triangulasi Delaunay setelah langkah mungkin menyebabkan segitiga berubah dan mungkin beberapa segitiga besar muncul yang memiliki nilai fungsi yang berbeda dalam tiga simpul.
Berikut ini dua contoh:
Yang pertama menunjukkan hasil akhir saat pengambilan sampel di sekitar diskontinuitas lurus. Yang kedua menunjukkan distribusi titik sampling untuk kasus serupa.
Apa cara sederhana yang ada untuk menghindari ini? Saat ini saya hanya membagi lagi egdes yang hilang setelah retriangulation, tapi ini terasa seperti retasan dan perlu dilakukan dengan hati-hati seperti dalam kasus jerat simetris (seperti kotak persegi) ada beberapa triangulasi Delaunay yang valid, maka ujung-ujungnya mungkin berubah secara acak setelah retriangulasi.