2013-10-13 35 views

回答

2

一種選擇是使用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 
+0

謝謝,但是如果我們有多個局部最大值,我怎麼能找到所有局部最大值? – rose

+0

:我得到這個結果與您的代碼:>優化(F,C(0,5),最大= T) $最小 [1] 4.999922 $目標 [1] -46.54533 警告消息: 在if(最大){: 的情況下,長度> 1且只有第一個元素將被使用。你是如何得到最大的? – rose

+0

檢查編輯。對不起,忘了定義函數f。 – mrip

0

我想出了一個辦法用正則表達式來做到這一點,有可能是更好的方法來發現的所有局部最大值一個立方函數,但是這個工作很好。它還會考慮重複的值和邊界條件。

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)))) 
+0

我們有一個z不是x的函數,我怎樣才能得到你的代碼的本地最大值? – rose

+0

x就是你想要插入的任何東西。它將傳遞給它的參數命名爲什麼變量無關緊要。所有你需要做的就是分配x,定義f(z)(或f(x),f(q),f(llama)等),然後運行代碼。它應該處理每個有限值的情況。 –