関数の調べ方

  • こちら連立方程式の解を求めたい
  • パッケージ"rootSolve" の中の uniroot.all() で解を出す
    • この uniroot.all() はパッケージ"base" の中の uniroot() 関数を使っている
    • uniroot()の中身の一部
val <- .Internal(zeroin2(function(arg) f(arg, ...), lower, upper, f.lower, f.upper, tol, as.integer(maxiter)))
iter <- as.integer(val[2L])
  • uniroot() の中身の調べ方を教えてもらう
    • .Internal() は 関数zeroin2() を呼び出すもの
  • zeroin2について
    • まずRのソースコードをダウンロードする
    • R-2.12.2/src/main 以下に cで書かれたソースが見られる
      • 名前のついたcのソースが見当たらない場合は name.c を参照
    • src/main/optimize.c にzeroin2()が書いてある(google検索)
      • 中身を見ると今度は R_zeroin2() を読み込んでいる
    • src/appl/zeroin.cにR_zeroin2()は書かれている(google検索)
      • ようやく中身にたどり着いた
      • 内容は解の差分が許容する誤差内に収まれば終了するもの
      • なのでf(x)=\frac{1}{x} に対しても解として値を返すことがある
        • $f.root が 0 からずれる
        • 解を a としてf(a)を計算してももちろん 0 ではない
f<-function(x){1/x}
a<-uniroot(f,c(-2,0))
a
f(a)
> f<-function(x){1/x}
> a<-uniroot(f,c(-2,0))
> a
$root
[1] -6.103702e-05

$f.root
[1] -16383.5

$iter
[1] 16

$estim.prec
[1] 6.103702e-05

> f(a)
 以下にエラー 1/x :  二項演算子の引数が数値ではありません 
  • もう一つ"L"について
  • こちらの中のこの部分を参照する
    • 実数のあとに"L"をつけると整数型(Int型)でないときに警告が出る