Ошибка Matlab fmincon Решатель преждевременно остановлен

У меня есть заданный путь для манипулятора с 6 степенями свободы для заданных узлов. путь (степень свободы, узел)

path_f=[-0.5131   -0.6587   -1.0058   -1.4202   -1.7674   -1.9130
      -0.8696   -0.6711   -0.1980    0.3667    0.8399    1.0383
      -0.8961   -0.7433   -0.3789    0.0560    0.4205    0.5733
       1.1714    0.9639    0.4691   -0.1215   -0.6163   -0.8238
      -3.1000   -2.5800   -1.3400    0.1400    1.3800    1.9000
      -1.1514   -0.9439   -0.4491    0.1415    0.6363    0.8438]

Я сгенерировал кубические сплайны между каждым суставом, и каждый временной интервал определяется как h(i), и я попытался найти минимальное значение h, равное h(1)+h(2)+h(3)+h(4)+h(5).

чтобы решить эту проблему, я написал код:

  options=optimset('Algorithm','sqp','Display','iter','DiffMinChange',1e-16,'DiffMaxChange',1e-4,'TolFun',1e-14,'TolX',1e-20,'MaxFunEvals',60000,'MaxIter',1000);

    h0=[0.001; 0.001; 0.001; 0.001; 0.001]

    h=fmincon(@(h)objecfun(h,path), h0, [], [], [], [], [0; 0; 0; 0; 0] , [], @(h) nonlconstraint(h,Robot,path_f,dof), options); 

Когда я запускаю код, он говорит:

Поиск решения остановлен преждевременно. fmincon остановлен из-за превышения лимита итераций, options.MaxIter = 1000 (выбранное значение).

После 5-й итерации значение f(x) не меняется, и результаты:

    Norm of First-order
 Iter F-count            f(x) Feasibility  Steplength        step  optimality
    0       6    2.500000e-01   2.001e+01                           1.000e+00
    1      12    3.903637e-01   8.013e+00   1.000e+00   6.374e-02   6.077e-01
    2      18    5.115308e-01   2.485e+00   1.000e+00   5.914e-02   3.255e-01
    3      24    5.519283e-01   4.258e-01   1.000e+00   2.941e-02   1.712e-01
    4      30    5.528961e-01   1.288e-02   1.000e+00   5.382e-03   3.098e-02
    5      36    5.530002e-01   4.399e-06   1.000e+00   2.153e-04   2.442e-02
    6      42    5.530000e-01   3.403e-12   1.000e+00   1.305e-07   1.828e-06
    7      48    5.530000e-01   8.704e-14   1.000e+00   1.050e-13   3.103e-07
    8      54    5.530000e-01   8.349e-14   1.000e+00   3.211e-15   1.465e-07
    9      65    5.530000e-01   6.573e-14   1.681e-01   2.713e-16   1.319e-07
   10      72    5.530000e-01   3.020e-14   7.000e-01   9.286e-16   3.740e-08

Я понятия не имею, в чем причина этого. Не могли бы вы мне помочь?


person user70299    schedule 30.07.2015    source источник
comment
Это может быть связано с тем, что: 1) Ваша функция для минимизации неверна 2) Минимизация этой функции очень сложна и требует большего количества итераций 3) Минимизация этой функции невозможна.   -  person Ander Biguri    schedule 30.07.2015
comment
Я также добавил результаты. Я изменил номер итерации, и значение f(x), которое является значением h, осталось прежним, однако процесс продолжается.   -  person user70299    schedule 30.07.2015


Ответы (1)


Ваш f(x), вероятно, меняется, но вы не видите этого в этом разрешении. Посмотрите на величину вашего шага. Попробуйте масштабировать вашу проблему или (если это приемлемо для вашего случая) увеличить DiffMinChange.

person mabe    schedule 30.07.2015
comment
Есть также TolFun и TolX. Вам нужна такая высокая точность? Может ли ваша целевая функция обеспечить f(x) с такой высокой точностью? - person mabe; 30.07.2015
comment
Я также пытался увеличить DiffMinChange, и это не сработало. Снова выдает ошибку. Там написано: локальный минимум возможен. Ограничения удовлетворены. fmincon остановлен, так как размер текущего шага меньше выбранного значения допуска размера шага, а ограничения выполняются с точностью до выбранного значения допуска ограничения. ‹детали критериев остановки› - person user70299; 30.07.2015
comment
На самом деле это не похоже на ошибку (сообщение, которое вы получаете в своем вопросе, тоже не похоже). Это дает вам подробную информацию о том, почему оптимизатор остановился. Хорошо сконфигурированный оптимизатор представляет собой сбалансированный компромисс между требуемой точностью и числом итераций/временем вычислений. Каковы ваши результаты на этот раз? - person mabe; 30.07.2015
comment
Возможно ли, что это локальное минимальное значение? Если да, то как я могу от него избавиться? - person user70299; 30.07.2015
comment
Я не знаю формы f(x), но теоретически это возможно. Чтобы справиться с этим, вы можете: (1) проанализировать форму f(x), проверить, есть ли у нее локальные минимумы, (2) если f(x) не слишком сумасшедшая, изменить начальные значения так, чтобы алгоритм нашел global min проще (также может улучшить время вычислений) или (3) выбрать глобальный оптимизатор. - person mabe; 30.07.2015
comment
Мой objfun h(1)+h(2)+h(3)+h(4)+h(5), что означает линейность, но ограничения abs(-(d(i+1)-time(j))^2/(2*h(i))*ddq(i)+(time(j)-d(i))^2/(2*h(i))*ddq(i+1)+(ptheta(i+1)/h(i)-h(i)*ddq(i+1)/6)-(ptheta(i)/h(i)-h(i)*ddq(i)/6))-10<=0. Я начал сомневаться в алгоритме, который использую (sqp). Это правильно или я должен изменить его? Я также пытался использовать алгоритм «внутренняя точка», но он также застрял в локальном минимуме. - person user70299; 03.08.2015
comment
У меня все еще та же проблема. До сих пор я пытался 1. Увеличить DiffMinChange: он все еще не смог найти решение, 2. Изменить «TolFun» и «TolX», он сказал: «Не найдено приемлемого решения». fmincon остановлен, так как размер текущего шага меньше выбранного значения допуска размера шага, но ограничения не удовлетворяются в пределах значения допуска ограничения по умолчанию. ‹детали критериев остановки› Кто-нибудь знает о проблеме? - person user70299; 24.09.2015
comment
извините не могу помочь вам дальше. может проблема не имеет допустимого решения? Кстати, я собираюсь удалить этот ответ, так как на самом деле это не ответ. Поэтому, если у вас есть новый вопрос или уточнение, отправьте его на свой вопрос выше. - person mabe; 25.09.2015