2010-02-02 36 views
7

Sử dụng chức năng interpolate.splprep của scipy có được một tham số spline trên tham số u, nhưng tên miền của u không phải là tích phân dòng của đường spline, nó là một kết nối tuyến tính cân bằng của tọa độ đầu vào. Tôi đã thử integrate.splint, nhưng điều đó chỉ cung cấp cho các tích phân riêng lẻ trên u. Rõ ràng, tôi có thể tích hợp số lượng khoảng cách chênh lệch Descartes, nhưng tôi đã tự hỏi liệu có phương pháp dạng khép kín để có chiều dài của một đoạn spline hay spline (sử dụng scipy hoặc gumpy) mà tôi đã xem.Tìm chiều dài của một khối B-spline

Chỉnh sửa: Tôi đang tìm giải pháp dạng kín hoặc cách rất nhanh để hội tụ với câu trả lời chính xác của máy. Tôi có tất cả nhưng đã từ bỏ các phương pháp tìm kiếm số nguyên và bây giờ chủ yếu là sau một câu trả lời dạng đóng. Nếu bất cứ ai có bất kỳ kinh nghiệm tích hợp chức năng elip hoặc có thể chỉ cho tôi một nguồn lực tốt (khác hơn Wolfram), Điều đó sẽ là tuyệt vời.

Tôi sẽ cố gắng Maxima để cố gắng có được không thể thiếu không xác định những gì tôi tin là chức năng cho một phân đoạn của spline: Tôi Cross-đăng này trên MathOverflow

Trả lời

6

Bởi vì cả hai x & y là khối các hàm tham số, không có một giải pháp khép kín nào về các hàm đơn giản. Tích hợp số là cách để đi. Hoặc là tích hợp biểu thức chiều dài hồ quang hoặc chỉ cần thêm độ dài đoạn đường - phụ thuộc vào độ chính xác bạn đang theo dõi và mức độ nỗ lực bạn muốn thực hiện.

Một chính xác và nhanh chóng "Thêm chiều dài của đoạn thẳng" phương pháp:

Sử dụng recurvise phân khu (một dạng của thuật toán de Casteljeau của) để tạo điểm, có thể cung cấp cho bạn một đại diện chính xác cao với số lượng tối thiểu của các điểm . Chỉ chia nhỏ phân mục nếu chúng không đáp ứng tiêu chí. Thông thường các tiêu chí được dựa trên chiều dài tham gia các điểm kiểm soát (thân tàu hoặc lồng). Đối với hình khối, thường so sánh sự gần gũi của P0P1 + P1P2 + P2P3 với P0P3, trong đó P0, P1, P2 & P3 là các điểm kiểm soát xác định bezier của bạn.

Bạn có thể tìm thấy một số mã Delphi ở đây: link text

Nó phải là tương đối dễ dàng để chuyển đổi sang Python. Nó sẽ tạo ra các điểm. Mã đã tính toán độ dài của các phân đoạn để kiểm tra các tiêu chí. Bạn chỉ có thể tích lũy các giá trị độ dài đó trên đường đi.

+0

Giải pháp này là tốt đẹp cho xấp xỉ, nhưng tôi nên đã nêu trong câu hỏi của tôi rằng tôi sau một câu trả lời chính xác hoặc máy chính xác. Nó tương tự như giải pháp romberg của EOL, nhưng tôi sẽ phải lặp lại trong python tinh khiết. – Paul

+0

Khi giải pháp phân tích chung liên quan đến tích phân elliptic bạn sẽ được tích hợp số không có vấn đề gì phương pháp tiếp cận bạn có. Phương pháp tôi đã phác thảo không trực tiếp tích hợp biểu thức độ dài vòng cung nhưng cũng là tích hợp số. Tất cả những gì quan trọng là phương pháp hội tụ với độ chính xác mong muốn trong một thời gian mong muốn. – symmetry

+0

Để chính xác hơn một chút về những độ dài mà tôi đã đề cập đến mà bạn sẽ tích luỹ dọc theo con đường ... hãy xem tại đây: http://steve.hollasch.net/cgindex/curves/cbezarclen.html Sử dụng độ dài trung bình của thân tàu (L1) và chiều dài hợp âm (L0) để ước tính độ dài vòng cung của các phân đoạn riêng lẻ. – symmetry

4

Bạn có thể tích hợp hàm sqrt(x'(u)**2+y'(u)**2) qua u, trong đó bạn tính các dẫn xuất x'y' tọa độ của bạn với scipy.interpolate.splev. Việc tích hợp có thể được thực hiện với một trong các thói quen từ scipy.integrate (quad chính xác là [Clenshaw-Curtis], romberg thường nhanh hơn). Điều này sẽ chính xác hơn và có lẽ nhanh hơn việc thêm nhiều khoảng cách nhỏ (tương đương với tích hợp với quy tắc hình chữ nhật).

+0

Tôi thích giải pháp này vì bạn có thể thiết lập độ chính xác mong muốn, nhưng tiếc là tôi sau khi độ chính xác loại máy chính xác. Tôi đã thực hiện đề xuất của bạn, nhưng QUADPACK (tuyệt vời như nó) không đáp ứng các yêu cầu về hiệu suất của tôi. Tôi hiện đang tìm kiếm một giải pháp dạng đóng và đã đăng chéo trên MathOverflow. BTW: Clenshaw-Curtis chỉ chính xác/chính xác cho đa thức. Chiều dài của spline này là một hàm elip. – Paul

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