solve функция возвращает решение в виде структуры, причем каждая переменная в задаче имеет поле в структуре. Чтобы легко получить числовые значения выражений в задаче из этой структуры, используйте evaluate функция.
Например, решить задачу линейного программирования в двух переменных.
x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x -y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;
sol = solve(prob)Solving problem using linprog.
Optimal solution found.
sol =
struct with fields:
x: 0.6667
y: 1.3333Предположим, что требуется значение целевой функции в решении. Можно повторно запустить задачу, на этот раз запросив значение целевой функции и решение.
[sol,fval] = solve(prob)
Solving problem using linprog.
Optimal solution found.
sol =
struct with fields:
x: 0.6667
y: 1.3333
fval =
-1.1111Кроме того, для трудоемкой задачи сэкономьте время путем оценки целевой функции в решении с использованием evaluate.
fval = evaluate(prob.Objective,sol)
fval = -1.1111
Чтобы проверить, является ли решение, о котором сообщается, точным, можно просмотреть результаты из solve. Вернуть все solve продукция
[sol,fval,exitflag,output,lambda] = solve(prob);
Проверьте флаг выхода. exitflag = OptimalSolution обычно означает, что solve сходится к решению. Для пояснения другого exitflag значения, см. exitflag.
Проверьте сообщение о выходе в командной строке или в структуре вывода. Если в сообщении о выходе указано, что решатель сходится к решению, то решение, как правило, является надежным. Это сообщение соответствует exitflag = OptimalSolution.
При наличии целочисленных ограничений проверьте абсолютный и относительный промежутки в сообщении выхода или в структуре вывода. Когда эти промежутки равны нулю или почти нулю, решение является надежным.
Если solve сообщает, что ваша проблема неосуществима (флаг выхода: NoFeasiblePointFound), изучите неосуществимость проблемы в различных точках, чтобы увидеть, какие ограничения могут быть чрезмерно ограничительными. Предположим, что имеется одна переменная непрерывной оптимизации с именем x с конечными границами для всех компонентов, и у вас есть ограничения constr1 через constr20.
N = 100; % check 100 points infeas = zeros(N,20); % allocate L = x.LowerBound; U = x.UpperBound; S = numel(L); pthist = cell(N); for k = 1:N pt = L + rand(size(L)).*(U-L); pthist{k} = pt; for j = 1:20 infeas(k,j) = infeasibility(['constr',num2str(j)],pt); end end
Результат infeas(a,b) имеет ненулевые значения везде, где связана точка pt{a} непригоден для ограничения b.
Если solve занимает много времени, есть несколько возможных причин и средств правовой защиты.
Постановка проблемы идет медленно. Если в вложенных контурах определены выражения цели или ограничения, то solve может занять много времени, чтобы преобразовать проблему внутри в матричную форму. Чтобы ускорить решение, попробуйте сформулировать выражения векторизированным образом. См. раздел Создание проблем эффективной оптимизации.
Решение смешанно-целочисленного линейного программирования является медленным. Иногда можно ускорить целочисленную проблему, задав параметры. Можно также переформулировать проблему, чтобы ускорить ее решение. См. раздел Настройка целочисленного линейного программирования.
Решение нелинейного программирования медленно. Рекомендации см. в разделе Решатель занимает слишком много времени. Дополнительные рекомендации см. в разделе Отказ решателя.
Превышен предел решателя. Чтобы решить некоторые проблемы, solve может занять больше, чем количество шагов решения по умолчанию. Для проблем с целочисленными ограничениями увеличьте число разрешенных шагов, увеличив LPMaxIterations, MaxNodes,MaxTime, или RootLPMaxIterations для значений, превышающих значение по умолчанию. Чтобы задать эти параметры, используйте optimoptions('intlinprog',...). Для проблем, не являющихся целочисленными, увеличьте MaxIterations опция с использованием optimoptions('linprog','MaxIterations',...). Посмотрите options.
evaluate | infeasibility | solve