web-dev-qa-db-ja.com

Rの二重積分

Rで二重積分を取るコーディング方法を考えています。すでに2つの同様の質問を参照しました。

Rの二重積分をすばやく計算する

追加の引数を使用したRの二重積分

しかし、私はまだそれらの答えから私の質問を得る方法が混乱しています。私の質問は次のとおりです。

この計算をRでコーディングしたいと思います。

enter image description here

私の手とWolframalphaの計算から、16826.4になります。両方の積分がadaptIntegrate()を使用して正確な数からのものである場合、積分を取る方法を知っています。しかし、私の場合のやり方がわかりません。助けてくれませんか?よろしくお願いします。

8
moggirio

コードから始めて、それを説明するためにステップスルーしましょう。

_InnerFunc = function(x) { x + 0.805 }
InnerIntegral = function(y) { sapply(y, 
    function(z) { integrate(InnerFunc, 15, z)$value }) }
integrate(InnerIntegral , 15, 50)
16826.4 with absolute error < 1.9e-10
_

最初の行はとても簡単です。内部積分を計算できるようにするには、関数f(x) = x + 0.805が必要です。

2番目のステップはトリッキーな唯一のことです。より単純な式function(z) { integrate(InnerFunc, 15, z)$value }を使用して内部積分を計算し、それを積分するのは自然なことのようです。それに関する問題は、integrateがベクトル化された関数を期待していることです。あなたはそれに値のリストを与えることができるはずです、そしてそれは値のリストを返します。最初の積分のこの単純な形式は、一度に1つの値に対してのみ機能します。そのため、値のリストを渡して値のリスト(最初の定積分)を取得できるように、sapplyが必要です。

内部積分に対してこのベクトル化された関数を取得したら、それをintegrateに渡して答えを得ることができます。

後の簡略化
上記のsapplyメソッドは機能しましたが、このように関数Vectorizeを使用する方が自然です。

_InnerFunc = function(x) { x + 0.805 }
InnerIntegral = Vectorize(function(y) { integrate(InnerFunc, 15, y)$value})
integrate(InnerIntegral , 15, 50)
16826.4 with absolute error < 1.9e-10
_
8
G5W

統合のドメインは、頂点(15,15)、(50,15)、および(15,50)を持つシンプレックスです。 SimplicialCubatureパッケージを使用します。

> library(SimplicialCubature)
> S = cbind(c(15,15),c(50,15),c(15,50))
> adaptIntegrateSimplex(function(v) v[1]+0.805, S)
$integral
[1] 16826.4

$estAbsError
[1] 1.68264e-08
1