首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动“识别”(微积分)导数

自动“识别”(微积分)导数
EN

Stack Overflow用户
提问于 2022-01-17 08:05:17
回答 1查看 48关注 0票数 1

我正在使用R编程语言。使用"optim“库和"BFGS”优化算法,我感兴趣的是优化以下函数(也称为"Rosenbrock函数“):

如果您定义了这个函数和函数的导数,那么使用"optim“库和BFGS算法进行优化是非常简单的(注意: BFGS算法需要了解函数的导数):

代码语言:javascript
复制
fr <- function(x) {   ## Rosenbrock Banana function
    x1 <- x[1]
    x2 <- x[2]
    100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}
grr <- function(x) { ## Gradient of 'fr'
    x1 <- x[1]
    x2 <- x[2]
    c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1),
       200 *      (x2 - x1 * x1))
}

res <- optim(c(-1.2,1), fr, grr, method = "BFGS")

> res
$par
[1] 1 1

$value
[1] 9.594956e-18

$counts
function gradient 
     110       43 

$convergence
[1] 0

$message
NULL

假设您正在处理一个高维复杂函数--这个函数的导数将很难手动计算,然后为这个导数编写一个函数(也就是你可能犯错误的另一个地方)。在R中有没有“自动”的方法,例如,如果你写一个数学函数-R可以自动“推断”这个函数的导数?

例如,在一个新的R会话中-会有某种方式运行BFGS算法而不显式定义导数吗?

代码语言:javascript
复制
fr <- function(x) {   ## Rosenbrock Banana function
    x1 <- x[1]
    x2 <- x[2]
    100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}


#pseudo code
res <- optim(c(-1.2,1), fr, ??? , method = "BFGS")

有人知道这样的事情是否可能发生吗?R能自动推断出导数吗?

我想出了一种方法,你可以在R中使用一个预先存在的“数值微分”函数来逼近每次迭代时的导数,然后把这个近似输入到BFGS算法中,但这听起来非常复杂,也没有必要。

如果R能自动推断函数的导数,那就太好了。

参考资料:

EN

回答 1

Stack Overflow用户

发布于 2022-01-17 09:30:11

这已经内置到optim()函数中了。如果你不指定导数,它将进行数值计算。

代码语言:javascript
复制
fr <- function(x) {   ## Rosenbrock Banana function
  x1 <- x[1]
  x2 <- x[2]
  100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}


optim(c(-1.2,1), fr, method = "BFGS")

# $par
# [1] 0.9998044 0.9996084
# 
# $value
# [1] 3.827383e-08
# 
# $counts
# function gradient 
# 118       38 
# 
# $convergence
# [1] 0
# 
# $message
# NULL

请注意(至少在这种情况下),解非常接近于使用解析导数找到的解。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70738183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档