2016-01-06 198 views
1

我正在使用gaussquad包以數值方式評估一些積分。R中高斯積分的問題

我想在點X1,...,XN然後構建和W1 * F(X1)通過評估函數˚F(x)的工作的ghermite.h.quadrature命令+ ... + WN * F(XN),其中X1 ,...,XN W1 ,...,WN 由用戶提供的節點和權重。

因此我認爲命令

ghermite.h.quadrature(f,rule) 
sum(sapply(rule$x,f)*rule$w) 

會產生相同的輸出,用於任何功能˚F,其中「」規則「」是存儲在標記的一個列中的節點數據幀「」 X「」以及標記爲「w」的列中的權重。對於許多函數來說,輸出結果確實是相同的,但對於某些函數,我會得到非常不同的結果。有人能幫我理解這種差異嗎?

謝謝!

代碼:

n.quad = 50 
rule = hermite.h.quadrature.rules(n.quad)[[n.quad]] 

f <- function(z){ 

f1 <- function(x,y) pnorm(x+y) 

f2 <- function(y) ghermite.h.quadrature(f1,rule,y = y) 

g <- function(x,y) x/(1+y)/f2(y)*pnorm(x+y) 

h <- function(y) ghermite.h.quadrature(g,rule,y=y) 

h(z) 

} 

ghermite.h.quadrature(f,rule) 
sum(sapply(rule$x,f)*rule$w) 
+0

我們展示的代碼 –

+0

@SeverinPappadeux好吧,我加了 – David

+0

確認值確實不同,0.34 vs 0.203 –

回答

1

好吧,這個問題讓我感興趣。

我已經查看了gaussquad源文件,顯然作者沒有在內部運行sapply,因爲所有被積函數/函數都必須在向量參數上返回向量。

它在文檔中明確提出:

應當採用數字參數x和可能的一些參數

functn一個ř功能。 該函數返回給定參數的數字向量值x

如果您使用某些內部函數,那麼它們會以這種方式寫入,因此一切正常。

你需要重寫你的函數與向量參數工作,並返回一個矢量

UPDATE

矢量化()對我的作品來糾正該問題,以及與sapply

簡單的包裝
vf <- function(z) { 
    sapply(z, f) 
} 

無論這些變化後,結果是相同的:0.2029512

+0

我可以使用Vectorize()來執行此操作嗎? – David

+0

@大衛是的,請參閱更新 –