2013-05-18 88 views
23

Tôi có một tập hợp các điểm 3D xác định đường bao 3D. Những gì tôi muốn làm là để có được đại diện bề mặt tối thiểu tương ứng với đường viền này (see Minimal Surfaces in Wikipedia). Về cơ bản, điều này đòi hỏi phải giải quyết một phương trình vi phân từng phần phi tuyến.Giải pháp bề mặt tối thiểu trong Python

Trong Matlab, điều này gần như đơn giản bằng cách sử dụng hàm pdenonlin(see Matlab's documentation). Một ví dụ về cách sử dụng của nó để giải quyết một vấn đề bề mặt tối thiểu có thể được tìm thấy ở đây: Minimal Surface Problem on the Unit Disk.

Tôi cần thực hiện như vậy trong Python, nhưng tôi biết rằng tôi chưa tìm thấy bất kỳ tài nguyên web nào về cách thực hiện điều này.

Có ai có thể chỉ cho tôi bất kỳ tài nguyên/ví dụ nào về việc triển khai như vậy không?

Xin cảm ơn, Miguel.

CẬP NHẬT

Bề mặt 3D (lý tưởng một lưới đại diện hình tam giác) Tôi muốn tìm giáp này tập hợp các điểm 3D (như đã thấy trong hình này, các điểm nằm trong mặt phẳng tốt nhất điều chỉnh kích thước) :

enter image description here

Ok, làm như vậy một số nghiên cứu tôi thấy rằng vấn đề bề mặt tối thiểu này có liên quan với các giải pháp của các Biharmonic Equation, và tôi cũng phát hiện ra rằng Thin-plate spline sự là giải pháp cơ bản để phương trình này.

Vì vậy, tôi nghĩ rằng cách tiếp cận sẽ là cố gắng để phù hợp với đại diện thưa thớt của bề mặt (được đưa ra bởi các đường viền 3D của các điểm) bằng cách sử dụng splines tấm mỏng. Tôi tìm thấy this example in scipy.interpolate nơi dữ liệu phân tán (x, y, z định dạng) được nội suy bằng cách sử dụng splines tấm mỏng để có được tọa độ ZI trên lưới đồng nhất (XI, YI).

Hai câu hỏi phát sinh: (1) Nội suy spline mỏng có phải là phương pháp chính xác cho vấn đề tính toán bề mặt từ tập hợp các điểm đường viền 3D không? (2) Nếu vậy, làm thế nào để thực hiện nội suy tấm mỏng trên scipy với một mạng lưới không phải là UNIFORM?

Cảm ơn bạn lần nữa! Miguel

UPDATE: THỰC HIỆN TRÊN MATLAB (nhưng nó không làm việc trên scipy PYTHON)

Tôi đi theo this example sử dụng chức năng tpaps Matlab và thu được bề mặt tối thiểu được trang bị cho đường viền của tôi trên một mạng lưới thống nhất. Đây là kết quả trong Matlab (trông tuyệt vời!): enter image description here

Tuy nhiên tôi cần phải thực hiện điều này bằng Python, vì vậy tôi đang sử dụng gói scipy.interpolate.Rbf và thin-plate chức năng.Dưới đây là mã trong python (XYZ chứa tọa độ 3D của mỗi điểm trong đường viền):

GRID_POINTS = 25 
x_min = XYZ[:,0].min() 
x_max = XYZ[:,0].max() 
y_min = XYZ[:,1].min() 
y_max = XYZ[:,1].max() 
xi = np.linspace(x_min, x_max, GRID_POINTS) 
yi = np.linspace(y_min, y_max, GRID_POINTS) 
XI, YI = np.meshgrid(xi, yi) 

from scipy.interpolate import Rbf 
rbf = Rbf(XYZ[:,0],XYZ[:,1],XYZ[:,2],function='thin-plate',smooth=0.0) 
ZI = rbf(XI,YI) 

Tuy nhiên đây là kết quả (khá khác nhau từ đó thu được trong Matlab):

enter image description here

Rõ ràng là kết quả của sciper không tương ứng với một bề mặt tối thiểu.

Là scipy.interpolate.Rbf + tấm mỏng hoạt động như mong đợi, tại sao nó khác với kết quả của Matlab?

+0

Chính xác mối quan hệ giữa các điểm 3d của bạn và đầu ra mong muốn của bạn là gì? Bạn có điểm mà nằm khoảng trên bề mặt tối thiểu, và bạn đang tìm kiếm một mô tả đại số của bề mặt đó? Hoặc làm các điểm mô tả một số loại ranh giới, và bạn đang tìm kiếm bề mặt tối thiểu được xác định bởi ranh giới đó? Bạn nên tạo ra biểu mẫu nào? Nó có thể giúp xem toàn bộ mã MATLAB, để người ta có thể tìm cách để dịch mà thậm chí không hiểu sự giải nghĩa là bề mặt tối thiểu. Https://launchpad.net/cbcpdesys có hữu ích không? – MvG

+0

@MvG: xem thêm chi tiết trong câu hỏi được cập nhật của tôi. (1) Các điểm nằm khoảng trên bề mặt tối thiểu; (2) Các điểm mô tả ranh giới của bề mặt chưa thu được, (3) Lý tưởng nhất là loại bề mặt mà tôi muốn thu được là một biểu diễn lưới tam giác. – CodificandoBits

+0

Hãy thử hỏi trong http://scicomp.stackexchange.com. – lhf

Trả lời

1

Câu hỏi nêu rõ rằng chúng ta cần giải một phương trình vi phân từng phần phi tuyến. Tuy nhiên, Wikipedia nói rằng 'Chúng rất khó học: hầu như không có kỹ thuật chung nào hoạt động cho tất cả các phương trình như vậy, và thường mỗi phương trình riêng lẻ phải được nghiên cứu như một vấn đề riêng biệt'. Tuy nhiên, bạn đã không đưa ra phương trình! Và đôi khi Matlab sử dụng các thuật toán di truyền để đến bề mặt của nó? Nghĩa là, nó có sử dụng quy tắc ngón tay cái để đoán tốt nhất và sau đó thử các biến thể nhỏ trong ô vuông thành phần cho đến khi không tìm thấy bề mặt nhỏ hơn. Việc thực hiện loại giải pháp đó sẽ rất tốn kém nhưng không khó khăn về mặt khái niệm (giả sử bạn thích loại điều đó). Cũng nên nhớ rằng phép tính của hàm liên tục chỉ là một trường hợp đặc biệt của phép tính của tất cả các xấp xỉ tuyến tính của các hàm (giá trị gia tăng được đặt bằng không thay vì một số giá trị hữu hạn). Điều này đã được thực hiện rõ ràng với tôi bằng cách đọc những cuốn sách của J L Bell trên phân tích vô cùng mịn - chỉ cần sử dụng đại số với gia số hữu hạn và để lại các yếu tố kết quả trong các dẫn xuất thay vì 'bỏ qua' chúng.

0

Rõ ràng là Matlab và SciPy hiểu TPS theo nhiều cách khác nhau. Việc thực hiện Matlab có vẻ chính xác. SciPy xử lý TPS theo cách tương tự như các RBF khác, vì vậy bạn có thể thực hiện nó một cách chính xác bằng Python - sẽ đủ để tạo thành ma trận của hệ phương trình tuyến tính có liên quan và giải quyết nó để nhận hệ số TPS.

Các vấn đề liên quan