I don't have complete knowledge of your model, but could you use the ratio:
NewPIPmt/OldPIPmt
as one of your input parameters, instead of what you now have as x[4]? Since your x[4] only appears in the computation of of NewUPB, which would be computed directly from the mort() function, it would then go away and you could use x[4] for the new payment ratio parameter. Mathematically you could then just specify the correct bounds on that ratio directly and eliminate the non-linear constraint. Your objective might look something like this:
/* objective function, has minimum of 0 at x = xopt */
start redefault(x) global(coeff);
OldPIPmt=mort(coeff[19],.,coeff[20]/12,coeff[21]-coeff[22]);
/* let x[4] = NewPIPmt/OldPIPmt */
NewPIPmt = x[4] * OldPIPmt;
/* solve for new principal */
NewUPB = mort( ., NewPIPmt, x[1]/12,x[2]-coeff[22]);
CurrLTV = NewUPB/coeff[18];
LTVBasedOnOrigMV = NewUPB/coeff[17];
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);
return(Proceeds);
finish;
... View more