exponenta event banner

varindex

Сопоставить переменные проблемы с индексом переменных на основе решателя

Описание

пример

idx = varindex(prob) возвращает линейные индексы переменных задачи в виде структуры или целого вектора. При преобразовании prob в структуру проблемы с помощью prob2struct, idx дает индексы переменных в результирующей структуре задачи, которые соответствуют переменным в prob.

пример

idx = varindex(prob,varname) возвращает линейные индексы элементов varname.

Примеры

свернуть все

Создайте проблему оптимизации.

x = optimvar('x',3);
y = optimvar('y',3,3);
prob = optimproblem('Objective',x'*y*x);

Преобразование проблемы в структуру.

problem = prob2struct(prob);

Получение линейных индексов в problem из всех prob переменные.

idx = varindex(prob);
disp(idx.x)
     1     2     3
disp(idx.y)
     4     5     6     7     8     9    10    11    12

Получить y только индексы.

idxy = varindex(prob,'y')
idxy = 1×9

     4     5     6     7     8     9    10    11    12

В этом примере показано, как получить большую часть одной и той же информации, используя либо подход, основанный на проблемах, либо подход, основанный на решателях. Сначала создайте проблему и решите ее с помощью подхода, основанного на проблеме.

x = optimvar('x',3,1,'LowerBound',1,'UpperBound',1);
y = optimvar('y',3,3,'LowerBound',-1,'UpperBound',1);
prob = optimproblem('Objective',x'*y*x + [2 3 4]*x);
rng default
x0.x = rand(3, 1);
x0.y = rand(3, 3);
[solp,fvalp,exitflagp,outputp] = solve(prob,x0);
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Затем преобразуйте проблему в форму на основе решателя с помощью prob2struct. Чтобы иметь fmincon решатель использовать автоматические градиенты в задаче, установить SpecifyObjectiveGradient опция для true.

solverprob = prob2struct(prob,x0);
solverprob.options = optimoptions(solverprob.options,"SpecifyObjectiveGradient",true);

Решить проблему с помощью fmincon.

[sols,fvals,exitflags,outputs] = fmincon(solverprob);
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

Чтобы преобразовать fmincon решение в форме структуры, возвращенной solve, создайте соответствующие структуры с помощью varindex.

idx = varindex(prob);
sol.x = sols(idx.x);
sol.y = sols(idx.y);

y индекс, который varindex использует является линейным индексом. Изменение формы переменной sol.y чтобы иметь размер x0.y.

sol.y = reshape(sol.y,size(x0.y));

Проверьте, что две структуры решения идентичны.

isequal(sol,solp)
ans = logical
   1

Причина того, что два подхода не являются полностью эквивалентными, заключается в том, что fmincon может возвращать больше аргументов, таких как множители Лагранжа, тогда как solve не может.

Входные аргументы

свернуть все

Задача оптимизации или задача уравнения, указанная как OptimizationProblem объект или EquationProblem объект. Создание проблемы оптимизации с помощью optimproblem; создать задачу уравнения с помощью eqnproblem.

Предупреждение

Проблемный подход не поддерживает комплексные значения в целевой функции, нелинейные равенства или нелинейные неравенства. Если вычисление функции имеет комплексное значение, даже в качестве промежуточного значения, конечный результат может быть неверным.

Пример: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

Пример: prob = eqnproblem; prob.Equations = eqs;

Имя переменной, указанное как символьный вектор или строка.

Пример: 'x'

Типы данных: char | string

Выходные аргументы

свернуть все

Линейные индексы переменных задачи, возвращаемые как структура или целочисленный вектор. При преобразовании prob в структуру проблемы с помощью prob2struct, idx дает индексы переменных в результирующей структуре задачи, которые соответствуют переменным в prob.

  • При звонке idx = varindex(prob), возвращенный idx - структура. Имена полей структуры - это имена переменных в prob. Значение для каждого поля представляет собой целочисленный вектор линейных индексов, которому сопоставляются переменные в связанной переменной задачи на основе решателя.

  • При звонке idx = varindex(prob,varname), возвращенный idx - вектор линейных индексов, к которому относится переменная varname сопоставляет в связанной переменной задачи на основе решателя.

См. раздел Получение индексов проблем.

Представлен в R2019a