The problem
I have a quadratically constrained quadratic optimisation problem (QCQP) which takes about 13 seconds to find the optimal solution. I want to iteratively optimise a large number of times (50-100 times) and clearly it will take over 10 minutes to run the same problem 50-100 times (with different initial conditions) but I feel that it can be made faster.
I have narrowed down the reason to FindMinimize being slow at solving QCQPs. Any suggestions on how can I speed things up? I have tried playing with AccuracyGoal and PrecisionGoal with values like 3 and 3 respectively in particular and they offer significant improvement (more than halved runtime) but since the optimal values are small numbers which later get multiplied by 100 when calculating other quantities, precision and accuracy both seem important and I would like to not compromise there if possible.
Miniature code with important part intact
I am presenting a very simple version of my code here with small optimisation horizon and other numbers since giving the entire code seems overkill (it is quite long) and one with larger optimisation horizons would require me to supply large ready-made expressions (which would otherwise be calculated by my actual code). The extremely long expressions are just data I have given so that you can run my code and so that you have an idea of how the constraints and objective function look like.
inputs1 = {u51, u52};
(*the objective function of optimisation problem*)
obj = 1.2326*10^-32 + (-0.6 + u51)^2 + (-0.6 + u52)^2 + (-0.6 +
100. u51) (3231.8 (-0.6 + 100. u51) +
4.28555 (0. - 753.982 u51 + 100 u52)) + (0. - 753.982 u51 +
100 u52) (4.28555 (-0.6 + 100. u51) +
3231.8 (0. - 753.982 u51 + 100 u52));
(some constants to make sure you have all required values to run the
code)
M = 2;
alpha = 0.2;
hor = 2;
P = {{6.78614, -0.962986, 4.91036, -0.839262,
1.84927, -0.218886}, {-0.962986, 1.8242, -1.07876,
2.54396, -0.536404, 1.83934}, {4.91036, -1.07876,
3.70497, -1.16611, 1.4347, -0.571865}, {-0.839262,
2.54396, -1.16611, 3.64699, -0.633915,
2.69184}, {1.84927, -0.536404, 1.4347, -0.633915,
0.56924, -0.362581}, {-0.218886, 1.83934, -0.571865,
2.69184, -0.362581, 2.02307}};
windowfunction = Array[HammingWindow, 2*M + 1, {-1/2, 1/2}];
ga = {{0.0071, -0.0564, 0.00580, 0.0104, 0.00240, -0.0321}};
de = {{0.0026}} ;
zetas = {{0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0.,
0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.,
0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0.,
0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.,
0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0.,
0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0.,
0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0.,
0., 0., 0., 0.}, {0., 0., 0., 0., 0.,
0.}, {0. + 0.0679348 (0. + 1. (0. + 100. u51)), 0., 0., 0., 0.,
0.}, {0., 0., 0., 0., 0., 0.}, {0., 0., 0., 0., 0., 0.}, {0., 0.,
0., 0., 0., 0.}, {0. + 0.125 (0. + 1. (0. + 100. u51)), 0., 0.,
0., 0., 0.}, {0. + 0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.25 (0. + 1. (0. + 100. u51)), 0., 0., 0., 0.}, {0., 0., 0.,
0., 0., 0.}, {0., 0., 0., 0., 0.,
0.}, {0. + 0.0679348 (0. + 1. (0. + 100. u51)), 0., 0., 0., 0.,
0.}, {0. + 0.0233016 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.13587 (0. + 1. (0. + 100. u51)), 0., 0., 0.,
0.}, {0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.13587 (0. + 1. (0. + 100. u51)), 0., 0., 0.}, {0, 0, 0, 0,
0, 0}, {0.0108696 (0. + 1. (0. + 100. u51)), 0., 0., 0., 0.,
0.}, {0.00372826 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.0217391 (0. + 1. (0. + 100. u51)), 0., 0., 0.,
0.}, {-0.0252429 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0233016 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.0217391 (0. + 1. (0. + 100. u51)), 0., 0.,
0.}, {-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)),
0. + 0.0217391 (0. + 1. (0. + 100. u51)), 0., 0.}};
outputs = {{0}, {0}, {0}, {0}, {0.}, {0.}, {0. +
1. (0. + 100. u51)}, {0. +
1. (0. - 753.982 u51 + 100. u52)}, {0. +
1. (0. + 0.98241 u51 - 0.132629 u52)}, {0. +
1. (0. + 0.131326 u51 - 0.0174146 u52)}, {0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)}};
(writing and aggregating constraints of the problem)
domains = u51 [Element] Reals && u52 [Element] Reals;
setcons = {-15, -100} [VectorLessEqual] {0.,
0. + 100 u51} [VectorLessEqual] {15, 100} && -10 <= u51 <=
10 && -10 <= u52 <= 10;
terminalcons = (-0.6 + 100. u51) (-0.00308956 +
1.3506710^6 (-0.6 + 100. u51) -
2.3908410^6 (0. - 753.982 u51 + 100 u52)) +
1.03986 (0.0224865 - 0.00297113 (-0.6 + 100. u51) +
0.00227077 (0. - 753.982 u51 + 100 u52)) + (0. - 753.982 u51 +
100 u52) (0.00236128 - 2.3908410^6 (-0.6 + 100. u51) +
5.5994710^6 (0. - 753.982 u51 + 100 u52)) <= 1;
(next is the quadratic constraint calculation, which involves the
suspect Do loop)
speccons =
0. + (0. + 1. (0. + 100. u51)) (0. +
5.11153*10^-8 (0. + 1. (0. + 100. u51))) <= 0.2 &&
- (0. + 1. (0. + 100. u51)) (0. +
1.99669*10^-6 (0. + 1. (0. + 100. u51))) + (0. +
0.0679348 (0. + 1. (0. + 100. u51))) (0. +
6.78614 (0. + 0.0679348 (0. + 1. (0. + 100. u51)))) + (0. +
- (0. - 753.982 u51 + 100. u52)) (0. +
1.6052210^-6 (0. + 0.0679348 (0. + 1. (0. + 100. u51))) +
5.1115310^-8 (0. + 1. (0. - 753.982 u51 + 100. u52))) + (0. +
0.0679348 (0. + 1. (0. + 100. u51))) (0. +
0.00005041 (0. + 0.0679348 (0. + 1. (0. + 100. u51))) +
1.60522*10^-6 (0. + 1. (0. - 753.982 u51 + 100. u52))) <= 0.2 &&
- (0. + 1. (0. + 100. u51)) (0. +
6.76*10^-6 (0. + 1. (0. + 100. u51))) + (0. +
- (0. - 753.982 u51 + 100. u52)) (0. +
0.0000100326 (0. + 0.125 (0. + 1. (0. + 100. u51))) +
1.99669*10^-6 (0. + 1. (0. - 753.982 u51 + 100. u52))) + (0. +
0.125 (0. + 1. (0. + 100. u51))) (0. +
0.00005041 (0. + 0.125 (0. + 1. (0. + 100. u51))) +
0.0000100326 (0. + 1. (0. - 753.982 u51 + 100. u52))) + (0. +
0.25 (0. + 1. (0. + 100. u51))) (0. +
1.8242 (0. + 0.25 (0. + 1. (0. + 100. u51))) -
0.962986 (0. + 0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.25 (0. + 1. (0. + 100. u51))) (0. +
0.00318096 (0. + 0.25 (0. + 1. (0. + 100. u51))) -
0.0000127513 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) -
0.00040044 (0. + 0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
- (0. + 0.98241 u51 - 0.132629 u52)) (0. -
0.0000127513 (0. + 0.25 (0. + 1. (0. + 100. u51))) +
5.1115310^-8 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
1.6052210^-6 (0. + 0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.00040044 (0. + 0.25 (0. + 1. (0. + 100. u51))) +
1.60522*10^-6 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.00005041 (0. + 0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.962986 (0. + 0.25 (0. + 1. (0. + 100. u51))) +
6.78614 (0. + 0.042875 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) <= 0.2 &&
- (0. + 1. (0. + 100. u51)) (0. +
1.99669*10^-6 (0. + 1. (0. + 100. u51))) + (0. +
- (0. - 753.982 u51 + 100. u52)) (0. +
0.00001846 (0. + 0.0679348 (0. + 1. (0. + 100. u51))) +
6.76*10^-6 (0. + 1. (0. - 753.982 u51 + 100. u52))) + (0. +
0.0679348 (0. + 1. (0. + 100. u51))) (0. +
0.00005041 (0. + 0.0679348 (0. + 1. (0. + 100. u51))) +
0.00001846 (0. + 1. (0. - 753.982 u51 + 100. u52))) + (0. +
0.13587 (0. + 1. (0. + 100. u51))) (0. +
0.00318096 (0. + 0.13587 (0. + 1. (0. + 100. u51))) -
0.0000796957 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) -
0.00040044 (0. + 0.0233016 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
- (0. + 0.98241 u51 - 0.132629 u52)) (0. -
0.0000796957 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
1.9966910^-6 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0000100326 (0. + 0.0233016 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.0233016 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.00040044 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
0.0000100326 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.00005041 (0. + 0.0233016 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.13587 (0. + 1. (0. + 100. u51))) (0. +
3.70497 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
4.91036 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
1.07876 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. -
0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. +
4.91036 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
6.78614 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.962986 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. -
0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. +
0.00004118 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
1.6052210^-6 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) +
0.00005041 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00040044 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.13587 (0. + 1. (0. + 100. u51))) (0. +
0.00003364 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
1.3113*10^-6 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) +
0.00004118 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00032712 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
- (0. + 0.131326 u51 - 0.0174146 u52)) (0. +
1.311310^-6 (0. + 0.13587 (0. + 1. (0. + 100. u51))) +
5.1115310^-8 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) +
1.60522*10^-6 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.0000127513 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.00032712 (0. + 0.13587 (0. + 1. (0. + 100. u51))) -
0.0000127513 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.00040044 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.00318096 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
1.07876 (0. + 0.13587 (0. + 1. (0. + 100. u51))) -
0.962986 (0. - 0.157768 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.042875 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
1.8242 (0. + 0.0466033 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. - 753.982 u51 + 100. u52)))) <= 0.2 &&
- (0. + 1. (0. + 100. u51)) (0. +
5.11153*10^-8 (0. + 1. (0. + 100. u51))) + (0. +
- (0. - 753.982 u51 + 100. u52)) (0. +
1.090510^-7 (0. + 1. (0. + 100. u51)) +
1.9966910^-6 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.0108696 (0. + 1. (0. + 100. u51)) (0. +
5.47935*10^-7 (0. + 1. (0. + 100. u51)) +
0.0000100326 (0. + 1. (0. - 753.982 u51 + 100. u52))) + (0. +
0.0217391 (0. + 1. (0. + 100. u51))) (0. +
0.00318096 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) -
0.00014664 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) -
0.00040044 (0.00372826 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
1. (0. + 0.98241 u51 - 0.132629 u52)) (0. -
0.00014664 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
6.76*10^-6 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.00001846 (0.00372826 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. +
1. (0. - 753.982 u51 + 100. u52)))) + (0.00372826 (0. +
1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.00040044 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
0.00001846 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.00005041 (0.00372826 (0. + 1. (0. + 100. u51)) +
0.0679348 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.0217391 (0. + 1. (0. + 100. u51))) (0. +
3.64699 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) -
0.839262 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
2.54396 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
1.16611 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. -
0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. +
2.54396 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) -
0.962986 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
1.8242 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
1.07876 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. +
1. (0. - 753.982 u51 + 100. u52)))) + (-0.0252429 (0. +
1. (0. + 100. u51)) +
0.125 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0233016 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. +
0.00004118 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
0.0000100326 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) +
0.00005041 (-0.0252429 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0233016 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00040044 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.0217391 (0. + 1. (0. + 100. u51))) (0. +
0.00003364 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
8.19565*10^-6 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) +
0.00004118 (-0.0252429 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0233016 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00032712 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. -
0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.00058656 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) -
0.0000127513 (0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)) -
0.00040044 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.00318096 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00032712 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
1. (0. + 0.131326 u51 - 0.0174146 u52)) (0. +
8.19565*10^-6 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
1.99669*10^-6 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) +
0.0000100326 (-0.0252429 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0233016 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.0000796957 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)) (0. +
2.3513*10^-6 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
5.11153*10^-8 (0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)) +
1.60522*10^-6 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.0000127513 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
1.3113*10^-6 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. +
0.00006032 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
1.3113*10^-6 (0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)) +
0.00004118 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00032712 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.00003364 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. +
1. (0. - 753.982 u51 + 100. u52)))) + (-0.0117118 (0. +
1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. +
0.00007384 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
1.60522*10^-6 (0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)) +
0.00005041 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00040044 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.00004118 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.0217391 (0. + 1. (0. + 100. u51))) (0. +
0.00010816 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
2.3513*10^-6 (0. +
1. (0. - 0.000346987 u51 + 0.0000464269 u52)) +
0.00007384 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.00058656 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.00006032 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.00032712 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) -
0.0000796957 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.00040044 (-0.0252429 (0. + 1. (0. + 100. u51)) +
0.125 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0233016 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
0.00318096 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) + (0. +
0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
1.16611 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
4.91036 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
1.07876 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
3.70497 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. +
1. (0. - 753.982 u51 + 100. u52)))) + (-0.0117118 (0. +
1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) (0. -
0.839262 (0. + 0.0217391 (0. + 1. (0. + 100. u51))) +
6.78614 (-0.0117118 (0. + 1. (0. + 100. u51)) +
0.042875 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0679348 (0. + 1. (0. + 0.131326 u51 - 0.0174146 u52)) -
0.157768 (0. + 1. (0. - 753.982 u51 + 100. u52))) -
0.962986 (0. - 0.0504859 (0. + 1. (0. + 100. u51)) +
0.25 (0. + 1. (0. + 0.98241 u51 - 0.132629 u52)) +
0.0466033 (0. + 1. (0. - 753.982 u51 + 100. u52))) +
4.91036 (0. + 0.00745652 (0. + 1. (0. + 100. u51)) +
0.13587 (0. + 1. (0. - 753.982 u51 + 100. u52)))) <= 0.2;
(finally finding the optimal solution)
constraints = domains && speccons && terminalcons && setcons;
FindMinimum[{obj, constraints}, inputs1, Method -> "InteriorPoint",
MaxIterations -> 10000]
I am quite tired of this problem to be honest and would be extremely grateful for any suggestions. I have kept MaxIterations as 10000 because for larger optimisation horizon, this was needed to ensure I get an optimal solution satisfying tolerances. It seems though that it doesn't work for this smaller optimisation horizon.
Update to the question
Update 1: Based on Thorimur's comment and an experiment motivated by it, I have realised that my previous suspect, a Do loop, is not the culprit and hence I have modified this question to ask about how can FindMinimize be made faster (or what are the alternatives of course).
Update 2: Thank you very much for the answers, they all help. I am curious to know if using ConicOptimization function or QuadraticOptimization be faster than FindMinimum? Any comments would be really helpful. I thought along this line because all the answers here give things which speed up the code, but for horizon = 50, things still take quite long and it is practically impossible to post a miniature code here for horizon = 50.
Update 3: This is most likely too much to ask from you but I have uploaded my codes on GitHub here and with this, you can change the variable hor to whatever value you wish. The problem I wish to solve is hor=50 and M=20 and the miniature code I have given in the question (hor=2, M=2) is also derived from the uploaded codes. To run the notebook, all you will have to do is change the directory in SetDirectory to wherever you store the two packages (.wl files). In the off-chance you are not aware of this, the .nb file on GitHub looks ugly but upon pasting it in Mathematica, it will interpret the text and display it the way one would expect.

Method -> "InteriorPoint"seems to do the trick! Do you have it there for a reason? (If this works, I'll edit my answer.) – thorimur Mar 30 '21 at 20:15Simplify(which seems safe, unlikeFullSimplify) doesn't help? It seemed to halve the time in the given example, but I'm not sure how that generalizes. – thorimur Mar 30 '21 at 20:36FindMinimum; all I can suggest is that since you said you had to do it multiple different times, it might be worth trying to do those in parallel with e.g.Parallelizeor other parallel functionality (though mathematica's parallelization can be finicky, and might require some extra manual work, e.g. distribution of definitions to the right kernels, ensuring things don't conflict, etc.). – thorimur Mar 30 '21 at 22:27NMinimize[{obj, constraints}, inputs1, Method -> "DifferentialEvolution", MaxIterations -> 10000], I obtain error communications. – user64494 Apr 01 '21 at 14:27FindMinimum. Any particular reason you chose this method? I avoidedNMinimizebecause my problem is convex so I can use the fasterFindMinimuminstead and that would give me global minimizer as well. – ModCon Apr 01 '21 at 15:11