检查R中任何函数的凸性

我应该检查给定时间间隔内函数是否为凸函数。

我正在用lambda公式。如果满足以下条件,则函数f是凸的:

Formula

这是我写的功能:

isConvex <- function(FUN,x1,x2,lambda) {
    if (!is.function(FUN))
        return(errorCondition("Argument FUN is not a function."))

    if (x1 > x2 )
        return(errorCondition("Argument x1 needs to be smaller than x2."))

    if (!(max(lambda) == 1 && min(lambda) == 0))
        return(errorCondition("Argument lambda needs to be a sequence from 0 to 1."))

    return (FUN( lambda*x1 + (1-lambda) * x2 ) - lambda*FUN(x1) + (1-lambda)*FUN(x2) <= 0)
}

isConvex(somefunction,-1,1,seq(0,.01))

根据函数的凸性,该函数应该返回TRUEFALSE,但是我得到了TRUE s和FALSE s的向量。

例如,isConvex(exp,3,.01))应该返回[1] TRUE

根据我的任务,lambda应该是一个序列。

TJJ123456 回答:检查R中任何函数的凸性

如果不等式适用于0到1之间的所有lambda,则该函数为凸函数。因此,您不需要在函数中使用lambda作为参数。

此外,您的不平等状况有误-最后一个+应该是-。不等式应为f(Lx1+(1-L)x2) <= Lf(x1)+(1-L)f(x2)-即函数应在x1x2之间的插补直线下方。 (请参见https://en.wikipedia.org/wiki/Convex_function

所以我认为您需要按以下方式修改函数(我已经忽略了错误检查行)...

isConvex <- function(FUN,x1,x2) { #don't need lambda as an argument
   lambda <- seq(0,1,0.01)
   test <- FUN(lambda * x1 + (1-lambda) * x2 ) - lambda*FUN(x1) - (1-lambda)*FUN(x2) <= 0
   return(all(test))
}

isConvex(exp,3)
[1] TRUE

实际上,要证明凸度,您需要验证您感兴趣的范围内x1x2的所有组合的不等式,因此它并不那么简单(可能仍然满足不平等现象的端点之间的“纽带”。另一种可能更健壮的方法是测试正二阶导数。您可以通过将函数的第二行替换为

test <- diff(diff(FUN(lambda * x1 + (1 - lambda) * x2))) >= 0
本文链接:https://www.f2er.com/3150173.html

大家都在问