如何在R中对函数求导并计算导函数的最大值
R中表达式类型导函数传入optimize求极值的解决方案
你遇到的问题核心原因是optimize()仅支持传入可执行的函数对象,而D()和deriv()默认返回的是表达式类型,无法直接作为入参使用,按以下两种方案转换格式即可正常求解:
方案1:将D()生成的导数表达式转为函数
先用D()计算得到导数表达式后,通过as.function()将其封装为可调用的单参数函数,示例如下:
# 1. 定义原目标函数的表达式 f_expression <- expression(x^3 - 5*x^2 + 3*x + 2) # 2. 对自变量x求导,得到导数表达式 deriv_expression <- D(f_expression, "x") # 3. 将导数表达式转为可调用的单参数函数 deriv_func <- as.function(alist(x = , eval(deriv_expression))) # 4. 传入optimize求解导函数在区间[0,4]的最大值 # optimize默认求最小值,求最大值时对导函数取负即可 max_res <- optimize(function(x) -deriv_func(x), interval = c(0, 4)) # 输出结果:极值点、导函数最大值 print(paste0("极值点:", max_res$minimum)) print(paste0("导函数最大值:", -max_res$objective))
方案2:直接用deriv()生成带梯度的函数
deriv()支持指定function.arg参数直接生成可调用函数,无需手动转换表达式:
# 1. 直接生成包含梯度计算的函数,指定参数为x f_with_grad <- deriv( expr = expression(x^3 - 5*x^2 + 3*x + 2), namevec = "x", function.arg = TRUE ) # 2. 封装函数提取梯度值 get_deriv <- function(x) { attr(f_with_grad(x), "gradient")[1] } # 3. 调用optimize求解最大值 max_res <- optimize(function(x) -get_deriv(x), interval = c(0,4))
注意事项
- 若原函数包含多个参数,可在
as.function()的参数列表中为非求解参数设置固定默认值,或传入optimize时通过匿名函数固定其他参数取值 - 求解前需确认传入的区间覆盖目标极值的分布范围,避免结果为局部极值
- 若需求解导函数的最小值,无需对导函数取负,直接传入
optimize()即可
内容的提问来源于stack exchange,提问作者Hugo Rangel Ramírez
相关产品推荐
相关产品推荐

