Tôi có hàm hai chiều có giá trị tôi muốn lấy mẫu. Hàm này rất tốn kém để tính toán và nó có hình dạng phức tạp, vì vậy tôi cần tìm cách để có được nhiều thông tin nhất về hình dạng của nó bằng cách sử dụng số lượng điểm mẫu ít nhất.
Có những phương pháp tốt nào để làm điều này?
Những gì tôi có cho đến nay
Tôi bắt đầu từ một tập hợp các điểm hiện có nơi tôi đã tính giá trị hàm (đây có thể là một mạng vuông các điểm hoặc một cái gì đó khác).
Sau đó, tôi tính toán một tam giác Delaunay của những điểm này.
Nếu hai điểm lân cận trong tam giác Delaunay đủ xa ( ) và giá trị hàm khác nhau đủ trong chúng ( ), thì tôi sẽ chèn một điểm mới ở giữa chúng. Tôi làm điều này cho mỗi cặp điểm lân cận.> Δ f
Có gì sai với phương pháp này?
Chà, nó hoạt động tương đối tốt, nhưng trên các chức năng tương tự như cái này thì không lý tưởng vì các điểm mẫu có xu hướng "nhảy qua" sườn núi và thậm chí không nhận thấy nó ở đó.
Nó tạo ra kết quả như thế này (nếu độ phân giải của lưới điểm ban đầu đủ thô):
Biểu đồ trên cho thấy các điểm mà giá trị hàm được tính (thực tế là các ô Voronoi xung quanh chúng).
Biểu đồ trên cho thấy phép nội suy tuyến tính được tạo từ cùng một điểm và so sánh nó với phương pháp lấy mẫu tích hợp của Mathicala (cho cùng độ phân giải bắt đầu).
Làm thế nào để cải thiện nó?
Tôi nghĩ vấn đề chính ở đây là phương pháp của tôi quyết định có nên thêm điểm tinh chỉnh hay không dựa trên độ dốc.
Sẽ tốt hơn nếu tính đến độ cong hoặc ít nhất là đạo hàm thứ hai khi thêm các điểm tinh chỉnh.
Câu hỏi
Một cách rất đơn giản để thực hiện cách tính đến đạo hàm hoặc độ cong thứ hai khi vị trí các điểm của tôi không bị hạn chế chút nào? (Tôi không nhất thiết phải có một mạng vuông các điểm bắt đầu, điều này lý tưởng là chung chung.)
Hoặc có những cách đơn giản nào khác để tính toán vị trí của các điểm sàng lọc một cách tối ưu?
Tôi sẽ thực hiện điều này trong Mathematica, nhưng câu hỏi này chủ yếu là về phương pháp. Đối với bit "dễ thực hiện", có nghĩa là tôi đang sử dụng Mathicala (nghĩa là điều này rất dễ thực hiện vì nó có gói để thực hiện tam giác Delaunay)
Vấn đề thực tế nào tôi đang áp dụng điều này cho
Tôi đang tính toán một sơ đồ pha. Nó có hình dạng phức tạp. Trong một khu vực, giá trị của nó là 0, ở một khu vực khác, nó nằm trong khoảng từ 0 đến 1. Có một bước nhảy mạnh giữa hai khu vực (không liên tục). Trong khu vực có hàm lớn hơn 0, có cả một số biến đổi trơn tru và một vài điểm không liên tục.
Giá trị hàm được tính toán dựa trên mô phỏng Monte Carlo, do đó, đôi khi giá trị hàm hoặc nhiễu không chính xác được dự kiến (điều này rất hiếm, nhưng đối với một số lượng lớn điểm xảy ra, ví dụ: khi không đạt đến trạng thái ổn định một số yếu tố ngẫu nhiên)
Tôi đã hỏi điều này trên Mathicala.SE nhưng tôi không thể liên kết với nó vì nó vẫn ở phiên bản beta riêng tư. Câu hỏi này ở đây là về phương pháp, không phải việc thực hiện.
Trả lời @suki
Đây có phải là loại phân chia mà bạn đề xuất, tức là đặt một điểm mới ở giữa các hình tam giác?
Mối quan tâm của tôi ở đây là nó dường như đòi hỏi phải xử lý đặc biệt ở các cạnh của khu vực, nếu không nó sẽ cho hình tam giác rất dài và rất mỏng, như được hiển thị ở trên. Bạn đã sửa cho điều này?
CẬP NHẬT
Một vấn đề xuất hiện cả với phương pháp tôi mô tả và với đề xuất của @ suki là đặt phân chia dựa trên các hình tam giác và đặt các điểm phân chia bên trong tam giác là khi có sự không liên tục (như trong vấn đề của tôi), tính toán lại tam giác Delaunay sau một bước có thể làm cho các hình tam giác thay đổi và có lẽ một số hình tam giác lớn xuất hiện có các giá trị hàm khác nhau trong ba đỉnh.
Đây là hai ví dụ:
Đầu tiên cho thấy kết quả cuối cùng khi lấy mẫu xung quanh một gián đoạn thẳng. Thứ hai cho thấy phân phối điểm lấy mẫu cho một trường hợp tương tự.
Có những cách đơn giản nào để tránh điều này? Hiện tại tôi chỉ đơn giản là phân chia các ví dụ đó biến mất sau khi lấy lại, nhưng điều này cảm thấy giống như một vụ hack và cần được thực hiện cẩn thận như trong trường hợp các lưới đối xứng (như lưới vuông) có một số tam giác Delaunay hợp lệ, do đó các cạnh có thể thay đổi ngẫu nhiên sau khi lấy lại.