Değerlerini örneklemek istediğim iki boyutlu bir işleve sahibim. İşlev, hesaplanması çok pahalıdır ve karmaşık bir şekle sahiptir, bu nedenle en az sayıda örnek noktası kullanarak şekli hakkında en fazla bilgiyi edinmenin bir yolunu bulmalıyım.
Bunu yapmak için hangi iyi yöntemler var?
Şimdiye kadar sahip olduklarım
İşlev değerini önceden hesapladığım mevcut bir nokta kümesinden başlıyorum (bu, noktaların kare bir kafesi veya başka bir şey olabilir).
Sonra bu noktaların bir Delaunay üçgenini hesapladım.
Delaunay üçgenlemesinde iki komşu nokta yeterince uzaksa ( ) ve işlev değeri bunlarda yeterince farklıysa ( ), o zaman bunların arasına yeni bir nokta eklerim. Bunu her komşu nokta çifti için yapıyorum.
Bu yöntemin nesi var?
Oldukça iyi çalışıyor, ama buna benzer fonksiyonlarda ideal değil çünkü numune noktaları sırtın üzerinden atlıyor, hatta orada olduğunu farketmiyorlar.
Bu gibi sonuçlar üretir (eğer başlangıç noktası ızgarasının çözünürlüğü yeterince kaba ise):
Yukarıdaki grafik, fonksiyon değerinin hesaplandığı noktaları göstermektedir (aslında etraflarındaki Voronoi hücreleri).
Yukarıdaki grafik aynı noktalardan üretilen doğrusal enterpolasyonu gösterir ve bunu Mathematica'nın yerleşik örnekleme yöntemiyle karşılaştırır (yaklaşık aynı başlangıç çözünürlüğü için).
Nasıl geliştirilir?
Buradaki asıl meselem, yöntemimin gradyanı temel alarak bir ayrıntılandırma noktası ekleyip eklememeye karar vermesi olduğunu düşünüyorum.
Arıtma noktaları eklerken eğriliği veya en azından ikinci türevi hesaba katmak daha iyi olacaktır.
Soru
Noktalarımın yerleri hiç kısıtlanmadığında ikinci türevi veya eğriliği hesaba katmanın çok basit bir yolu var mı? ( Başlamak için kare bir kafes ağına sahip olmak zorunda değilim , bu ideal olarak genel olmalı.)
Veya arıtma noktalarının konumunu en iyi şekilde hesaplamak için başka hangi basit yollar var?
Bunu Mathematica'da uygulayacağım, ama bu soru temelde yöntemle ilgili. "Uygulaması kolay" bit için, Mathematica'yı kullanmaya başladım sayılır (yani, şu ana kadar yapmak kolaydı çünkü Delaunay üçgenlemesi yapmak için bir paketi var)
Bunu uygulayacağım pratik problem
Faz diyagramı hesaplıyorum. Karmaşık bir şekle sahiptir. Bir bölgede değeri 0, başka bir bölgede 0 ile 1 arasındadır. İki bölge arasında keskin bir sıçrama vardır (süreksiz). Fonksiyonun sıfırdan büyük olduğu bölgede, hem bir miktar yumuşak değişim hem de bir kaç süreksizlik vardır.
Fonksiyon değeri bir Monte Carlo simülasyonuna dayanarak hesaplanır, bu nedenle zaman zaman hatalı bir fonksiyon değeri veya gürültü beklenebilir (bu çok nadirdir, ancak çok sayıda nokta için, örneğin sabit duruma ulaşılmadığında) bazı rastgele faktör)
Bunu daha önce Mathematica.SE'de sordum ama hala özel beta sürümünde olduğu için linkleyemiyorum. Buradaki soru uygulama ile değil yöntemle ilgilidir.
@Suki Yanıtla
Bu, önerdiğiniz bölünme türü mü, yani üçgenlerin ortasına yeni bir nokta koymak mı?
Buradaki kaygım, bölgenin kenarlarında özel işlem gerektiriyor görünmesi, aksi halde yukarıda gösterildiği gibi çok uzun ve çok ince üçgenler vermesi. Bunu düzelttin mi?
GÜNCELLEŞTİRME
Hem tarif ettiğim yöntemde hem de @ suki'nin üçgenlere dayalı alt bölme koyma ve alt bölme noktalarını üçgen içine koyma önerisiyle ortaya çıkan bir sorun, süreksizlik olduğunda (benim sorunumda olduğu gibi), bir adımdan sonra Delaunay üçgenlemesini yeniden hesaplamak olabilir. Üç köşenin değişmesine neden olabilir ve belki de üç köşede farklı işlev değerlerine sahip bazı büyük üçgenler görünebilir.
İşte iki örnek:
Birincisi, düz bir süreksizlik etrafında örnekleme yaparken nihai sonucu gösterir. İkincisi, benzer bir durum için örnekleme noktası dağılımını gösterir.
Bundan kaçınmanın basit yolları nelerdir? Şu anda sadece bir yeniden yapılandırma işleminden sonra kaybolan egdeleri alt bölümlere ayırıyorum, ancak bunun bir hack gibi hissettirdiği ve simetrik kafeslerde olduğu gibi dikkatli bir şekilde yapılması gereken (kare bir ızgara gibi) birkaç geçerli Delaunay üçgenlemesi olduğu için kenarlar değişebilir. retriangulation sonra rastgele.