ニュートン法で解を求める

機械学習を勉強していると最適化の話がポンポン出てくる。
字面だけみてわかった気になるのだが実装してみないことにはどこまで理解してるのか怪しい。
ということでまずは簡単そうなニュートン法を実装してみた。

# 関数を定義
txt <- "x^3 + 2*x^2 + 3*x + 4"
g <- function(x)eval(parse(text = txt))
gd <- deriv(parse(text = txt), "x", func = TRUE) #1回微分

# 関数をプロット
curve(g, -3, 3)
abline(h = 0, col = "red")

#初期値を適当に設定

strt <- 3
dif <- 10

#ニュートン法

res <- NULL
while(dif > 0.0001){
    strt0 <- strt
    strt <- strt0 - (g(strt0) / attr( gd(strt0),"gradient"))
    res <- c(res, strt)
    dif <- strt0 - strt
    }

#収束に至るまでの点の表示および解(赤点)の表示

points(x = res, y = rep(0, length(res))) 
points(x = strt, y = 0, col = "red", pch = 20)

今まで便利ライブラリで楽し過ぎてたせいで微分の関数とか全然知らなかったので悔いあらためて勉強に臨む所存であります。