coin-or / CppAD

A C++ Algorithmic Differentiation Package: Home Page
https://cppad.readthedocs.io
Other
482 stars 98 forks source link

abnormal optimisation result by using CppAD with IPOPT #109

Closed martial-dong closed 3 years ago

martial-dong commented 3 years ago

Hello,

I am using CppAD and IPOPT to solve a optimization problem. I tested this solver with a simple example as follows:

i. I define a system of robot motion like: $v[i + 1] = v[i] + a[i] * dt$. ii. let $v[0] = 20, a[0] = 0$. iii. define the objective function $fg[0] = 0$.

The vars and fgs are defined well, and the problem is solved.

I got the solution, but it is not same as expected. I thought that all the $a[i]$ should be zero, and $v[i]$ keep the initial value, because no objective function is considered, however the solution is :

v = 20, 18.0975, 16.376, 14.8183, 13.4087, 12.1332, 10.979, 9.93466, 8.98963, 8.1345, 7.36071, 6.66052, 6.02694, 5.45363, 4.93486, 4.46543, 4.04066, 3.6563, 3.30849, 2.99378, 2.709, 2.45131, 2.21813, 2.00713, 1.81621, 1.64345, 1.48712, 1.34566, 1.21766, 1.10184, 0.997035, 0.9022, 0.816387, 0.738739, 0.668477, 0.604901, 0.547373, 0.495319, 0.448219, 0.4056, 0.367038, 0.332146, 0.300575, 0.27201, 0.246166, 0.222782, 0.201627, 0.182488, 0.165174, 0.149512, 0.135344, 0.122531, 0.110942, 0.100463, 0.0909885, 0.0824239, 0.0746836, 0.0676901, 0.0613735, 0.0556706, 0.0505245, 0.0458835, 0.0417015, 0.0379364, 0.0345507, 0.0315105, 0.0287854, 0.0263482, 0.0241744, 0.0222424, 0.0205328, 0.0190285, 0.0177146, 0.0165777, 0.0156067, 0.0147917, 0.0141246, 0.0135988, 0.013209, 0.0129512, 0.012823 .......

a = 0, -19.0247, -17.2151, -15.5775, -14.0958, -12.7549, -11.5416, -10.4438, -9.4503, -8.55135, -7.73791, -7.00184, -6.3358, -5.73311, -5.18774, -4.69426, -4.24772, -3.84365, -3.47803, -3.14718, -2.8478, -2.5769, -2.33177, -2.10996, -1.90924, -1.72762, -1.56328, -1.41457, -1.28, -1.15823, -1.04805, -0.948346, -0.858126, -0.776487, -0.702613, -0.635766, -0.575276, -0.520538, -0.471006, -0.426184, -0.385624, -0.348921, -0.315706, -0.285649, -0.258448, -0.233831, -0.211553, -0.19139, -0.173141, -0.156624, -0.141673, -0.128138, -0.115885, -0.104791, -0.0947446, -0.0856458, -0.0774034, -0.069935, -0.063166, -0.0570287, -0.0514616, -0.0464092, -0.0418208, -0.0376507, -0.033857, -0.030402, -0.0272509, -0.0243724, -0.0217376, -0.0193201, -0.0170959, -0.0150426, -0.0131397, -0.0113683, -0.00971051, -0.00814984, -0.00667067, -0.00525821, -0.00389832, -0.00257743, -0.0012823 ........

This result confuses me for a long while. Is that the logical result of the solver or an error caused perhaps by my code ?

Many thanks for any hint.

bradbell commented 3 years ago

It seems from your description above that the objective function does not depend on any of the variables ? Perhaps it would help this discussion if you wrote down the objective using mathematical notaion.

martial-dong commented 3 years ago

It seems from your description above that the objective function does not depend on any of the variables ? Perhaps it would help this discussion if you wrote down the objective using mathematical notaion.

@bradbell Thank you for your response. Yes, here the defined objective function is just zero and does not depend on any variable. This is just a test case of IPOPT solver in our project. With my knowledge, in this case, the acceleration $a$ would be zero, because no gradient or jacobian could be found. I didn't read the detail of the code in IPOPT package, but it seems that if objective function is zero, the 2-norm of all the variables will converge to zero.

bradbell commented 3 years ago

If the objective does not depend on the variables, any value of the variables is optimal and one has no reason to expect a particular value.

It sees from your description that you want a sort of prior on the acceleration so that, given not other data, the acceleration would be zero. Perhaps something like adding a small factor times the 2-norm of the acceleration to the objective.