I am trying to define a simple optimization problem, arising from the discretization of a simple Optimal Control problem.
The problem that results is essentially linear, with bilinearities only appearing in some equality constraints. The problem is not big and should be solvable by FindMinimum.
However I get the following message:
Power::infy: Infinite expression 1/0. encountered. >>
Min::nord: Invalid comparison with ComplexInfinity attempted. >>
FindMinimum::conv: Interior point method fails to converge. >>
I note that the constraints do not contain divisions at all, and the objective is totally linear.
The complete model is given below:
Simple car problem
$\begin{align*}\frac{dv}{dt} &= u\\ \frac{dx}{dt} &= v\end{align*}$
$x(0)=0,\quad v(0)=0,\quad x(t_f)=300,\quad v(t_f)=0, \qquad \text{minimize } t_f$.
$-2 \leq u\leq +1$.
In[51]:= (* try to define the car problem directly below *)
(* v is velocity and x is distance, h is the stepsizes, u are the controls *)
nsteps = 10;
vlist = Table[v[i], {i, 0, nsteps}]
Out[52]= {v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10]}
In[53]:= xlist = Table[x[i], {i, 0, nsteps}]
Out[53]= {x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10]}
In[54]:= hlist = Table[h[i], {i, 1, nsteps}]
Out[54]= {h[1], h[2], h[3], h[4], h[5], h[6], h[7], h[8], h[9], h[10]}
In[55]:= ulist = Table[u[i], {i, 1, nsteps}]
Out[55]= {u[1], u[2], u[3], u[4], u[5], u[6], u[7], u[8], u[9], u[10]}
In[56]:= varslist = Join[vlist, xlist, hlist, ulist]
Out[56]= {v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], v[8], v[9], v[10], x[0],
x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], h[1], h[2],
h[3], h[4], h[5], h[6], h[7], h[8], h[9], h[10], u[1], u[2], u[3], u[4],
u[5], u[6], u[7], u[8], u[9], u[10]}
In[57]:= obj0 = Sum[h[i], {i, 1, nsteps}]
Out[57]= h[1] + h[2] + h[3] + h[4] + h[5] + h[6] + h[7] + h[8] + h[9] + h[10]
In[58]:= odes = Flatten[
Table[{x[i] - x[i - 1] == v[i]*h[i], v[i] - v[i - 1] == h[i]*u[i]}, {i, 1,
nsteps}]]
Out[58]= {-x[0] + x[1] == h[1] v[1], -v[0] + v[1] == h[1] u[1], -x[1] + x[2] ==
h[2] v[2], -v[1] + v[2] == h[2] u[2], -x[2] + x[3] ==
h[3] v[3], -v[2] + v[3] == h[3] u[3], -x[3] + x[4] ==
h[4] v[4], -v[3] + v[4] == h[4] u[4], -x[4] + x[5] ==
h[5] v[5], -v[4] + v[5] == h[5] u[5], -x[5] + x[6] ==
h[6] v[6], -v[5] + v[6] == h[6] u[6], -x[6] + x[7] ==
h[7] v[7], -v[6] + v[7] == h[7] u[7], -x[7] + x[8] ==
h[8] v[8], -v[7] + v[8] == h[8] u[8], -x[8] + x[9] ==
h[9] v[9], -v[8] + v[9] == h[9] u[9], -x[9] + x[10] ==
h[10] v[10], -v[9] + v[10] == h[10] u[10]}
In[59]:= ubounds = Flatten[Table[{u[i] <= 1.0, u[i] >= -2.0}, {i, 1, nsteps}]]
Out[59]= {u[1] <= 1., u[1] >= -2., u[2] <= 1., u[2] >= -2., u[3] <= 1., u[3] >= -2.,
u[4] <= 1., u[4] >= -2., u[5] <= 1., u[5] >= -2., u[6] <= 1., u[6] >= -2.,
u[7] <= 1., u[7] >= -2., u[8] <= 1., u[8] >= -2., u[9] <= 1., u[9] >= -2.,
u[10] <= 1., u[10] >= -2.}
In[60]:= hbounds = Flatten[Table[{h[i] <= 100.0, h[i] >= 0.01}, {i, 1, nsteps}]]
Out[60]= {h[1] <= 100., h[1] >= 0.01, h[2] <= 100., h[2] >= 0.01, h[3] <= 100.,
h[3] >= 0.01, h[4] <= 100., h[4] >= 0.01, h[5] <= 100., h[5] >= 0.01,
h[6] <= 100., h[6] >= 0.01, h[7] <= 100., h[7] >= 0.01, h[8] <= 100.,
h[8] >= 0.01, h[9] <= 100., h[9] >= 0.01, h[10] <= 100., h[10] >= 0.01}
In[61]:= boundary = {x[0] == 0.0, v[0] == 0.0, v[nsteps] == 0.0, x[nsteps] == 300.0}
Out[61]= {x[0] == 0., v[0] == 0., v[10] == 0., x[10] == 300.}
In[62]:= constr0 = Join[odes, ubounds, hbounds, boundary]
Out[62]= {-x[0] + x[1] == h[1] v[1], -v[0] + v[1] == h[1] u[1], -x[1] + x[2] ==
h[2] v[2], -v[1] + v[2] == h[2] u[2], -x[2] + x[3] ==
h[3] v[3], -v[2] + v[3] == h[3] u[3], -x[3] + x[4] ==
h[4] v[4], -v[3] + v[4] == h[4] u[4], -x[4] + x[5] ==
h[5] v[5], -v[4] + v[5] == h[5] u[5], -x[5] + x[6] ==
h[6] v[6], -v[5] + v[6] == h[6] u[6], -x[6] + x[7] ==
h[7] v[7], -v[6] + v[7] == h[7] u[7], -x[7] + x[8] ==
h[8] v[8], -v[7] + v[8] == h[8] u[8], -x[8] + x[9] ==
h[9] v[9], -v[8] + v[9] == h[9] u[9], -x[9] + x[10] ==
h[10] v[10], -v[9] + v[10] == h[10] u[10], u[1] <= 1., u[1] >= -2.,
u[2] <= 1., u[2] >= -2., u[3] <= 1., u[3] >= -2., u[4] <= 1., u[4] >= -2.,
u[5] <= 1., u[5] >= -2., u[6] <= 1., u[6] >= -2., u[7] <= 1., u[7] >= -2.,
u[8] <= 1., u[8] >= -2., u[9] <= 1., u[9] >= -2., u[10] <= 1., u[10] >= -2.,
h[1] <= 100., h[1] >= 0.01, h[2] <= 100., h[2] >= 0.01, h[3] <= 100.,
h[3] >= 0.01, h[4] <= 100., h[4] >= 0.01, h[5] <= 100., h[5] >= 0.01,
h[6] <= 100., h[6] >= 0.01, h[7] <= 100., h[7] >= 0.01, h[8] <= 100.,
h[8] >= 0.01, h[9] <= 100., h[9] >= 0.01, h[10] <= 100., h[10] >= 0.01,
x[0] == 0., v[0] == 0., v[10] == 0., x[10] == 300.}
In[63]:= nvars0 = Dimensions[varslist][[1]]
Out[63]= 42
In[64]:= vars0 = Transpose[{varslist, Table[Random[Real, {0., 1.}], {nvars0}]}]
Out[64]= {{v[0], 0.994273}, {v[1], 0.132455}, {v[2], 0.7492}, {v[3], 0.422551}, {v[4],
0.3127}, {v[5], 0.734046}, {v[6], 0.386862}, {v[7], 0.95813}, {v[8],
0.319134}, {v[9], 0.0195711}, {v[10], 0.547824}, {x[0], 0.126578}, {x[1],
0.91368}, {x[2], 0.385664}, {x[3], 0.195437}, {x[4], 0.589594}, {x[5],
0.369296}, {x[6], 0.437719}, {x[7], 0.205286}, {x[8], 0.210231}, {x[9],
0.145847}, {x[10], 0.225091}, {h[1], 0.572089}, {h[2], 0.681713}, {h[3],
0.151574}, {h[4], 0.0926365}, {h[5], 0.822889}, {h[6], 0.259161}, {h[7],
0.838874}, {h[8], 0.35859}, {h[9], 0.436027}, {h[10], 0.301031}, {u[1],
0.51974}, {u[2], 0.339019}, {u[3], 0.888204}, {u[4], 0.174453}, {u[5],
0.60606}, {u[6], 0.953355}, {u[7], 0.692767}, {u[8], 0.584859}, {u[9],
0.236764}, {u[10], 0.515636}}
In[65]:= constr0 = Apply[And, constr0]
Out[65]= -x[0] + x[1] == h[1] v[1] && -v[0] + v[1] == h[1] u[1] && -x[1] + x[2] ==
h[2] v[2] && -v[1] + v[2] == h[2] u[2] && -x[2] + x[3] ==
h[3] v[3] && -v[2] + v[3] == h[3] u[3] && -x[3] + x[4] ==
h[4] v[4] && -v[3] + v[4] == h[4] u[4] && -x[4] + x[5] ==
h[5] v[5] && -v[4] + v[5] == h[5] u[5] && -x[5] + x[6] ==
h[6] v[6] && -v[5] + v[6] == h[6] u[6] && -x[6] + x[7] ==
h[7] v[7] && -v[6] + v[7] == h[7] u[7] && -x[7] + x[8] ==
h[8] v[8] && -v[7] + v[8] == h[8] u[8] && -x[8] + x[9] ==
h[9] v[9] && -v[8] + v[9] == h[9] u[9] && -x[9] + x[10] ==
h[10] v[10] && -v[9] + v[10] == h[10] u[10] && u[1] <= 1. && u[1] >= -2. &&
u[2] <= 1. && u[2] >= -2. && u[3] <= 1. && u[3] >= -2. && u[4] <= 1. &&
u[4] >= -2. && u[5] <= 1. && u[5] >= -2. && u[6] <= 1. && u[6] >= -2. &&
u[7] <= 1. && u[7] >= -2. && u[8] <= 1. && u[8] >= -2. && u[9] <= 1. &&
u[9] >= -2. && u[10] <= 1. && u[10] >= -2. && h[1] <= 100. && h[1] >= 0.01 &&
h[2] <= 100. && h[2] >= 0.01 && h[3] <= 100. && h[3] >= 0.01 &&
h[4] <= 100. && h[4] >= 0.01 && h[5] <= 100. && h[5] >= 0.01 &&
h[6] <= 100. && h[6] >= 0.01 && h[7] <= 100. && h[7] >= 0.01 &&
h[8] <= 100. && h[8] >= 0.01 && h[9] <= 100. && h[9] >= 0.01 &&
h[10] <= 100. && h[10] >= 0.01 && x[0] == 0. && v[0] == 0. && v[10] == 0. &&
x[10] == 300.
In[66]:= FindMinimum[
{obj0, constr0}, vars0, Method -> "InteriorPoint"
]
During evaluation of In[66]:= Power::infy: Infinite expression 1/0. encountered. >>
During evaluation of In[66]:= Min::nord: Invalid comparison with ComplexInfinity attempted. >>
During evaluation of In[66]:= FindMinimum::conv: Interior point method fails to converge. >>
Out[66]= FindMinimum[{obj0, constr0}, vars0, Method -> "InteriorPoint"]