如何在R中找到函数的上限和下限

Posted

技术标签:

【中文标题】如何在R中找到函数的上限和下限【英文标题】:How to find upper and lower bounds of a function in R 【发布时间】:2019-01-14 16:58:57 【问题描述】:

我想尝试在 R 中找到函数的上限和下限。

我正在尝试使用内置的 R 函数“优化”,但该函数试图找到函数的切线为零的位置。例如,如果您运行以下代码:

phi_function <- function(x) 
  return(((x^6)/8) - ((3*(x^2))/4))


lbound_ex <- -1.79550879355662
ubound_ex <- 0.168144378782495

LX_ex <- optimise(phi_function, interval = c(lbound_ex, ubound_ex), maximum = FALSE)$objective
UX_ex <- optimise(phi_function, interval = c(lbound_ex, ubound_ex), maximum = TRUE)$objective

curve(phi_function, from = lbound_ex, to = ubound_ex)
abline(v = lbound_ex)
abline(v = ubound_ex)
abline(h = LX_ex, col = 'red')
abline(h = UX_ex, col = 'red')
abline(h = phi_function(-1.79550879355662), col = 'green')

您会得到以下图表:

红线是 'optimise' 函数给出的最小值和最大值,绿线是区间 (lbound_ex, ubound_ex) 中 phi_function 的上限。有谁知道如何在 R 中找到上限和下限?

提前感谢您的帮助! 瑞恩

【问题讨论】:

来自?optimize:如果'f'是一个单峰函数并且'f'的计算值在被至少eps分隔时总是单峰的* |x| + (tol/3),则 x_0 近似于区间“lower,upper”上“f”的全局最小值的横坐标,误差小于 eps * |x_0|+ tol。如果“f”不是单峰的,那么“optimize()”可能会逼近一个局部但可能是非全局的最小值,达到相同的精度。 它正在寻找函数的一阶导数改变符号的点。它将错过出现在区间边界的最大值和最小值。你需要自己检查。 【参考方案1】:

我不认为绿线代表最大值(或最小值)。它们被定义为切线斜率为0的点和斜率。

您的函数不是单峰的(只有一个峰值),最大值和最小值超出了您的范围。

函数optimize会搜索上下区间,并在区间内的连续函数中寻找最大值和最小值。 如果你扩展你的函数,你会发现在 (0,0) 处还有另一个最大值

【讨论】:

好的,谢谢,你说得对。对于我需要的东西,我需要一个函数来找到上限和下限,而不是最大值。我将编辑问题。 所以使用优化并检查间隔的端点。 optimize() 确实找到 one 最小值和/或最大值,但这可能不是区间中的 global 最优值。您将需要检查 all 最小值和最大值以及端点处的函数值。为了识别全局最小值和最大值,函数pracma::findmins() 可能有用。

以上是关于如何在R中找到函数的上限和下限的主要内容,如果未能解决你的问题,请参考以下文章

我如何向 Google ortools 添加一组值而不是下限和上限?

如何找到矩阵排序的下限?

使用 numpy.random.normal 时如何指定上限和下限

要从具有上限/下限的泊松分布中抽取的样本编号

R Shiny中的下限和上限的多个滤波器

我如何以编程方式从 kmeans 数据中建立 cv2 掩码的上限和下限