[Ipopt] initial point in pyIPOPT

Seth Watts watts2 at illinois.edu
Mon Jun 9 11:42:09 EDT 2014

Hello -

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.

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.

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.

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.

Example: here is the value of x0 I pass into IPOPT via the pyIPOPT

[ 0.5   0.5   0.    0.25  0.25  0.25  0.25  0.25  0.25  0.25  0.25]

with the upper/lower bounds on each component of +/- 2e19.

The value of x first encountered in IPOPT is:

[ -8.6673931   -0.41015111   6.69634436  -3.0302794    1.55978807
  -9.71466175  -5.99820966  10.0586816    5.25994266  2.42452724

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]).

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:

                        Name   Value          used
   acceptable_obj_change_tol = 0.0001         yes
                  bound_frac = 1e-08          yes
      bound_mult_init_method = constant       yes
         bound_mult_init_val = 1e-08          yes
                  bound_push = 1e-08          yes
          bound_relax_factor = 1e-08          yes
             derivative_test = first-order    yes
derivative_test_perturbation = 1e-05          yes
   derivative_test_print_all = yes            yes
        findiff_perturbation = 1e-05          yes
       hessian_approximation = limited-memory yes
                    max_iter = 100            yes
                     mu_init = 1e-08          no
          nlp_scaling_method = none           yes
           print_info_string = yes            yes
          print_user_options = yes            yes
            slack_bound_frac = 1e-08          yes
            slack_bound_push = 1e-08          yes
                         tol = 1e-08          yes

(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.)

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?

Thank you,
- Seth Watts
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/ipopt/attachments/20140609/7fe42752/attachment.html>

More information about the Ipopt mailing list