R代码:使用最速下降法查找根

R代码:使用最速下降法查找根,r,numerical-methods,R,Numerical Methods,我们的任务之一是编写一个固定步长的最陡下降函数,以找到Rosenbrock函数的最小值,f(x,y)=100(y-x^2)^2+(1-x)^2。我们已经知道最小值出现在(1,1)处,所以我们需要得到函数的近似值 我觉得我让函数运行起来了,但是即使在10万次迭代之后,它发现的最小值也是不正确的——100000次迭代之后的最终输出大约是(0.5348,0.2185)。这个数字不会随着迭代次数的增加而改变。我肯定我对函数做了一些错误的处理,但就是不太清楚在哪里 fixed <- function

我们的任务之一是编写一个固定步长的最陡下降函数,以找到Rosenbrock函数的最小值,f(x,y)=100(y-x^2)^2+(1-x)^2。我们已经知道最小值出现在(1,1)处,所以我们需要得到函数的近似值

我觉得我让函数运行起来了,但是即使在10万次迭代之后,它发现的最小值也是不正确的——100000次迭代之后的最终输出大约是(0.5348,0.2185)。这个数字不会随着迭代次数的增加而改变。我肯定我对函数做了一些错误的处理,但就是不太清楚在哪里

fixed <- function(x = 4, y = 4){
  i <- 1
  si <- 0.1   ##fixed stepsize
  h <- function(x, y) {100*(y-x^2)^2+(1-x)^2} 
  dhx <- function(x, y) (-400*x*(y-x^2)-2+(2*x)) ##partial derivative for gradient
  dhy <- function(x, y) (200*(y-x^2))
  v <- c(x, y)    ## vector that contains the x and y value, which starts at (4,4)
  for (i in 0:100000){
    gradh <- c(-dhx(x,y), -dhy(x,y))  ##negative gradient to find minimum 
    di <- gradh/sqrt((dhx(x,y))^2+(dhy(x,y))^2) ##normalized direction 
    v <- v + (si*di)   ##calculating new direction
    x <- v[1]          ##breaking down the direction components to feed into the for loop
    y <- v[2]
    i <- i + 1
#    print(i)
#    print(gradh)
#    print(di)
#    print(v)
#    print(h(v[1], v[2]))
  }
  print(i)
  print(v)    ## v should be (1,1) after some iteration
}

修复了这个Rosenbrock函数是梯度下降法的一个(众所周知的)反例。也就是说,预计这种方法会出错,要么变得非常缓慢,要么停在远离最小值的地方。@G.Grothendieck:你的观察是错误的。最后两项可以根据第一项的导数写成
-2*(1-x)
,但在算术上是相同的。你的点
v
在每一步中都应该移动距离
si=0.1
,因此“这个数字不改变”不能完全正确。你能打印并添加迭代序列的最后6个点吗?