Thanks Hutch.
Below is the code for the objective function i'm trying to maximize;
proc iml;
/* objective function, has minimum of 0 at x = xopt */
start redefault(x) global(coeff);
NewUPB=(1+coeff[14]-x[3]-x[4])*coeff[19];
NewPIPmt=mort((1+coeff[14]-x[3]-x[4])*coeff[19],.,x[1]/12,x[2]-coeff[22]);
OldPIPmt=mort(coeff[19],.,coeff[20]/12,coeff[21]-coeff[22]);
CurrLTV=(1+coeff[14]-x[3]-x[4])*coeff[19]/coeff[18];
LTVBasedOnOrigMV=(1+coeff[14]-x[3]-x[4])*coeff[19]/coeff[17];
/*Upper and Lower Bounds for Chng in Pmt*/
if OldPIPmt > 0 then do;
ub = (1-0.1) * OldPIPmt;
lb = (1-0.3) * OldPIPmt;
end;
else do;
ub = (1-0.3) * OldPIPmt;
lb = (1-0.1) * OldPIPmt;
end;
/*Fixup Variables - NOT BEING USED CURRENTLY*//*
do while (lb>NewPIPmt);
x[1]=x[1]+.000125;
x[2]=x[2]-12;
/*x[3]=x[3]+.005;
x[4]=x[4]+.005;
NewPIPmt=mort((1+coeff[14]-x[3]-x[4])*coeff[19],.,x[1]/12,x[2]-coeff[22]);
end;
do while (NewPIPmt > ub);
x[1]=x[1]-.000125;
NewPIPmt=mort((1+coeff[14]-x[3]-x[4])*coeff[19],.,x[1]/12,x[2]-coeff[22]);
end;
*/
RedefRt=1/(1+exp(-1*
(-5.2815+
1.8953*(NewPIPmt/OldPIPmt-1)+
1.6129*log(1+coeff[2])+
0.1531*coeff[3]+
0.3222*CurrLTV+
0.4368*LTVBasedOnOrigMV+
-2.7613*(coeff[4]- 1) +
0.00531*coeff[5]+
-0.6964*coeff[6]+
-0.2283*coeff[7]+
0.7078*coeff[8]+
0.1932*coeff[9]+
1.2001*coeff[10]+
0.3751*coeff[11]+
0.000808*coeff[12]+
-0.00297*coeff[13]+
0.9974*coeff[14]+
0.1633*coeff[15]+
-0.0949*coeff[16])));
Proceeds = ((mort(.,NewPIPmt,x[1]/12,x[2]-coeff[22]-coeff[2])+(x[3]*coeff[19]))*(1-RedefRt) + coeff[23]*RedefRt);
/* Penalize the children that don't conform to the constraints */
if lb > NewPIPmt | coeff[20] x[2] then
f=.5*Proceeds;
else if NewPIPmt > ub | coeff[20] x[2] then
f=.5*Proceeds;
else f=Proceeds;
return(f);
finish redefault;
Now, the non-linear constraint is that (NewPIPmt/OldPIPmt-1) should be between -0.3 and -0.1, by varying the x[] parts of NewPIPmt.

... View more