<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&#39;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="&#39;courier new&#39;, monospace">                        Name   Value          used</font></div><div><font face="&#39;courier new&#39;, monospace">   acceptable_obj_change_tol = 0.0001         yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">                  bound_frac = 1e-08          yes</font></div><div><font face="&#39;courier new&#39;, monospace">      bound_mult_init_method = constant       yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">         bound_mult_init_val = 1e-08          yes</font></div><div><font face="&#39;courier new&#39;, monospace">                  bound_push = 1e-08          yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">          bound_relax_factor = 1e-08          yes</font></div><div><font face="&#39;courier new&#39;, monospace">             derivative_test = first-order    yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">derivative_test_perturbation = 1e-05          yes</font></div><div><font face="&#39;courier new&#39;, monospace">   derivative_test_print_all = yes            yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">        findiff_perturbation = 1e-05          yes</font></div><div><font face="&#39;courier new&#39;, monospace">       hessian_approximation = limited-memory yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">                    max_iter = 100            yes</font></div><div><font face="&#39;courier new&#39;, monospace">                     mu_init = 1e-08          no</font></div>
<div><font face="&#39;courier new&#39;, monospace">          nlp_scaling_method = none           yes</font></div><div><font face="&#39;courier new&#39;, monospace">           print_info_string = yes            yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">          print_user_options = yes            yes</font></div><div><font face="&#39;courier new&#39;, monospace">            slack_bound_frac = 1e-08          yes</font></div>
<div><font face="&#39;courier new&#39;, monospace">            slack_bound_push = 1e-08          yes</font></div><div><font face="&#39;courier new&#39;, 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&#39;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>