2016-11-03 12 views
0

質問を簡略化するため、ここではおもちゃの例を使用します。私はので、私はdummyに異なる定数項から勾配とヘッセ行列を導出することができ、効率的な方法があるよう ライブラリ(pracma)R内の関数内のローカル変数を自動的に変更するには?

dummy <- function(x) { 
     z <- x[1]; y <- x[2] 
     rez <- (z^2)*(y^3)+3 
     rez 
     } 
grad(dummy, c(1,2)) 

hessian(dummy, c(1,2)) 

M質問はそれがあるとして、多項式関数の勾配とヘッセ行列を導出したいですか?例えば、(z^2)*(y^3)+aからの勾配およびヘッセ行列は、z=1およびy=2であり、a=[0.01,3]である。

ありがとうございます!

+0

Cholesky分解「PP」のようなものですが、上の三角形要素の1つを-0.0005(非ゼロ)に設定しました。 – tzu

+0

ロジックは非常に単純です---私は、 'P_ {11}、P_ {21}、P_ {22}、P_ {31}、P_ {32}、 P_ {33} '。しかし、あなたがこのアルゴリズムに同意しなくても、私の主な問題は、これらの値を 'P_ {23}'要素の異なる設定の下で取得したいと思うことです。 – tzu

+0

質問は今より意味が分かりますか? @ ZheyuanLiの提案に感謝します。 – tzu

答えて

3

pracma::hessianpracma::gradの両方とも、...を「fに渡す変数」とします。あなたはaが変数になりたい場合は、あなただけの引数としてそれを取るためにあなたのdummy機能を必要とする:もちろん

dummy <- function(x, a) { 
     z <- x[1]; y <- x[2] 
     rez <- (z^2)*(y^3)+a 
     rez 
     } 

grad(dummy, c(1,2), a = 0.01) 
# [1] 16 12 
hessian(dummy, c(1,2), a = 3) 
#  [,1] [,2] 
# [1,] 16 24 
# [2,] 24 12 

sapply(seq(0.01, 3, length.out = 10), function(a) grad(dummy, c(1, 2), a = a)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 16 16 16 16 16 16 16 16 16 16 
# [2,] 12 12 12 12 12 12 12 12 12 12 

結果がすべて同じである、あなたは定数項を変更して、デリバティブを取っています。任意の定数の導関数は0です。しかし、この考え方はより興味深いケースに一般化されます。

関連する問題