Rで微分と積分を行う

ちょっと得した気分になれる
R
公開

2026年9月5日

Rには微分や積分を扱う関数が標準で備わっているのをご存知でしょうか。

統計解析に特化した言語であるRですが、実は数式処理のような機能も持っています。今回はその中の1つとして、Rで扱うことのできる微積分をご紹介したいと思います。

Rで微積分

Rで微分を行うには D() 関数を、定積分を行うには integrate() 関数を使用します。順に見ていきましょう。

D() による記号微分

まず、微分の例です。D() 関数は、与えられた数式を「記号的(Symbolic)」に微分し、その結果としての「式」を返します。

# xの2乗を微分する
expr <- expression(x^2)
D(expr, "x")
2 * x

このように、具体的な数値を代入して計算するのではなく、数学的に微分した後の形式がそのまま返されます。微分の値が必要なときには、eval() で変数に値を代入します。

f <- D(expr, "x")
eval(f, list(x = 3))
[1] 6

偏微分

多変数関数の場合は、微分する変数を指定することでそれぞれについての偏微分を行うことができます。

D(expression(x^2 * y), "x")
2 * x * y
D(expression(x^2 * y), "y")
x^2

integrate() による数値積分

一方で、積分を行う integrate() 関数は、指定した範囲の定積分の「値」を求める数値積分を行います。

# x^2 を 0 から 1 まで定積分する
f <- function(x) x^2
integrate(f, lower = 0, upper = 1)
0.3333333 with absolute error < 3.7e-15
# sin(正弦)関数を0からπ(弧度法)まで定積分する
f <- function(x) sin(x)
res <- integrate(f, lower = 0, upper = pi)
res
2 with absolute error < 2.2e-14
# 積分値は $value、絶対誤差の推定値は $abs.error に格納される
res$value
[1] 2
res$abs.error
[1] 2.220446e-14

D() が「式」を返すのに対し、integrate() は近似計算によって導き出された「数値」を返すという違いがあります。近似計算なので、絶対誤差の推定値が示されることが気になってしまう方もいらっしゃると思いますが、このおかげで1 / log(x)のような不定積分が難しい関数の定積分も計算できるのは有用ですね。

なぜRにこれらの機能があるのか

統計解析のための言語であるRに、なぜこのような数式処理的な機能があるのでしょうか。よく考えれば、統計的な演算を行うためにはむしろ必要不可欠なものだと分かります。

例えば、統計学において確率密度関数を定積分すればその範囲の確率を求めることができます。dnorm() で得られる正規分布の密度を積分してみると、次のようになります。

integrate(dnorm, -2, 2)
0.9544997 with absolute error < 1.8e-11

よく話題として出てくる「2シグマの範囲には約95.4%が含まれる」ということがRで確認できました。statsパッケージにはこのような統計的な演算を必要とする関数が多く含まれているので、その基礎的な部品として微積分が用意されているのではないかと個人的に理解しています。その機能をおまけで使えるようにしてあるのではないでしょうか。つまり、「数式処理ソフトとしての機能」というよりは、「統計計算を実行するためのインフラ」としての役割が大きいのではないかと感じます。

まとめ

Rで微積分を行う方法についてご紹介しました。個人的な話ですが、私が高校生の頃にMathematicaという高級な数式処理ソフトがあることを知り、当時習っていた微積分が計算できてしまうと聞いて「手が出せないがすごい機能を持つソフトウェアなんだな」といった憧れのような思いを抱いた記憶があります。それが今、オープンソースであるRで(限定的ではありますが)同様の操作が実行できることに、ある種の感動を覚えます。

同じような感覚を持たれた方は、ぜひ D() や integrate() を試してみてください。