Hello R users,
I am trying to minimize two functions with genoud. It is actually one function
with two sets of data, each of them having two unknown variables (called Vcmax
and gi) which have the same value in each of the function. They are called f.1
and f.2 in the code below.
My objective to minimize the functions in order to get the two variables equal
in each of the functions. Furthermore, I have a measured comparison value for
each of the function expression, and the results of f.1 and f.2 should be very
close or equal to their measured value, so that measured.1 - f.1 = 0.
I have been able to run genoud with the code below. However, I haven't been
able to restrain the values of the difference between the measured and
estimated value to 0. I am fairly new at writing R functions and I think there
might be something I haven't written that makes the output parameters of genoud
not replicable.
I have made several runs of this function and when comparing with the measured
value, I got answers between 1 and 12, where it should have been very close to
7.47.
This example has already been solved with the solver Excel add-in and theh
result are:
Vcmax = 104.32, gi = 0.11
The values were also estimated using another approach and they are:
Vcmax = 64.48, gi = 0.28
Here is my code.
######
f=function(x) {
x = c(0.16,80)
Vcmax = x[2]
gi = x[1]
# First dataset
f.1=function(x){
(-(((Vcmax-0.89189)/gi)+164.6573+272.38*(1+21*10/165.82))+sqrt((((Vcmax-0.89189)/gi)+164.6573+272.38*(1+21*10/165.82))^2-4*(-1/gi)*(0.89189*(164.6573+272.38*(1+21*10/165.82))-Vcmax*(164.6573-(5*21/2.605459)))))/(-2/gi)
}
# Second data set
f.2=function(x){
(-(((Vcmax-0.89189)/gi)+164.3077+272.38*(1+2*10/165.82))+sqrt((((Vcmax-0.89189)/gi)+164.3077+272.38*(1+2*10/165.82))^2-4*(-1/gi)*(0.89189*(164.3077+272.38*(1+2*10/165.82))-Vcmax*(164.3077-(5*2/2.605459)))))/(-2/gi)
}
# Values here are the measured values. f.1 and f.2 should be equal or close to
the value on their left.
y.1 = (7.478327 - f.1(x))
y.2 = (12.73134 - f.2(x))
# This should be close to 0.
y = y.1 - y.2
return(y)
}
dom = matrix(c(0,0,200,1.5), 2, 2)
res = genoud(f, nvars=2, max=FALSE,Domains=dom,pop.size=5000,print.level=0)
# In order to test the results to see I the estimated variables make the "test"
function = 7.478327 or near.
# This is the same as f.1
test=function(Vcmax, gi){
(-(((Vcmax-0.89189)/gi)+164.6573+272.38*(1+21*10/165.82))+sqrt((((Vcmax-0.89189)/gi)+164.6573+272.38*(1+21*10/165.82))^2-4*(-1/gi)*(0.89189*(164.6573+272.38*(1+21*10/165.82))-Vcmax*(164.6573-(5*21/2.605459)))))/(-2/gi)
}
test(res$par[1],res$par[2])
## End
Thank you for your help!
Guillaume Théroux Rancourt
Ph.D. candidate --- Plant Biology
Université Laval, Québec, QC, Canada
[email protected]
______________________________________________
[email protected] mailing list
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.