Yapılandırılmamış ızgaralar için verimli enterpolasyon yöntemi?


12

Bir yapılandırılmış ızgara arasında veri enterpolasyonu için iyi bir yöntem bilmek istiyorum, burada bir ızgara diğerinin daha kaba bir versiyonu.

Verimlilik benim için çok önemlidir, çünkü çözümün her adımında ızgaralar arasında veri aktarmam gereken geçici bir PDE problemini çözüyorum.

Belirli bir noktanın en yakın düğümünü aramak için kd ağacını kullanmayı düşündüm, sonra verileri enterpolasyonlamak için o elemanın şekil fonksiyonlarını (FEM simülasyonu) kullanırdım. Bu iyi bir çözüm mü? Daha iyileri var mı?

Ayrıca bu görev için C / C ++ 'da sağlam ve güvenilir bir kütüphane biliyor musunuz?

* Benzer bir soru olduğunu biliyorum, ama yapılandırılmış bir ızgara üzerinde en doğru yöntemi istiyor.


Bu soru-cevap bölümüne bakın, bunun için açık kaynak yöntemleri bir sürü topladım
denfromufa

Yanıtlar:


6

Yapılandırılmamış ızgaraların yerleri vardır.

Earth Sistem Modelleme Çerçevesine (ESMF) bakmak isteyebilirsiniz. Yeniden ızgara için bazı kodları var - özellikle bu amaç için - ve paralel kod ile bazı şık şeyler de yaptılar. Tüm sistem modelleri birleştirmek için tasarlanmıştır, bu yüzden orada başka yararlı şeyler de olabilir.

Diğer bazı notlar:

"Bunu önemli sayıda nokta için verimli bir şekilde yapmanın bir yolu yok"

iyi, verimli göreceli bir şeydir - bir ağaç yapısında ızgaraya sahip olduğunuzda, onu O (1) içinde arayabilirsiniz, O (1) olmasa da oldukça hızlı olabilir, normal bir ızgara aramak gibi dır-dir.

Ayrıca, enterpolasyonun her zaman adımında yapılması gerekiyorken, ızgaralar adapte değilse, bir ızgaradan diğerine eşleme sabit kalır. Böylece, uygun bir şekilde eşleştirmeyi (yani her bir ızgaradaki hangi öğenin diğer öğeye hangi öğeye karşılık geldiğini) hesaplayabilir, saklayabilir ve daha sonra (ağlar değişene kadar) onu asla hesaplamanız gerekmez.

Bu, sizi - doğruluk ile performans arasında dengelemek isteyeceğiniz yerde - enterpolasyon koduyla bırakır - bir üçgen boyunca basit doğrusal enterpolasyon hızlıdır ve yeterince iyi olabilir.

"Belirli bir noktanın en yakın düğümünü aramak için kd ağacını kullanmayı düşündüm, o zaman o elemanın şekil fonksiyonlarını kullanırdım"

en yakın düğümün size eleman bulamadığını unutmayın - böylece istediğiniz elemanı bulmak için biraz daha fazlasını yapmak istersiniz. Seçeneklerden biri, sınırlayıcı kutuya göre depolayan / arama yapan bir rtree kullanmak olacaktır - her aramada birden fazla öğe alırsınız, ancak bunlardan hangisinin doğrudan doğru olduğunu kontrol edebilirsiniz.


Güzel görünüyor. Kafesleri uyarlamak zorunda değilim, bu yüzden bir ızgaradan diğerine eşleme sadece bir kez yapılacaktır. R-ağacı veri yapısı hakkındaki ipucu için teşekkürler.
Bernardo MR

1
O(N)O(logN)

7

Sizi doğru anlarsam, daha kaba ızgaraya enterpolasyon yaparak daha ince ızgara değerlerini doldurmak istersiniz. Yapılandırılmamış bir ızgarada doğrusal enterpolasyon yapmanın bir yolu Delaunay üçgenlemeleridir (Matlab'ın ızgara verileri ve TriScatteredInterp komutları bu şekilde uygulanır). Izgara noktalarınızın bir üçgenlemesini oluşturduktan sonra, enterpolasyon hedef noktayı içeren üçgeni bulmak, barycentric koordinatlarını hesaplamak ve enterpolasyonlu değeri hesaplamak için köşelerde fonksiyon değerlerini kullanmak için kaynar. CGAL n-boyutlu üçgenleme oluşturabilir (orta n için) ve ayrıca dahili bir 2d enterpolasyon modülüne sahiptir.


Evet. Ama aynı zamanda ince ızgaradan kaba ızgaraya da "enjekte etmek" istiyorum, bu yüzden transfer dedim.
Bernardo MR

3

Düğümlere değil, kareleme noktalarına fonksiyon değerleri aktarıyorum dışında, şu anda yaptığım şey bu. Buradaki soruma seçilen cevapta açıklanan tekniği uyguluyorum: Hangi üçgen noktalarının bulunduğunu bulmak .

ABAB

  1. BpiA
  2. pi
  3. AA
  4. Ap1p2p3A

NMAO(NM)O(max(N,M))


2

Bu, yapılandırılmamış kafeslerden kaçınmak istediğiniz gerçekten bir iştir, çünkü bunu önemli sayıda nokta için verimli bir şekilde yapmanın bir yolu yoktur. Her biri ile en azından bir şekilde ilişkili kafesler kullanmayı düşünmelisiniz. Örneğin, her ikisi de kaba bir ağın hiyerarşik olarak geliştirilmesinden elde edildiyse, bir ağın enterpolasyon noktalarının diğer ağda nerede bulunduğunu nispeten kolay ve verimli bir şekilde bulabilirsiniz.


Bunun en iyi seçenek olabileceğini düşünüyorum (ızgaralar hiyerarşisi). Bu durumda, iyi bir veri yapısı veya kullanılacak belirli bir yöntem biliyor musunuz?
Bernardo MR

Evet, hiyerarşik kafeslerin hepsi dörtlü / sekizli ağaçlar (tek bir kaba hücrede başlarlarsa) veya bu tür ağaçların ormanları (kaba kafesin birden fazla hücresi varsa) olarak saklanır.
Wolfgang Bangerth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.