$$f(x_1,x_2)=(1-x_1)^2+100(x_2-x_1^2)^2$$算法
該函數全局最小值在($x_1=1,x_2=1$)時取到。函數
下面這種寫法是由於有多個自變量函數,傳入一個參數x,每一個自變量用向量x的份量來表示,從而定義出目標函數。優化
obj <- function(x){ x1 <- x[1] x2 <- x[2] y <- 100*(x2-x1^2)^2+(1-x1)^2 return(y) }
x1梯度:$-400*x_1*(x_2-x_1^2)-2*(1-x_1)$spa
x2梯度:$200*(x_2-x_1^2)$code
梯度:blog
gradient <- function(x){ x1 <- x[1] x2 <- x[2] c(x1_gradient = -400*x1*(x2-x1^2)-2*(1-x1), x2_gradient =200*(x2-x1^2)) }
tip:對於多元函數,須要用向量的形式來輸出各個變量上的梯度。圖片
下面以$x_1=0,x_2=3$做爲起始點,其餘參數採用默認設置,梯度也不輸入。(默認時優化算法爲單純型法)ip
optim(par = c(0,3),fn=obj)
convergence是收斂的代碼字符串
method:優化方法,經過字符串形式傳入,表示優化求解的算法,數學
Nelder-Mead:單純型法,爲optim默認優化算法。
使用CG共軛梯度法在默認的迭代次數下求解:
optim(par = c(0,3),fn=obj)
發現算法到達迭代次數上限而退出。
咱們增長迭代次數:
optim(par = c(0,3),fn=obj,method = "CG",control = list(maxit=500))
能夠發現目標函數的值能夠減小,進一步增長迭代的次數能夠獲得最優解,可是效率上比默認的Nelder-Mead單純型法差太多。注意:CG已經使用梯度信息,不須要咱們本身傳入自定義的gradient函數
若是咱們使用擬牛頓法BFGS,下面分別爲不傳入梯度信息與本身傳入梯度信息
optim(par = c(0,3),fn=obj,method = "BFGS")
optim(par = c(0,3),fn=obj,gr=gradient,method = "BFGS")