Phương pháp nội suy hiệu quả cho lưới không cấu trúc?


12

Tôi muốn biết một phương pháp tốt để nội suy dữ liệu giữa hai lưới không có cấu trúc, trong đó một lưới là phiên bản thô hơn của lưới kia.

Hiệu quả rất quan trọng đối với tôi vì tôi đang giải quyết vấn đề PDE thoáng qua, nơi tôi cần chuyển dữ liệu giữa các lưới ở mỗi bước của giải pháp.

Tôi đã nghĩ về việc sử dụng kd-tree để tìm kiếm nút gần nhất của một điểm đã cho, sau đó tôi sẽ sử dụng các hàm hình dạng của phần tử đó (mô phỏng FEM) để nội suy dữ liệu. Đây có phải là một giải pháp tốt? Có những cái tốt hơn?

Bạn có biết bất kỳ thư viện mạnh mẽ và đáng tin cậy nào trong C / C ++ cho nhiệm vụ này không?

* Tôi biết có một câu hỏi tương tự, nhưng nó yêu cầu phương pháp chính xác nhất trên lưới có cấu trúc.


xem phần hỏi đáp này, tôi đã thu thập một loạt các phương thức nguồn mở cho việc này: scicomp.stackexchange.com/questions/19137/ trộm
denfromufa

Câu trả lời:


6

Lưới không cấu trúc có vị trí của họ.

Bạn có thể muốn xem xét Khung mô hình hệ thống trái đất (ESMF). Họ có một số mã để tái tạo lưới - đặc biệt cho mục đích này - và họ cũng đã thực hiện một số nội dung tiện lợi với mã song song. Toàn bộ hệ thống được thiết kế để ghép các mô hình, vì vậy có thể có những thứ hữu ích khác ở đó.

Một số lưu ý khác:

"không có cách nào để làm điều này một cách hiệu quả cho bất kỳ số điểm đáng kể nào"

tốt, hiệu quả là một điều tương đối - một khi bạn đã có lưới trong cấu trúc cây, bạn có thể tìm kiếm nó trong O (logn), có thể khá nhanh, mặc dù không phải O (1), như tìm kiếm lưới thông thường Là.

Ngoài ra, có vẻ như trong khi nội suy cần phải được thực hiện ở mọi bước, nếu lưới không thích ứng, thì ánh xạ từ lưới này sang lưới khác không đổi. Vì vậy, bạn có thể tính toán ánh xạ đó (tức là phần tử nào trong mỗi lưới tương ứng với phần tử khác) theo bất kỳ cách nào thuận tiện, lưu trữ nó, và sau đó bạn không bao giờ cần phải tính toán nó (cho đến khi lưới thay đổi).

Điều đó khiến bạn có mã nội suy - nơi bạn sẽ muốn cân bằng độ chính xác với hiệu suất - phép nội suy tuyến tính đơn giản trên một tam giác là nhanh và có thể đủ tốt.

"Tôi đã nghĩ về việc sử dụng kd-tree để tìm kiếm nút gần nhất của một điểm đã cho, sau đó tôi sẽ sử dụng các hàm hình dạng của phần tử đó"

hãy nhớ rằng nút gần nhất không giúp bạn có được phần tử - vì vậy bạn sẽ muốn làm thêm một chút để tìm phần tử bạn muốn. Thay vào đó, một tùy chọn sẽ là sử dụng rtree, lưu trữ / tìm kiếm theo hộp giới hạn - bạn sẽ nhận được nhiều hơn một yếu tố với mỗi tìm kiếm, nhưng sau đó bạn có thể kiểm tra xem cái nào là chính xác.


Điều này có vẻ tốt đẹp. Tôi không cần phải điều chỉnh các mắt lưới, vì vậy việc ánh xạ từ lưới này sang lưới khác sẽ chỉ được thực hiện một lần. Cảm ơn các mẹo về cấu trúc dữ liệu r-cây.
Bernardo MR

1
O(N)O(logN)

7

Nếu tôi hiểu bạn một cách chính xác, bạn muốn điền vào các giá trị của lưới mịn hơn bằng cách nội suy trên lưới thô hơn. Một cách để thực hiện phép nội suy tuyến tính trên lưới không có cấu trúc là với các tam giác Delaunay (đây là cách thực hiện các lệnh griddata và TriScatterInterp của Matlab). Sau khi xây dựng một tam giác các điểm lưới của bạn, phép nội suy sôi xuống để định vị tam giác chứa điểm đích, tính toán tọa độ nhị phân của nó và sử dụng các giá trị hàm tại các đỉnh để tính giá trị nội suy. CGAL có thể xây dựng các tam giác n chiều (cho n trung bình) và cũng có mô-đun nội suy 2d tích hợp .


Đúng. Nhưng tôi cũng muốn "tiêm" các giá trị từ lưới mịn vào lưới thô, đó là lý do tại sao tôi nói chuyển khoản.
Bernardo MR

3

Đây là những gì tôi đang làm hiện tại, ngoại trừ tôi đang chuyển các giá trị hàm tại các điểm cầu phương, không phải các nút. Tôi đang thực hiện kỹ thuật được giải thích trong câu trả lời được chọn cho câu hỏi của tôi ở đây: Tìm kiếm điểm tam giác nào .

ABAB

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

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


2

Đây là loại công việc mà bạn thực sự muốn tránh các mắt lưới không có cấu trúc vì không có cách nào để thực hiện điều này một cách hiệu quả cho bất kỳ số điểm đáng kể nào. Bạn nên xem xét sử dụng các mắt lưới ít nhất bằng cách nào đó liên quan đến nhau. Ví dụ, nếu cả hai đều thu được từ sàng lọc phân cấp của lưới thô, thì bạn có thể tìm thấy tương đối dễ dàng và hiệu quả nơi các điểm nội suy của một lưới nằm trên lưới khác.


Tôi nghĩ rằng đó có thể là lựa chọn tốt nhất (hệ thống phân cấp của lưới). Nếu đây là trường hợp, bạn có biết bất kỳ cấu trúc dữ liệu tốt, hoặc phương pháp cụ thể để sử dụng?
Bernardo MR

Có, tất cả các lưới phân cấp đều được lưu trữ dưới dạng cây bốn / oct (nếu chúng bắt đầu trên một ô thô) hoặc rừng của các cây đó (nếu lưới thô có nhiều hơn một ô).
Wolfgang Bangerth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.