<- function(x, radius) {
semicircle sqrt(radius^2 - x^2)
}
はじめに
最近,R statsパッケージ1のintegrate()
関数で一次元関数の数値積分ができることを知りました.そこで,この記事では,こちらの記事を参考に積分で円の面積を計算してみました.
半円を描く関数
半径semicircle()
関数のようになります.
実装したsemicircle()
関数で半径
<- 5
radius curve(semicircle(x, radius), -radius, radius,
asp = 1) # アスペクト比を1:1にする
数値積分で円の面積を求める
次に,stats::integrate()
関数を用いて,さきほど書いたsemicircle()
を数値積分してみましょう.半径
# 半径を5とする
<- 5
radius integrate(semicircle, -radius, radius, # -radiusからradiusまでの範囲で積分する
radius = radius)
39.26991 with absolute error < 2.5e-08
* 5^2 / 2 pi
[1] 39.26991
そのため,円の面積を近似的に求めるcircle_area_approx()
が以下のように書けます(数値積分の結果は,stats::integrate()
関数の戻り値のvalue
に格納されています).
<- function(radius) {
circle_area_approx <- integrate(semicircle, -radius, radius,
out radius = radius)
$value * 2
out
}
circle_area_approx(5)
[1] 78.53982
最後に,半径circle_area_approx()
と理論値circle_area_true()
(
計算の結果,近似値と理論値で円の面積がほぼ等しいことが確認できました.
<- function(radius) {
circle_area_true * radius ^ 2
pi
}
<- data.frame(radius = 1:10)
data $circle_area_approx <- sapply(data$radius, circle_area_approx)
data$circle_area_true <- sapply(data$radius, circle_area_true)
data::kable(data) knitr
radius | circle_area_approx | circle_area_true |
---|---|---|
1 | 3.141593 | 3.141593 |
2 | 12.566371 | 12.566371 |
3 | 28.274334 | 28.274334 |
4 | 50.265482 | 50.265482 |
5 | 78.539816 | 78.539816 |
6 | 113.097335 | 113.097335 |
7 | 153.938040 | 153.938040 |
8 | 201.061930 | 201.061930 |
9 | 254.469005 | 254.469005 |
10 | 314.159265 | 314.159265 |
おわりに
stats::integrate()
関数を使えば,簡単に一次元関数の数値積分ができることがわかりました.
注意点
stats::integrate()
関数では,
# OK
integrate(dnorm, -Inf, Inf)
1 with absolute error < 9.4e-05
# NG
integrate(dnorm, -1e6, 1e6)
0 with absolute error < 0
脚注
statsパッケージは,Rにデフォルトで入っているパッケージの一つです.↩︎