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);

The y индекс, который varindex uses является линейным индексом. Измените форму переменной 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