2014-05-18 80 views
1

我想優化(最大)以下函數f1。我寫了下面的代碼,它使用下限和上限,因爲我們知道所有參數都等於或大於零,並且我們總是應該有x4值小於或等於x6。我如何解決R中的這個問題?我想獲得函數的有限最大值f1R中函數的優化(L-BFGS-B需要有限的'fn')

  x1 = 0.1 
      x2 = 0.1 
      x3 = 2 
      x4 = 10 
      x5 = 2 
      x6 = 30 
      x7 = 1 
      par = list(x1=x1, x2=x2, x3=x3, x4=x4,x5=x5, x6=x6, x7=x7) 
      par1 = c(1, 1, 2, 1.5, 1, 1.5, 1) 

      f1 = function(x, par){ 
       sum(log(exp(-(par$x7)*(par$x1*x + par$x2*x^2/2 + 
       par$x3 * (par$x4-x)^3/3+par$x5 *(x-par$x6)^3/3)))) 
      } 

     x = seq(0, 500, length=100) 
     z = c(par$x1, par$x2, par$x3, par$x4, par$x5, par$x6, par$x7) 

     f2 = function(z){ 
      par.new = list(x1 = z[1], x2 = z[2], x3 = z[3], x4 = z[4] 
      , x5 = z[5], x6 = z[6], x7 = z[7]) 
      f1(x, par.new) 
     } 

     optim(par1, f2, method = "L-BFGS-B", lower = rep(0, length(z)), 
     upper = rep(Inf,length(z)),control = list(trace = 5,fnscale=-1)) 
     > optim(par1, f2, method = "L-BFGS-B", lower = rep(0, length(z)), 
     upper = rep(Inf, length(z)), control = list(trace = 5,fnscale=-1)) 
     N = 7, M = 5 machine precision = 2.22045e-16 
     L = 0 0 0 0 0 0 0 
     X0 = 1 1 2 1.5 1 1.5 1 
     U = inf inf inf inf inf inf inf 
     At X0, 0 variables are exactly at the bounds 
     Error in optim(par1, f2, method = "L-BFGS-B", lower = rep(0, length(z)), : 
     L-BFGS-B needs finite values of 'fn' 
+0

'f1(x,par)'取決於參數矢量,也取決於變量'x'。那麼你是否試圖找到爲給定的一組參數而最大化'f1'的'x'的值,或者你是否想要爲給定的'x'找到最大化'f1'的一組參數?或者是別的什麼?? – jlhoward

+0

@jilhoward。我試圖找到一組參數,使給定的x最大化f1。 – rose

回答

2

在優化某個時刻,你的函數返回一個大於.Machine$double.xmax值(這是1.797693e+308我的機器上)。

因爲你的函數f1(...)被定義爲sum(log(exp(...))),由於log(exp(z)) = z任何Z,爲什麼不利用這一點:

par1 = c(1, 1, 2, 1.5, 1, 1.5, 1) 
x = seq(0, 500, length=100) 
f1 = function(par, x){ 
    sum(-(par[7])*(par[1]*x + par[2]*x^2/2 + 
          par[3] * (par[4]-x)^3/3+par[6] *(x-par[7])^3/3)) 
} 
result <- optim(par1, f1, x=x, 
       method = "L-BFGS-B", 
       lower = rep(0, length(par1)), upper = rep(Inf,length(par1)), 
       control = list(trace = 5,fnscale=-1)) 

result$par 
# [1] 2.026284e-01 2.026284e-01 8.290126e+08 0.000000e+00 1.000000e+00 9.995598e+35 2.920267e+27 
result$value 
# [1] 2.423136e+147 

注意的參數向量(par)必須第一參數f1