2010-12-02 20 views
8

Rはスプラインライブラリでsplinefun()を使用してスプライン関数を生成できます。しかし、私はこの関数をその1階微分と2階微分で評価する必要があります。これを行う方法はありますか?私はXのベクトルをF '(X)を評価することができますどのように例えばRのスプライン関数の導関数をどのように評価できますか?

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

答えて

14

微分で関数を評価する機能が関数に組み込まれているので、非常に簡単です!

f_of_x(x, deriv = 1) 

ありがとうRコア!

+0

それは「==」演算子はありませんが、「=」。 –

+0

@DWin:修正しました。ありがとうございます。 –

2

また、TeachingDemosパッケージのTkSpline関数を使用して、スプライン関数とその派生関数をプロットすることもできます。

2

splinefunへのderiv =引数の使用は賢明で、2番目と3番目の派生物が利用可能であると付け加えなければなりませんが、例を使って線形近似がギザギザしているより高い度合いでは不連続である。

分析式がある状況では、アルゴリズムの差別化のためのいくつかの制限があります。詳細については、ヘルプ(deriv)ページを参照してください。

> 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の関数を「手で」構築する。それとも、もう少しプロセスを自動化するために、ヘルプ(DERIV)ページで提供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. 
+0

+1洞察に感謝します。しかし、私はスプラインを使って計算量の多いモデルを近似しています。 –

+0

私はそれを恐れていました。私はsplinefunページの例を実行して、より高次の(1よりも)引数を使ってどのように振る舞うのかをより良い考えを得ることを助言するでしょう。プロットするのに時間を費やしてから意味がありましたが、最初は結果がかなり不快に感じられました。 –

関連する問題