【问题标题】:Finding the local maximum of piecewise cubic function in R在R中找到分段三次函数的局部最大值
【发布时间】:2013-10-13 21:34:32
【问题描述】:

我有 picwise 三次函数,我想找到它的所有局部最大值,我怎样才能找到所有峰值?

【问题讨论】:

    标签: r maximization


    【解决方案1】:

    一种选择是使用optimize 以数字方式查找最大值。首先你必须编写实际的函数:

    x <- c(0.014, 0.034, 0.059, 0.061, 0.069, 0.080, 0.123, 0.142, 0.165, 
       0.210, 0.381, 0.464, 0.479, 0.556, 0.574, 0.839, 0.917, 1.649, 1.702, 
       1.893, 1.932 ,2.337, 2.628, 4.510, 4.584, 5.267, 5.299)
    f<-function(z){
        z1<-pmax(0,z-x)
        sum(z1^2-(z^3-z1^3)/3)
    }
    

    然后:

    > optimize(f,c(0,5),maximum=T)
    $maximum
    [1] 2.22133
    
    $objective
    [1] 8.486057
    

    【讨论】:

    • 谢谢,但是如果我们有多个局部最大值,我怎样才能找到所有局部最大值?
    • :我用你的代码得到了这个结果:> optimize(f,c(0,5),maximum=T) $minimum [1] 4.999922 $objective [1] -46.54533 警告信息:在if (maximum) { : 条件长度 > 1 并且只使用第一个元素。您是如何获得最大值的?
    • 为了找到更多的局部最大值,简单地说,该策略会找到第一个局部最大值,然后找到下一个局部最小值,然后找到下一个局部最大值,等等。
    【解决方案2】:

    我想出了一种使用正则表达式的方法,并且可能有更好的方法来找到三次函数的所有局部最大值,但这很有效。它还将考虑重复值和边界条件。

    vals=f(x)
    
    text=paste0(substr(format(diff(vals),scientific=TRUE),1,1),collapse="")
    sort(na.omit(c(gregexpr('[ ][0]*-',text)[[1]]+1,ifelse(grepl('^-',text),1,NA),
     ifelse(grepl('[^-]$',text),length(vals),NA))))
    

    【讨论】:

    • 我们有一个 z 而不是 x 的函数,我怎样才能用你的代码得到局部最大值?
    • x 就是你想要插入的任何东西。你将它传递给的参数命名为什么变量并不重要。您需要做的就是分配 x,定义 f(z)(或 f(x)、f(q)、f(llama) 等),然后运行代码。它应该处理有限值的所有情况。
    猜你喜欢
    • 2012-12-28
    • 2016-03-16
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多