Optimizing from a function and a matrix containing -infinities. Using R, optim()

180 Views Asked by At

(If anyone has a suggestion for a better title, please let me know.)

I am trying to write a backward induction optimization problem. (That might not be important, but if it helps, great.)

I have a function that is a function of two variables, x and y.

I have a matrix for which I know only the terminal column, and each column needs to be solves backwards using the last column and optimization over x and y.

For example

m.state=matrix(1:16,16,1)
m.valuemat=matrix(0,16,5)
# five is number of periods 
#16 is num of states (rows)

##Suppose i want to make optim avoid chosing a configuration that lands us in states 1-5 at the end
m.valuemat[1:5,5]=-Inf



f.foo0=function(x,y){
        util=2*x^2-y^1.5
    return(util)
}

foo=function(x,y,a){

    footomorrow=function(x,y,a){
        at1=-x+2*y+a

    atround=abs(m.state-at1)
    round2=m.state[which(min(atround)==atround)]
    at1=round2  


        Vtp1=m.valuemat[which(m.state==at1),(5+1)]
                    return(Vtp1)
    }

    valuetoday=f.foo0(x,y)+.9*footomorrow(x,y,a)

    return(valuetoday)
}




# I know the final column should be all 0's 
for(i in 1:4){
print(i)
    i=5-i
    for(j in 1:16){

        tempfunction=function(x){
            foo(x[1],x[2],m.state[j])
        }

        result=optim(c(.001,1), tempfunction, gr = NULL, method = "L-BFGS-B", 
                                                                    lower = c(0.001,0.001), upper = c(5,1),
                                                                    control = list(fnscale=-1,
                                                                    maxit=50000), hessian = FALSE)


    m.valuemat[j,i]=result$value
        print(  m.valuemat)
}


}

The error you get is: Error in optim(c(0.001, 1), f.Vt.ext, gr = NULL, method = "L-BFGS-B", : L-BFGS-B needs finite values of 'fn'.

Is there a way to make optim smarter about this? Or a condition I can put or something? This is obviously a simplified version of my real code.

0

There are 0 best solutions below