ошибка в целевой функции fmincon и решателя преждевременно остановлена, MATLAB для цикла - PullRequest
2 голосов
/ 04 октября 2019

Я завершаю оценку максимального правдоподобия внутри цикла for.

Когда я не сходюсь, я получаю это сообщение об ошибке,

error in objective function of fmincon and solver stopped prematurely

Я решил это с помощью этого ответа:https://uk.mathworks.com/matlabcentral/answers/131975-error-in-objective-function-of-fmincon-and-solver-stopped-prematurely

Однако в некоторых случаях

я все еще не могу сходиться.

Можно ли посчитать (автоматически), сколько раз я не сходился?

1 Ответ

4 голосов
/ 09 октября 2019

Вы можете использовать вывод exitflag функции fmincon:

[x,~,exitflag] = fmincon(fun,x0,A,b);

exitflag указать причину остановки fmincon.

Согласно документации exitflagможет принимать следующее значение:

All Algorithms:

 1 %First-order optimality measure was less than options.OptimalityTolerance, and maximum constraint violation was less than options.ConstraintTolerance.
 0 %Number of iterations exceeded options.MaxIterations or number of function evaluations exceeded options.MaxFunctionEvaluations.
-1 %Stopped by an output function or plot function.
-2 %No feasible point was found.

All algorithms except active-set:

 2 %Change in x was less than options.StepTolerance and maximum constraint violation was less than options.ConstraintTolerance.

trust-region-reflective algorithm only:

 3 %Change in the objective function value was less than options.FunctionTolerance and maximum constraint violation was less than options.ConstraintTolerance.

active-set algorithm only:

 4 %Magnitude of the search direction was less than 2*options.StepTolerance and maximum constraint violation was less than options.ConstraintTolerance.
 5 %Magnitude of directional derivative in search direction was less than 2*options.OptimalityTolerance and maximum constraint violation was less than options.ConstraintTolerance.

interior-point, sqp-legacy, and sqp algorithms:

-3 %Objective function at current iteration went below options.ObjectiveLimit and maximum constraint violation was less than options.ConstraintTolerance.

Если fmincon успешно определит минимум, тогда exitflag == 1. Таким образом, вы можете просто посчитать, сколько раз exitflag ~= 1

error_counter = 0;
for ii = 1:n_iteration
    [x,~,exitflag] = fmincon(fun,x0,A,b);
    if exitflag ~= 1
        error_counter = error_counter + 1
    end
end

И если вы хотите только проверить, что число итераций не превышено, вы можете заменить exitflag ~= 1 на exitflag == 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...