2012-01-25 26 views
5

Tôi có vấn đề sau đây:bằng số Tích hợp với C++ trên lưới được với discretisation liên tục cố định

My C++ mã có tính hai chức năng

f1 (i1, i2, i3, i4)

f2 (j1, j2)

cho mỗi bộ {i1, i2, i3, i4} tôi nhận được một giá trị là f1 và cho mỗi bộ {j1, j2} tôi nhận được một số giá trị của f2.

các bộ {i1, i2, i3, i4} và {j1, j2} được đưa ra trên một lưới FIXED với một số bước discretisation liên tục "h".

tôi cần phải tính toán, bằng ngôn ngữ toán học, một F3 Integral (x1, x3) = Integral [f1 (x1, x2, x3, x4) * f2 (x3, x4) DX3 dx4]

Càng tổng kết đơn giản là không đủ tốt, vì f2 có nhiều bước nhảy.

Có thư viện C++ nào có thể thực hiện loại tích hợp này không? Hoặc một số algorhithm đó là dễ dàng để thực hiện (Tôi không thực sự tốt trên C++)

cảm ơn nhiều

Trả lời

3

Nếu bạn chỉ có giá trị tại các điểm lưới và không có kiến ​​thức toán học hơn nữa các hình thức của các đường cong có gì tốt hơn bạn có thể làm hơn là tổng kết tầm thường.

Không có cách nào khác hơn để thay đổi lưới hoặc sử dụng phương pháp hoàn toàn khác như http://en.wikipedia.org/wiki/Monte_Carlo_integration

+0

giả sử tôi biết các bước nhảy trên f2 và giả định rằng f1 đủ mịn. tôi có thể làm gì trong trường hợp đó? – Sankp

+0

Ý tôi là, nếu ví dụ chức năng của bạn là phân tích ở các vùng, nếu chúng là các hàm bước, splines, đa thức, vv. Sau đó, bạn có thể thực hiện tích phân chính xác trong các vùng đó và tổng các vùng.Bạn có biết chính xác hình dạng của f2 với độ chính xác cao hơn so với binning? Vậy tại sao bạn không thể đánh giá các chức năng tại các vị trí tùy ý để tích hợp? Chúng có tốn rất nhiều thời gian hoặc bạn có nhận được các chức năng từ một nơi khác trong một dạng bảng được không? Ngoài ra hãy xem câu trả lời của @ElKamina. Bạn sẽ cần một phiên bản 2d, như http://math.fullerton.edu/mathews/n2003/simpsonsrule2dmod.html –

+1

Đối với Monte Carlo, hãy xem các chương trình con fortran của VEGAS và MISER. Bạn có thể tìm thấy chúng tại www.netlib.org, hoặc như các phiên bản C trong cuốn sách Bí quyết số. Họ có thể giúp đối phó với thực tế là f2 không thường xuyên. –

1

Bạn có thể sử dụng quy tắc Simpson (http://en.wikipedia.org/wiki/Simpson%27s_rule). Nhưng, như Johan đã đề cập, nếu f2 là bước nhảy dốc và thất thường thì kích thước bước h là giải pháp duy nhất. Một cách tiếp cận khác mà bạn có thể muốn xem xét là biến h trên lưới. Đó là:

1. Start with a global common h 
2. Divide the space into smaller subspaces 
3. Calculate integral for each subspace 
4. Recalculate integral for each subspace using step size h/2 
5. For only subspaces where difference between integrals (h and h/2) is substantial repeat the above mentioned steps (From step 3) 
+0

Tốt, nhưng ông tuyên bố rằng lưới nếu cố định. Ngoài ra, phương pháp bạn đề xuất chỉ hoạt động cho các chức năng được xử lý tốt. –

+0

@JohanLundberg Tôi hoàn toàn đồng ý với bạn! – ElKamina

1

Tích hợp được xác định cho các chức năng của đối số thực. Do đó nếu bạn chỉ biết các hàm của bạn trên một lưới cố định, bạn cần cung cấp một quy tắc bổ sung về cách bạn định nghĩa hàm của mình cho các đối số ở giữa các điểm lưới. Điều này thực sự không liên quan gì đến lập trình, nó chỉ là toán học.

Ví dụ: nếu bạn biết rằng hàm của bạn có độ mịn hợp lý, bạn phải sử dụng phép nội suy tuyến tính. Một cái gì đó phức tạp hơn, nếu bạn cần. Nhưng không có một số quy tắc của loại này, vấn đề tích hợp chỉ đơn giản là không được xác định rõ.

Khi bạn có quy tắc như vậy - chỉ có thể đến từ ý nghĩa cơ bản của các hàm của bạn --- bạn có thể bắt đầu chọn thuật toán tích hợp. Đối với các chức năng của bốn biến, tôi muốn đề xuất thứ hai của Johan Lundberg để xem xét các nhà tích hợp Monte Carlo.

0

Bạn đã đề cập rằng bạn biết các bước nhảy trên f2, bạn không thể tách f2 thành f2 = f2a + f2b, ở đâu; f2a là một hàm mịn, trên đó, các phương thức tích phân số thông thường sẽ là đủ, và f2b là một hàm rất đơn giản với các bước nhảy, mà bạn có thể tính toán phân tích khu vực vì nó đơn giản. Sau đó, bạn chỉ có thể thêm các giá trị kể từ khi tích hợp là một hoạt động tuyến tính. Tất cả phụ thuộc vào những gì bạn biết về f2 thực sự, tôi nghĩ.

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