<body bgcolor="#ffffff" background="https://img.web.de/v/p.gif" class="bgRepeatYes" style="background-repeat: repeat;  background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-size: 9pt; padding-left: 0px;"><div style="min-height: 200px; background-image: url(https://img.web.de/v/p.gif); background-repeat: repeat; background-color: #ffffff; font-size: 9pt; padding-left: 0px;"><span style="font-family: courier new,courier;"><span style="font-size: 9pt;"><span style="background-color: transparent;"><span style="color: #000000;"><span style="color: #000000;">Dear Ipopt-community,<br /><br />I am having problems solving a simple optimization problem with only two variables.<br /></span></span></span></span>The problem is a very much simplified dynamic  optimization problem, where <span style="font-size: 9pt;"><span style="background-color: transparent;"><span style="color: #000000;"><span style="color: #000000;">the number of<br />variables n can be varied from 2 to an arbitrary number:<br /><br /></span></span></span></span>f=(x_n-2)^2<br /><br />grad_f= <br />( 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />( ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />( 2*(x_n-2) )<br /><br />g=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />( x_1+x_2*(h-1)&nbsp;&nbsp;&nbsp;&nbsp; )<br />( ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />( x_(n-1)+x_n*(h-1) )<br /><br />jac_g=<br />( 1&nbsp; h-1 ... 0 )<br />( ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />( 0 ... 1&nbsp; h-1 )<br /><br />h=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />( 0&nbsp; ...&nbsp; 0&nbsp; )<br />( ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />( 0&nbsp; ...&nbsp; 2&nbsp; )<br /><br />This is a very much simplified dynamic optimization problem. I modified the hs071.c example<br />code to solve this problem (the code is pasted below; it can be compiled with the makefile of <br />the hs071.c example); however, Ipopt finds it infeasible. I conjecture there is a problem<br />with the variable bounds since the Ipopt output says the total number of variables is one when<br />it is set to n=2. When n is set to 3, the message '"Too few degrees of freedom (n_x = 1, n_c = 2)."<br />is displayed after starting the optimization. For larger n, the same message with n_x = 1, n_c = (n-1)<br />appears. It therefore seems that the upper and lower variable bounds for all but one variables are<br />fixed to 0. This is also what I observe when displaying the variables during the iterations: only <br />variable n (n-1 in C-style counting) is changing its value.<br />It might well be that the problem lies somewhere else or in some programming mistake I made. I would<br />be thankful for any help or idea on this problem.<br /><br />Best regards,<br />Andreas<br /><br /><br /><br />#include "IpStdCInterface.h"<br />#include &lt;stdlib.h&gt;<br />#include &lt;assert.h&gt;<br />#include &lt;stdio.h&gt;<br /><br />/* Function Declarations */<br />Bool eval_f(Index n, Number* x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number* obj_value, UserDataPtr user_data);<br /><br />Bool eval_grad_f(Index n, Number* x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number* grad_f, UserDataPtr user_data);<br /><br />Bool eval_g(Index n, Number* x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index m, Number* g, UserDataPtr user_data);<br /><br />Bool eval_jac_g(Index n, Number *x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index m, Index nele_jac,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index *iRow, Index *jCol, Number *values,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserDataPtr user_data);<br /><br />Bool eval_h(Index n, Number *x, Bool new_x, Number obj_factor,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index m, Number *lambda, Bool new_lambda,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index nele_hess, Index *iRow, Index *jCol,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number *values, UserDataPtr user_data);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />double rhs(double x);<br />double dfdx(double x);<br />double d2fdx2(double x);<br /><br />int N=2;<br />double h=0.2;<br /><br />/* Main Program */<br />int main()<br />{<br />&nbsp; Index n=-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* number of variables */<br />&nbsp; Index m=-1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* number of constraints */<br />&nbsp; Number* x_L = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* lower bounds on x */<br />&nbsp; Number* x_U = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* upper bounds on x */<br />&nbsp; Number* g_L = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* lower bounds on g */<br />&nbsp; Number* g_U = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* upper bounds on g */<br />&nbsp; IpoptProblem nlp = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* IpoptProblem */<br />&nbsp; enum ApplicationReturnStatus status; /* Solve return code */<br />&nbsp; Number* x = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* starting point and solution vector */<br />&nbsp; Number* mult_x_L = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* lower bound multipliers<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; at the solution */<br />&nbsp; Number* mult_x_U = NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* upper bound multipliers<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; at the solution */<br />&nbsp; Number obj;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* objective value */<br />&nbsp; Index i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* generic counter */<br /><br />&nbsp; /* Number of nonzeros in the Jacobian of the constraints */<br />&nbsp; Index nele_jac = 2*(N-1);<br />&nbsp; /* Number of nonzeros in the Hessian of the Lagrangian (lower or<br />&nbsp;&nbsp;&nbsp;&nbsp; upper triangual part only) */<br />&nbsp; Index nele_hess = 1;<br />&nbsp; /* indexing style for matrices */<br />&nbsp; Index index_style = 0; /* C-style; start counting of rows and column<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; indices at 0 */<br /><br />&nbsp; /* set the number of variables and allocate space for the bounds */<br />&nbsp; n=N;<br />&nbsp; x_L = (Number*)malloc(sizeof(Number)*n);<br />&nbsp; x_U = (Number*)malloc(sizeof(Number)*n);<br />&nbsp; /* set the values for the variable bounds */<br />&nbsp; for (i=0; i&lt;n; i++) {<br />&nbsp;&nbsp;&nbsp; x_L[i] = 0.1;<br />&nbsp;&nbsp;&nbsp; x_U[i] = 3.0;<br />&nbsp; }<br /><br />&nbsp; /* set the number of constraints and allocate space for the bounds */<br />&nbsp; m=N-1;<br />&nbsp; g_L = (Number*)malloc(sizeof(Number)*m);<br />&nbsp; g_U = (Number*)malloc(sizeof(Number)*m);<br />&nbsp; /* set the values of the constraint bounds */<br />&nbsp; for (i=0; i&lt;m; i++) {<br />&nbsp;&nbsp;&nbsp; x_L[i] = 0;<br />&nbsp;&nbsp;&nbsp; x_U[i] = 0;<br />&nbsp; } &nbsp;<br /><br />&nbsp; /* create the IpoptProblem */<br />&nbsp; nlp = CreateIpoptProblem(n, x_L, x_U, m, g_L, g_U, nele_jac, nele_hess,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index_style, &amp;eval_f, &amp;eval_g, &amp;eval_grad_f,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;eval_jac_g, &amp;eval_h);<br /><br />&nbsp; /* We can free the memory now - the values for the bounds have been<br />&nbsp;&nbsp;&nbsp;&nbsp; copied internally in CreateIpoptProblem */<br />&nbsp; free(x_L);<br />&nbsp; free(x_U);<br />&nbsp; free(g_L);<br />&nbsp; free(g_U);<br /><br />&nbsp; /* Set some options.&nbsp; Note the following ones are only examples,<br />&nbsp;&nbsp;&nbsp;&nbsp; they might not be suitable for your problem. */<br />&nbsp; AddIpoptNumOption(nlp, "tol", 1e-7);<br />&nbsp; AddIpoptStrOption(nlp, "mu_strategy", "adaptive");<br />&nbsp; AddIpoptStrOption(nlp, "output_file", "ipopt.out");<br /><br />&nbsp; /* allocate space for the initial point and set the values */<br />&nbsp; x = (Number*)malloc(sizeof(Number)*n);<br />&nbsp; <br />&nbsp; for (i=0; i&lt;n; i++) {<br />&nbsp;&nbsp;&nbsp; x[i] = 1;<br />&nbsp; }<br /><br />&nbsp; /* allocate space to store the bound multipliers at the solution */<br />&nbsp; mult_x_L = (Number*)malloc(sizeof(Number)*n);<br />&nbsp; mult_x_U = (Number*)malloc(sizeof(Number)*n);<br /><br />&nbsp; /* solve the problem */<br />&nbsp; status = IpoptSolve(nlp, x, NULL, &amp;obj, NULL, mult_x_L, mult_x_U, NULL);<br /><br />&nbsp; if (status == Solve_Succeeded) {<br />&nbsp;&nbsp;&nbsp; printf("\n\nSolution of the primal variables, x\n");<br />&nbsp;&nbsp;&nbsp; for (i=0; i&lt;n; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("x[%d] = %e\n", i, x[i]);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; printf("\n\nSolution of the bound multipliers, z_L and z_U\n");<br />&nbsp;&nbsp;&nbsp; for (i=0; i&lt;n; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("z_L[%d] = %e\n", i, mult_x_L[i]);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; for (i=0; i&lt;n; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("z_U[%d] = %e\n", i, mult_x_U[i]);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; printf("\n\nObjective value\n");<br />&nbsp;&nbsp;&nbsp; printf("f(x*) = %e\n", obj);<br />&nbsp; }<br /><br />&nbsp; /* free allocated memory */<br />&nbsp; FreeIpoptProblem(nlp);<br />&nbsp; free(x);<br />&nbsp; free(mult_x_L);<br />&nbsp; free(mult_x_U);<br /><br />&nbsp; return 0;<br />}<br /><br /><br />/* Function Implementations */<br />Bool eval_f(Index n, Number* x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number* obj_value, UserDataPtr user_data)<br />{<br />&nbsp; assert(n == N);<br />&nbsp; *obj_value = (x[N-1]-2)*(x[N-1]-2);<br /><br />&nbsp; return TRUE;<br />}<br /><br />Bool eval_grad_f(Index n, Number* x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number* grad_f, UserDataPtr user_data)<br />{<br />&nbsp; int i;<br />&nbsp; assert(n == N);<br /><br />&nbsp; for (i=0;i&lt;N-1;i++) grad_f[i]=0;<br />&nbsp; grad_f[N-1]=2*(x[N-1]-2);<br /><br />&nbsp; return TRUE;<br />}<br /><br />Bool eval_g(Index n, Number* x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index m, Number* g, UserDataPtr user_data)<br />{<br />&nbsp; int i;<br />&nbsp; assert(n == N);<br />&nbsp; assert(m == N-1);<br /><br />&nbsp; for (i=0;i&lt;N-1;i++){<br />&nbsp;&nbsp;&nbsp; g[i]=x[i]+h*x[i+1]-x[i+1];<br />&nbsp; }<br /><br />&nbsp; return TRUE;<br />}<br /><br />Bool eval_jac_g(Index n, Number *x, Bool new_x,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index m, Index nele_jac,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index *iRow, Index *jCol, Number *values,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserDataPtr user_data)<br />{<br />&nbsp; if (values == NULL) {<br />&nbsp;&nbsp;&nbsp; /* return the structure of the jacobian */<br /><br />&nbsp;&nbsp;&nbsp; /* this particular jacobian is dense */<br />&nbsp;&nbsp;&nbsp; int i;<br />&nbsp;&nbsp;&nbsp; int c=0;<br />&nbsp;&nbsp;&nbsp; for (i=0;i&lt;N-1;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iRow[c]=i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jCol[c]=i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iRow[c]=i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jCol[c]=i+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; assert(nele_jac==c);<br />&nbsp; }<br />&nbsp; else {<br />&nbsp;&nbsp;&nbsp; /* return the values of the jacobian of the constraints */<br /><br />&nbsp;&nbsp;&nbsp; int i;<br />&nbsp;&nbsp;&nbsp; int c=0;<br />&nbsp;&nbsp;&nbsp; for (i=0;i&lt;N-1;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values[c]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; values[c]=h-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br /><br />&nbsp; return TRUE;<br />}<br /><br />Bool eval_h(Index n, Number *x, Bool new_x, Number obj_factor,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index m, Number *lambda, Bool new_lambda,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Index nele_hess, Index *iRow, Index *jCol,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number *values, UserDataPtr user_data)<br />{<br /><br />&nbsp; if (values == NULL) {<br />&nbsp;&nbsp;&nbsp; /* return the structure. This is a symmetric matrix, fill the lower left<br />&nbsp;&nbsp;&nbsp;&nbsp; * triangle only. */<br /><br />&nbsp;&nbsp;&nbsp; /* the hessian for this problem is actually dense */<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iRow[0] = N-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jCol[0] = N-1;<br /><br />&nbsp;&nbsp;&nbsp; assert(1 == nele_hess);<br />&nbsp; }<br />&nbsp; else {<br />&nbsp;&nbsp;&nbsp; /* return the values. This is a symmetric matrix, fill the lower left<br />&nbsp;&nbsp;&nbsp;&nbsp; * triangle only */<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;values[0]=obj_factor *2;<br /><br />&nbsp;&nbsp;&nbsp; /* fill the objective portion */<br /><br />&nbsp; }<br /><br />&nbsp; return TRUE;<br />}<br /></span></div>&nbsp;&nbsp;<br><br><table cellpadding="0" cellspacing="0" border="0"><tr><td bgcolor="#000000"><img src="https://img.web.de/p.gif" width="1" height="1" border="0" alt="" /></td></tr><tr><td style="font-family:verdana; font-size:12px; line-height:17px;">WEB.DE DSL Doppel-Flat ab 19,99 &euro;/mtl.! Jetzt auch mit &nbsp;&nbsp;&nbsp;<br>gratis Notebook-Flat! <a href="http://produkte.web.de/go/DSL_Doppel_Flatrate/2"><b>http://produkte.web.de/go/DSL_Doppel_Flatrate/2</b></a></td></tr></table>
</body>