Your m = 0 should be m = 1, and you haven't used p anywhere. Here are three approaches that should help you proceed. The first approach is closest to your model: proc optmodel PRESOLVER=NONE; set I; number ID{I}; number r{I}, p{I},m{I},a1{I}, a2{I}; var der{I} init 1; read data test into I = [_n_] ID = _n_ r = r a1 = a1 a2 = a2 p=p m=m; var d >=-1000 <=1000; con der_con {j in I}: der = if m =1 then 1+(r +d)/3 else der[j-1]*(1+(r +d)/3); impvar der1 {j in I} =(a2 -a1 )/der ; impvar value=sum{k in I} der1 ; min g=abs((value/2)-1); solve; print d; quit; The second approach avoids the absolute value function, which is nondifferentiable and causes difficulty for smooth NLP solvers. proc optmodel PRESOLVER=NONE; set I; number ID{I}; number r{I}, p{I},m{I},a1{I}, a2{I}; var der{I} init 1; read data test into I = [_n_] ID = _n_ r = r a1 = a1 a2 = a2 p=p m=m; var d >=-1000 <=1000; con der_con {j in I}: der = if m =1 then 1+(r +d)/3 else der[j-1]*(1+(r +d)/3); impvar der1 {j in I} =(a2 -a1 )/der ; impvar value=sum{k in I} der1 ; var gplus >= 0; var gminus >= 0; con g_con: (value/2)-1 = gplus - gminus; min g = gplus+gminus; solve; print d; quit; The third approach linearizes the absolute value using inequalities instead of equality: proc optmodel PRESOLVER=NONE; set I; number ID{I}; number r{I}, p{I},m{I},a1{I}, a2{I}; var der{I} init 1; read data test into I = [_n_] ID = _n_ r = r a1 = a1 a2 = a2 p=p m=m; var d >=-1000 <=1000; con der_con {j in I}: der = if m =1 then 1+(r +d)/3 else der[j-1]*(1+(r +d)/3); impvar der1 {j in I} =(a2 -a1 )/der ; impvar value=sum{k in I} der1 ; var gabs >= 0; con g_con1: gabs >= (value/2)-1; con g_con2: gabs >= -(value/2)+1; min g = gabs; solve; print d; quit;
... View more