Ефективний метод інтерполяції для неструктурованих сіток?


12

Я хотів би знати хороший метод інтерполяції даних між двома неструктурованими сітками, де одна сітка є грубішою версією іншої.

Ефективність дуже важлива для мене, оскільки я вирішую тимчасову проблему PDE, де мені потрібно переносити дані між сітками на кожному кроці рішення.

Я думав про те, щоб використовувати kd-дерево для пошуку найближчого вузла даної точки, тоді я використав би функції форми цього елемента (моделювання FEM) для інтерполяції даних. Це гарне рішення? Чи є кращі?

Ви також знаєте будь-яку надійну та надійну бібліотеку на C / C ++ для цього завдання?

* Я знаю, що існує подібне питання, але він вимагає найбільш точного методу в структурованій сітці.


дивіться це питання і запитання, я зібрав для цього купу методів з відкритим кодом: scicomp.stackexchange.com/questions/19137/…
denfromufa

Відповіді:


6

Неструктуровані сітки мають своє місце.

Можливо, ви захочете переглянути рамки моделювання систем Землі (ESMF). У них є код для повторної сітки - спеціально для цієї мети - і вони теж зробили чудові речі з паралельним кодом. Вся система розрахована на пару моделей, тому там можуть бути й інші корисні речі.

Деякі інші примітки:

"жоден спосіб зробити це ефективно для будь-якої значної кількості балів"

ну, ефективність - це відносна річ - як тільки ви отримаєте сітку в структурі дерева, ви можете шукати її в O (logn), що може бути досить проклятим швидко, хоча і не O (1), як пошук звичайної сітки є.

Крім того, це здається, що інтерполяцію потрібно робити на кожному кроці, якщо сітки не адаптуються, то відображення з однієї сітки в іншу залишається постійним. Таким чином, ви можете обчислити це відображення (тобто, який елемент у кожній сітці відповідає якому елементу в іншій) будь-яким зручним способом, зберігати його, і тоді вам ніколи не потрібно буде обчислювати його agin (поки сітки не зміняться).

Це дає вам код інтерполяції - там, де ви хочете збалансувати точність та продуктивність, - проста лінійна інтерполяція через трикутник швидко і може бути достатньо хорошою.

"Я думав про використання kd-дерева для пошуку найближчого вузла даної точки, тоді я використовував би функції форми цього елемента"

пам’ятайте, що найближчий вузол не отримує вам елемент - тому ви хочете зробити трохи більше, щоб знайти потрібний елемент. Одним із варіантів може бути замість цього rtree, який зберігає / здійснює пошук за обмежувальним вікном - ви отримуєте більше одного елемента при кожному пошуку, але потім можете перевірити, який із них правильний.


Це добре виглядає. Мені не потрібно адаптувати сітки, тому відображення з однієї сітки в іншу буде зроблено лише один раз. Дякуємо за пораду про структуру даних r-tree.
Бернардо MR

1
O(N)O(logN)

7

Якщо я вас правильно зрозумів, ви хочете заповнити значення більш тонкої сітки шляхом інтерполяції на більш грубу сітку. Один із способів зробити лінійну інтерполяцію на неструктурованій сітці - це триангуляції Делоне (саме так реалізовані команди Matlab griddata та TriScatteredInterp). Після побудови триангуляції точок сітки інтерполяція зводиться до розміщення трикутника, що містить цільову точку, обчислення її барицентричних координат та використання значень функції у вершинах для обчислення інтерпольованого значення. CGAL може побудувати n-мірні триангуляції (для середнього n), а також має вбудований 2d інтерполяційний модуль.


Так. Але я також хочу "ввести" значення з тонкої сітки в грубу сітку, і тому я сказав передачу.
Бернардо MR

3

Це те, що я роблю на даний момент, за винятком того, що я передаю значення функцій у квадратурних точках, а не на вузлах. Я впроваджую техніку, пояснену в обраній відповіді на моє запитання тут: Знаходження, в яких точках трикутників .

ABAB

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

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


2

Це та робота, для якої ви дійсно хочете уникати неструктурованих сіток, оскільки немає можливості зробити це ефективно для будь-якої значної кількості балів. Слід розглянути можливість використання сіток, які хоча б якимось чином пов'язані з кожним. Наприклад, якщо вони обидва отримані в результаті ієрархічного уточнення грубої сітки, то можна порівняно легко і ефективно дізнатися, де точки інтерполяції однієї сітки розташовані на іншій сітці.


Я думаю, що це може бути найкращим варіантом (ієрархія сіток). Якщо це так, чи знаєте ви якусь хорошу структуру даних чи конкретний метод використання?
Бернардо MR

Так, ієрархічні сітки зберігаються як квадратичні / октябристичні дерева (якщо вони починаються на одній грубій осередку) або ліси таких дерев (якщо груба сітка має комірку більше ніж один раз).
Вольфганг Бангерт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.