Rで二重積分を取るコーディング方法を考えています。すでに2つの同様の質問を参照しました。
しかし、私はまだそれらの答えから私の質問を得る方法が混乱しています。私の質問は次のとおりです。
この計算をRでコーディングしたいと思います。
私の手とWolframalphaの計算から、16826.4になります。両方の積分がadaptIntegrate()を使用して正確な数からのものである場合、積分を取る方法を知っています。しかし、私の場合のやり方がわかりません。助けてくれませんか?よろしくお願いします。
コードから始めて、それを説明するためにステップスルーしましょう。
_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
_
統合のドメインは、頂点(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