Rで数式を微分(多項式関数、三角関数、指数関数、対数関数)
Rで関数を微分することができます。数値的にではなく解析的にできます。
やり方はexpression関数で数式をセットしておいて、Dという関数を呼び出せばOK(プログラミング言語の「関数」と、数学の「関数」がごっちゃになる・・・)
高校で習うようなやつをいろいろ試してみました。
> # 多項式の関数の微分
> f <- expression( x^4 + 2*x^3 + 3*x^2 + 4*x + 5 )
> D(f, "x")
4 * x^3 + 2 * (3 * x^2) + 3 * (2 * x) + 4
できてる、みたいですね。数式を簡単にするところまではやってくれないので、ごちゃごちゃしているけど。
Dに「どの文字を変数とするか」("x"のところ)を指定するので、変数以外の文字を含んでいてもOKです。
> # 微分する変数以外の文字を含んでいてもOK
> f <- expression( a*x^n )
> D(f, "x")
a * (x^(n - 1) * n)
↓三角関数もいけます。
> # 三角関数の微分
> f1 <- expression( sin(x) )
> f2 <- expression( cos(x) )
> f3 <- expression( tan(x) )
> D(f1, "x")
cos(x)
> D(f2, "x")
-sin(x)
> D(f3, "x")
1/cos(x)^2
↓指数関数も。
> # 指数関数の微分
> f1 <- expression( a^x )
> f2 <- expression( exp(0)^x )
> D(f1, "x")
a^x * log(a)
> D(f2, "x")
exp(0)^x * log(exp(0))
↑exp(0)ってのは自然対数の底のeのことなので(e^0のことね)、exp(0)^x を微分したら exp(0)^x となる、というのを期待したのですが、その部分(log(exp(0)) = 1)は計算してくれませんでした。
> # 対数関数の微分
> f1 <- expression( log(x) )
> D(f1, "x")
1/x
↑自然対数はいけたのですが、常用対数はなぜか無理でした↓
> # 常用対数はできない
> f2 <- expression( log10(x) )
> D(f2, "x")
以下にエラー D(f2, "x") : 関数 'log10' は導関数の表中にありません
以下は、計算時のテクニックの類ですね。これもやってくれます(文字列的に淡々と、という感じですが)。
> # 合成関数の微分
> f <- expression( sin(x^2) )
> D(f, "x")
cos(x^2) * (2 * x)
↑ x^2を1つの文字みたいにみなしてsin(t)という形にしておいて、全体を微分したものと中身を微分したものを掛け合わせるというやつ( cos(t) * t' )ですね。
> # 積の導関数
> f1 <- expression( x^2 * sin(x) )
> D(f1, "x")
2 * x * sin(x) + x^2 * cos(x)
↑ これもおなじみ、(fg)' = f'*g + f*g' というやつですね。
> # 商の導関数
> f1 <- expression( x^2 / sin(x) )
> D(f1, "x")
2 * x/sin(x) - x^2 * cos(x)/sin(x)^2
↑ これは出てきた数式の形を見ると、商の導関数の公式を使ったというよりは、x^2 * (sin(x))^(-1) と解釈したうえで、積の導関数の公式を使ったような処理っぽいです。
というわけで、一通りできた感じですが、この機能を何に使えるかいまいちピンときてません。数学の宿題を解くのには、間違いなく使えないでしょう。自分でやったほうが楽だもん。
数値的に処理すると誤差が心配な場合に、解析的に導関数を求めておいて、変数に値を代入して使うような場面があるのかもしれません。ないのかもしれません・・・。
やり方はexpression関数で数式をセットしておいて、Dという関数を呼び出せばOK(プログラミング言語の「関数」と、数学の「関数」がごっちゃになる・・・)
高校で習うようなやつをいろいろ試してみました。
> # 多項式の関数の微分
> f <- expression( x^4 + 2*x^3 + 3*x^2 + 4*x + 5 )
> D(f, "x")
4 * x^3 + 2 * (3 * x^2) + 3 * (2 * x) + 4
できてる、みたいですね。数式を簡単にするところまではやってくれないので、ごちゃごちゃしているけど。
Dに「どの文字を変数とするか」("x"のところ)を指定するので、変数以外の文字を含んでいてもOKです。
> # 微分する変数以外の文字を含んでいてもOK
> f <- expression( a*x^n )
> D(f, "x")
a * (x^(n - 1) * n)
↓三角関数もいけます。
> # 三角関数の微分
> f1 <- expression( sin(x) )
> f2 <- expression( cos(x) )
> f3 <- expression( tan(x) )
> D(f1, "x")
cos(x)
> D(f2, "x")
-sin(x)
> D(f3, "x")
1/cos(x)^2
↓指数関数も。
> # 指数関数の微分
> f1 <- expression( a^x )
> f2 <- expression( exp(0)^x )
> D(f1, "x")
a^x * log(a)
> D(f2, "x")
exp(0)^x * log(exp(0))
↑exp(0)ってのは自然対数の底のeのことなので(e^0のことね)、exp(0)^x を微分したら exp(0)^x となる、というのを期待したのですが、その部分(log(exp(0)) = 1)は計算してくれませんでした。
> # 対数関数の微分
> f1 <- expression( log(x) )
> D(f1, "x")
1/x
↑自然対数はいけたのですが、常用対数はなぜか無理でした↓
> # 常用対数はできない
> f2 <- expression( log10(x) )
> D(f2, "x")
以下にエラー D(f2, "x") : 関数 'log10' は導関数の表中にありません
以下は、計算時のテクニックの類ですね。これもやってくれます(文字列的に淡々と、という感じですが)。
> # 合成関数の微分
> f <- expression( sin(x^2) )
> D(f, "x")
cos(x^2) * (2 * x)
↑ x^2を1つの文字みたいにみなしてsin(t)という形にしておいて、全体を微分したものと中身を微分したものを掛け合わせるというやつ( cos(t) * t' )ですね。
> # 積の導関数
> f1 <- expression( x^2 * sin(x) )
> D(f1, "x")
2 * x * sin(x) + x^2 * cos(x)
↑ これもおなじみ、(fg)' = f'*g + f*g' というやつですね。
> # 商の導関数
> f1 <- expression( x^2 / sin(x) )
> D(f1, "x")
2 * x/sin(x) - x^2 * cos(x)/sin(x)^2
↑ これは出てきた数式の形を見ると、商の導関数の公式を使ったというよりは、x^2 * (sin(x))^(-1) と解釈したうえで、積の導関数の公式を使ったような処理っぽいです。
というわけで、一通りできた感じですが、この機能を何に使えるかいまいちピンときてません。数学の宿題を解くのには、間違いなく使えないでしょう。自分でやったほうが楽だもん。
数値的に処理すると誤差が心配な場合に、解析的に導関数を求めておいて、変数に値を代入して使うような場面があるのかもしれません。ないのかもしれません・・・。
コメント
コメントを投稿