11

R は、スプライン ライブラリの splinefun() を使用してスプライン関数を生成できます。ただし、この関数を 1 次導関数と 2 次導関数で評価する必要があります。これを行う方法はありますか?

例えば

library(splines)
x <- 1:10
y <- sin(pi/x) #just an example
f_of_x <- splinefun(x,y)

x のベクトルに対して f'(x) を評価するにはどうすればよいですか?

4

3 に答える 3

18

関数の導関数を評価する機能が関数に組み込まれているため、非常に簡単に実行できます。

 f_of_x(x, deriv = 1)

ありがとうRコア!

于 2010-12-02T19:41:52.237 に答える
2

splinefun への deriv = 引数の使用は賢明であり、2 次導関数と 3 次導関数が使用可能であると想定されていることを追加する必要があります。 .

分析式を使用している状況では、アルゴリズムの微分について明らかに制限された規定がいくつかあります。詳細については、ヘルプ (派生) ページを参照してください。

> deriv(~sin(pi/x), "x")
expression({
    .expr1 <- pi/x
    .value <- sin(.expr1)
    .grad <- array(0, c(length(.value), 1L), list(NULL, c("x")))
    .grad[, "x"] <- -(cos(.expr1) * (pi/x^2))
    attr(.value, "gradient") <- .grad
    .value
})

そして、その結果で2番目の関数を「手で」構築します。または、ヘルプ (派生) ページで提供されている DD の例を使用して、プロセスをもう少し自動化することもできます。

 DD <- function(expr,name, order = 1) {
    if(order < 1) stop("'order' must be >= 1")
    if(order == 1) D(expr,name)
    else DD(D(expr, name), name, order - 1)
 }
 DD(expression(sin(pi/x)), "x", 2)
-(sin(pi/x) * (pi/x^2) * (pi/x^2) - cos(pi/x) * (pi * (2 * x)/(x^2)^2))
 DD(expression(sin(pi/x)), "x")
-(cos(pi/x) * (pi/x^2))
funD<- function(x){}
body(funD) <- DD(expression(sin(pi/x)), "x")
funD
   #function (x) 
     #-(cos(pi/x) * (pi/x^2))
funD(2)
#   [1] -4.809177e-17  as it should be at a maximum
funDD <- function(x){}
body(funDD) <- DD(expression(sin(pi/x)), "x", 2)
funDD(2)
#  [1] -0.6168503   as it should be at a maximum.
于 2010-12-02T20:25:55.480 に答える
2

スプライン関数を導関数と共にプロットする TeachingDemos パッケージの TkSpline 関数にも興味があるかもしれません。

于 2010-12-02T20:17:02.633 に答える