<div dir="ltr">Hello -<div><br></div><div>I have used IPOPT previously via its C/C++ interface, but now I am trying to use it through the pyIPOPT interface. I am using IPOPT version 3.10.0 installed on a computer cluster.</div>
<div><br></div><div>I have noticed that the initial point x0 for the optimization that I pass into IPOPT gets changed significantly, such that the first optimization iteration (or the point about which finite difference derivative checks are made) is quite different than the initial point I supplied.</div>
<div><br></div><div>Searching online I found some older threads about this issue, but these discussions appear to focus on when x0 is a near-optimal point which is near the boundary of the feasible region. In that case, IPOPT moves x0 way from the boundary so that its interior-point algorithms work properly.</div>
<div><br></div><div>However, in my case x0 is not expected to be optimal; it is simply a default state that I hope to improve. I observe significant changes in x0 even when no component of x0 is near its bounds, and even when I have turned off all constraint functions and bounds on the components of x.</div>
<div><br></div><div>Example: here is the value of x0 I pass into IPOPT via the pyIPOPT interface:</div><div><br></div><div><div>[ 0.5 0.5 0. 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25]</div>
<div><br></div><div>with the upper/lower bounds on each component of +/- 2e19.</div><div><br></div><div>The value of x first encountered in IPOPT is:</div><div><br></div><div><div><div>[ -8.6673931 -0.41015111 6.69634436 -3.0302794 1.55978807</div>
<div> -9.71466175 -5.99820966 10.0586816 5.25994266 2.42452724</div><div> -2.72581804]</div></div><div><br></div><div>Since there are no bounds, I don't understand why IPOPT would modify x0, which should certainly be an interior point. (Note - I see the same type of behavior, although with different perturbed x0, when the upper bounds are [1.0 1.0 2e19 0.35 0.35 0.35 0.35 0.35 0.35 0.35 0.35] and the lower bounds are [0.0 0.0 -2e19 0.02 0.02 0.02 0.02 0.02 0.02 0.02 0.02]).</div>
<div><br></div><div>Based on reading earlier threads, I have tried playing with the bound_push, bound_frac, etc. and other IPOPT options, including the following values which were set for the perturbed value of x0 given above:</div>
<div><br></div>
<div><div><font face="'courier new', monospace"> Name Value used</font></div><div><font face="'courier new', monospace"> acceptable_obj_change_tol = 0.0001 yes</font></div>
<div><font face="'courier new', monospace"> bound_frac = 1e-08 yes</font></div><div><font face="'courier new', monospace"> bound_mult_init_method = constant yes</font></div>
<div><font face="'courier new', monospace"> bound_mult_init_val = 1e-08 yes</font></div><div><font face="'courier new', monospace"> bound_push = 1e-08 yes</font></div>
<div><font face="'courier new', monospace"> bound_relax_factor = 1e-08 yes</font></div><div><font face="'courier new', monospace"> derivative_test = first-order yes</font></div>
<div><font face="'courier new', monospace">derivative_test_perturbation = 1e-05 yes</font></div><div><font face="'courier new', monospace"> derivative_test_print_all = yes yes</font></div>
<div><font face="'courier new', monospace"> findiff_perturbation = 1e-05 yes</font></div><div><font face="'courier new', monospace"> hessian_approximation = limited-memory yes</font></div>
<div><font face="'courier new', monospace"> max_iter = 100 yes</font></div><div><font face="'courier new', monospace"> mu_init = 1e-08 no</font></div>
<div><font face="'courier new', monospace"> nlp_scaling_method = none yes</font></div><div><font face="'courier new', monospace"> print_info_string = yes yes</font></div>
<div><font face="'courier new', monospace"> print_user_options = yes yes</font></div><div><font face="'courier new', monospace"> slack_bound_frac = 1e-08 yes</font></div>
<div><font face="'courier new', monospace"> slack_bound_push = 1e-08 yes</font></div><div><font face="'courier new', monospace"> tol = 1e-08 yes</font></div>
</div></div></div><div><br></div><div style>(Note that since the finite difference check was on and the reported value of x0 was taken during the first call to eval_f(), some of the options should not come into play, e.g. the fact that I am using Hessian approximation shouldn't be germane.)</div>
<div style><br></div><div style>Does anyone have any suggestions for what else I can try so that the x0 IPOPT uses is at least near the x0 I pass in?</div><div style><br></div><div style>Thank you,</div><div style>- Seth Watts</div>
<div style><br></div></div>