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.
Проверяйте выходное сообщение в командной строке или в структуре output. Когда выходное сообщение утверждает, что решатель сходился к решению, затем обычно решение надежно. Это сообщение соответствует 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