2012-01-25 24 views
5

我有以下問題:數值積分用C++與固定的恆定的離散給定網格

我的C++代碼可以計算兩個函數

F1(I1,I2,I3,I4)

對於每組{i1,i2,i3,i4},我得到f1的一些值,並且對於每組{j1,j2}我得到f2的某個值。

集合{i1,i2,i3,i4}和{j1,j2}在具有某個常量離散化步驟「h」的FIXED網格上給出。

我需要計算,在數學語言,積分F3(X1,X3)=積分[F1(X1,X2,X3,X4)* F2(X3,X4)DX3 DX4]

的所述簡單求和不夠好,因爲f2有很多跳躍。

是否有一些可以做這種整合的C++庫?或者一些algorhithm這是很容易實現(我不是第C真的好++)

千恩萬謝

回答

3

如果你只有在網格點的數值和曲線的形式沒有進一步的數學知識有什麼你可以做得比平凡的總結更好。

有沒有別的辦法,而不是更改網格或使用完全其它方法,如http://en.wikipedia.org/wiki/Monte_Carlo_integration

+0

假設我知道f2上的跳躍,並假設f1足夠平滑。在這種情況下我能做些什麼? – Sankp

+0

我的意思是,例如,如果你的函數在區域中是分析的,如果它們是階梯函數,樣條曲線,多項式等等。那麼你可以在這些區域中做精確的積分並求和這些區域。你是否知道f2的確切形狀,其精度要高於分檔?那麼爲什麼你不能評估集成的任意位置的功能?他們是非常耗時的,還是以表格的形式從其他地方獲取函數?也可以看看@ElKamina的答案。你需要一個二維版本,比如http://math.fullerton.edu/mathews/n2003/simpsonsrule2dmod.html –

+1

對於蒙特卡洛,看看VEGAS和MISER好的fortran子程序。你也許可以在www.netlib.org找到它們,或者在Numerical Recipes的書中找到C版本。他們可能有助於應對f2不規則的事實。 –

1

您可以使用辛普森法則(http://en.wikipedia.org/wiki/Simpson%27s_rule)。但是,正如Johan所說,如果f2是陡峭而不穩定的遞減步長h是唯一的解決方案。您可能想要考慮的另一種方法是在網格中使用變量h。那就是:

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

好,但他聲稱網格如果固定。此外,您建議的方法只適用於表現良好的功能。 –

+0

@JohanLundberg我完全同意你的看法! – ElKamina

1

集成是爲真實參數的函數定義的。因此,如果只知道固定網格上的函數,則需要提供關於如何爲網格點之間的參數定義函數的附加規則。這與編程無關,只是數學。

例如,如果你知道你的函數是相當平滑的,你可以使用線性插值。更復雜的東西,如果你需要的話。但是如果沒有這種規則,整合問題根本就沒有很好的定義。

一旦你有了這樣一個規則 - 只能來自你的函數的基本含義---你可以開始選擇一個整合算法。對於四個變量的函數,我將第二個約翰倫德伯格的建議看作蒙特卡羅積分器。

0

你已經提到你知道f2的跳躍,你不能把f2分成f2 = f2a + f2b,其中; f2a是一個平滑的函數,在這個函數上,傳統的數值積分方法就足夠了,而f2b是一個非常簡單的帶有跳躍的函數,因爲它很簡單,所以可以分析計算面積。然後,您可以添加值,因爲集成是線性操作。這一切都取決於你對f2的瞭解,我想。