一個關於R語言找極值的問題

2015-02-13 12:27 am
有一個函數

f(x,y)=(x-1)^2+(y-4)^3

想要用R語言的optim()找這個函數的極值,以這個函數來說x>0和x<0會各有一個解,這兩個解是對稱的。我想請問如何讓optim()只搜尋x>0的那個解而不要去找x<0的解
更新1:

謝謝 sponge 大的提醒...- " - 我隨便出的函數錯得太厲害了,深感抱歉。 換一個如下的更簡單但是滿足我要求的函數: f(x)=x^2-2*|x| 它在x= 1以及x= -1處各有一個極值。 這邊重述一次問題:我希望能使用R語言中的optim()這個function「只搜尋x>0的範圍」。 針對兩個變數的情況,如果我有一個函數f(x,y)在(x,y)=(1,2)有一個極值而在(x,y)=(2,1)有另一個同樣大的極值,請問要如何令optim()只找x y的情況呢... 謝謝。

回答 (1)

2015-02-20 7:04 am
✔ 最佳答案
這函數沒有 global max/min...
是不是能給明確的範圍,尤其是 y

2015-02-19 23:04:15 補充:
您可使用有限制條件的最佳化演算法並給予條件,如下:

f <- function(x){ return(x^2-2*abs(x)) }

optim(5, f, method = 'L-BFGS-B', lower = 0)

L-BFGS-B 是一個接受單純上下界的演算法

使用 lower, upper 參數去指定,像此例設 lower = 0 就不會找出負的最佳解

對多變數也可以如下:

抱歉想創造問題中 (1, 2), (2, 1) 有相同極值的函數臨時找不到

所以用自己的,假設函數為 f(x, y) = 2x^2-2xy^2-2x+y^4

f <- function(x){ return(2*x[1]^2-2*x[1]*x[2]^2-2*x[1]+x[2]^4) }

它在 (1, ±1) 皆有極值 -1

只想找 (1, -1) 可寫:

optim(c(3, 4), f, method = 'L-BFGS-B', upper = c(Inf, 0))

如果限制條件的形式為 x+y-1 ≦ 0 這種

建議改用 constrOptim, 詳見參考資料

constrOptim(c(1, -2), f, NULL, ui = c(-1, -1), ci = -1)

其中 ui, ci 意思為 ui 矩陣乘上變數向量大於等於 ci 向量

所以 x+y-1 ≦ 0 要變成 -x-y ≧-1

變數與 ci 二個向量維度必須等大小,ui 根據限制多寡就有幾列

更複雜形式的約束條件可參考 R 語言本身的說明

希望以上回答對您有幫助!


收錄日期: 2021-04-30 16:45:02
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20150212000010KK02964

檢視 Wayback Machine 備份