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