对双变量函数

时间:2015-07-08 08:57:22

标签: r mathematical-optimization

我在使用两个参数优化函数时遇到问题。

# Creating a corresponding mock data set
N=2000
x <- rnorm(N,0,1)
x <- cumsum(x)
n=length(x)

k=1

dx = rep(0,n-k)
for (i in k:(n - 1)){
  sumx = 0
  for (j in 0:k){
    sumx = sumx + (-1)^j*choose(k,j)*x[i-j+1]
  }
  dx[i-k+1] = sumx
}

vpk <- matrix(ncol = 1, nrow = 10)
for (p in seq(from=1, to=10,by=1)) { 
  vpk[p*1] <- sum(abs(dx)^p)
}

vpk = data.frame(vpk);
names(vpk)='V1';
vpk$V2 = 1:10;

现在我的功能最小化

Rab <- function(a,b){
  g <- ifelse(a>0 & a<1-1/p & p >=b & b<=2, a*p,
              ifelse(a>0 & a<1-1/b & p< b & b<=2, -1+(a+1/b),
                     ifelse(a >= 1-1/pmax(p,b) & b<=2,-1+p,NA)))
} 

#p=1
suma <- function(a,b){
  sume=0
  for(p in seq(from=1,to=10, by=1)){
    sume = sume + (log(vpk$V1[p])/log(n^(-1))-outer(a,b,Rab))^2
  }
  return(sume)
}

我希望最小化的值是abab的值如下:

a= seq(0.1,5,by=0.25)
b= seq(0,2,by=0.1)

现在,我可以通过首先定义a

,使用上面的bz绘制函数
z <-suma(a,b)

persp(a,b,z, theta=-135, phi=45, ticktype='detailed')
image(a,b,z)
contour(a,b,z, add=T)

在这里我可以看到,对于要最小化的函数,a应该接近0并且可以介于0和2之间。

现在,我想做的是最小化&#39; suma'。这是我遇到麻烦的地方。我已经完成了:

optim(c(0.00001,1.5), suma)

但我想我需要让suma只是一个参数的功能才能使它工作。任何帮助表示赞赏!我已尝试使用optim,但我可能想尝试其他套餐?

1 个答案:

答案 0 :(得分:2)

将您的功能更改为:

suma <- function(par){
  sume=0
  for(p in seq(from=1,to=10, by=1)){
    sume = sume + (log(vpk$V1[p])/log(n^(-1))-outer(par[1],par[2],Rab))^2
  }
  return(sume)
}

您可能会对包optimx感兴趣。