First-Order-ConditionをRに実装する

最近,院試の準備でミクロ・マクロの問題演習を解いている最中に,教科書の章末問題を解いたけれども答えがないという状況が多発していました. (大体は最大化or最小化問題の解です.)

正直,個人的には「演習の答えがない」というのが耐えられませんでした.分析結果に答えがないのはいいんですが,流石に院試問題を解くための準備なので,答え合わせが出来なければ自分はどの問題が解けるかどうか分からず厳しいです.

「理論の説明問題なら教科書に答えはありますが,計算問題は自分と同じように章末問題を解いた人同士で答え合わせをしなければ,答えは得られない.」

由々しき問題です.

ここで閃きました.「Rに解かせたら良いのでは?」


ということで,極めてナイーブ(馬鹿正直)に,「RでFOC(First-Order-Condition)を使って,極値を求める関数」を描きましたが,あまりにも使えなさすぎたので,ここに供養します.

foc <- function( f, x = "x"){ ##fは関数, xは微分したい変数
 for ( i in -10000 : 10000){ ##適当に区間を定める
   f_def <- deriv( f, x ,function.arg = TRUE)
   if( f_def( i) != 0 ){  ##もし微分した値がゼロでないならば
     i <- i + 0.0000000000000000000000001 
##iに微小な数値を足す
     } else{
       print( i) 
##微分した値がゼロと一致していれば,その時のiを返す
    }
 }
}
k <- expression(z^2 + 2 * z + 1) ##例
foc( k, x = "z" ) ##例​

上のコードは,「f(x)を, 一回微分した関数f'(x)のxに, -10000から10000まで代入し,代入された関数の値が0になったときに,代入されたxの値をprintする」という関数です.考え方は至ってシンプル(かつ頭悪い...)

上のコードについて,r-wakarangでill-identified氏から「for文でiに繰り返し違う値を代入し,if文を何回も動かして極値を求めようとするのは現実的ではない」というアドバイスをいただきました.(全くその通りだと思います)

ということで,使い道がないこのコードをここに供養しておきます.

「それでは,どうすれば極値をRに求めてもらえるか?」についてですが,optim関数というものがRには存在しているので,それを使うのが今のところの解決方法だと思います.(しかし数値計算しかできず,数式を代数的に解いてくれるわけではありません)

Rには,symbolic calculation(代数計算)のpackagesがあるようですが,私はどんなpackagesがあるかどうかも知らないです...

話は戻りますが,教科書の答えは 当分得られそうにないようです..

(というかプログラミングの勉強をしっかりしていれば,こんな単純な間違いを犯さないと思います)

この記事が気に入ったらサポートをしてみませんか?