By mistake, I sent it earlier to the wrong address. ---------- Forwarded message ---------- From: Priyank Dwivedi <dpriyan...@gmail.com> Date: 17 June 2016 at 14:50 Subject: Matrix Constraints in R Optim To: r-help-ow...@r-project.org
Hi, Below is the code snippet I wrote in R: The basic idea is to minimize error by optimizing set of values (in this scenario 12) in the form of a matrix. I defined the matrix elements as vector "*my.data.var" * and then stacked it into a matrix called "*my.data.var.mat" in the error function. * The only part that I can't figure out is "what if the column sum in the *my.data.var.mat needs to be <=1"; that's the constraint/s.. Where do I introduce it in the OPTIM solver or elsewhere?* *my.data.matrix.inj* <- as.matrix(my.data) #convert DATA FRAME to MATRIX my.data.matrix.inj *my.data.matrix.time* <- as.matrix(my.data.2) #convert DATA FRAME to MATRIX my.data.matrix.time *my.data.matrix.prod* <- as.matrix(my.data) #convert DATA FRAME to MATRIX my.data.matrix.prod *my.data.var* <- c(2,0.8,0.5,0.2,0.2,0.1,10,0.01,0.02,0.2,0.1,0.01,2,0.8,0.5,0.2,0.2,0.1,10,0.01,0.02,0.2,0.1,0.01,2,0.8,0.5,0.2,0.2,0.1,10,0.01,0.02,0.2,0.1,0.01) my.data.var *my.data.qo* <- c(5990,150,199,996) #Pre-Waterflood Production *my.data.timet0* <- 0 # starting condition for time *#FUNCTIONQjk.Cal.func* <- function(my.data.timet0,my.data.qo,my.data.matrix.time, my.data.matrix.inj, my.data.matrix.prod,my.data.var,my.data.var.mat) { qjk.cal.matrix <- matrix(,nrow = nrow(my.data.matrix.prod), ncol=ncol(my.data.matrix.prod)) count <- 1 number <- 1 for(colnum in 1:ncol(my.data.matrix.prod)) # loop through all PROD wells columns { sum <-0 for(row in 1:nrow(my.data.matrix.prod)) #loop through all the rows { sum <-0 deltaT <-0 expo <-0 for(column in 1:ncol(my.data.matrix.inj)) #loop through all the injector columns to get the PRODUCT SUM { sum = sum + my.data.matrix.inj[row,column]*my.data.var.mat[colnum,number+column] } if(count<2) { deltaT<- my.data.matrix.time[row] } else {deltaT <- my.data.matrix.time[row]-my.data.matrix.time[row-1]} expo <- exp(-deltaT/my.data.var.mat[colnum,1]) # change here too if(count<2) { qjk.cal.matrix[row,colnum] = my.data.qo[colnum]*expo + (1-expo)*sum } else { qjk.cal.matrix[row,colnum]=qjk.cal.matrix[row-1,colnum]*expo + (1-expo)*sum } count <- count+1 } count <-1 } qjk.cal.matrix # RETURN CALCULATED MATRIX TO THE ERROR FUNCTION } *# ERROR FUNCTION* - FINDS DIFFERENCE BETWEEN CAL. MATRIX AND ORIGINAL MATRIX. Miminize the Error by changing my.data.var *Error.func* <- function(my.data.var) { #First convert vector(my.data.var) to MATRIX aand send it to calculate new MATRIX *my.data.var.mat* <- matrix(my.data.var,nrow = ncol(my.data.matrix.prod),ncol = ncol(my.data.matrix.inj)+1,byrow = TRUE) * Calc.Qjk.Value* <- Qjk.Cal.func(my.data.timet0,my.data.qo,my.data.matrix.time, my.data.matrix.inj, my.data.matrix.prod,my.data.var,my.data.var.mat) diff.values <- my.data.matrix.prod-Calc.Qjk.Value #FIND DIFFERENCE BETWEEN CAL. MATRIX AND ORIGINAL MATRIX Error <- ((colSums ((diff.values^2), na.rm = FALSE, dims = 1))/nrow(my.data.matrix.inj))^0.5 #sum of square root of the diff print(paste(Error)) Error_total <- sum(Error,na.rm=FALSE)/ncol(my.data.matrix.prod) # total avg error * Error_total* } # OPTIMIZE *optim*(*my.data.var* ,Error.func,method="L-BFGS-B",upper=c(Inf,1,1,1,1,1,Inf,1,1,1,1,1,Inf,1,1,1,1,1,Inf,1,1,1,1,1)) -- Best Regards, PD -- Best Regards, Priyank Dwivedi [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.