exponenta event banner

prob2struct

Преобразовать задачу оптимизации или задачу уравнения в форму решателя

Описание

Использовать prob2struct преобразование задачи оптимизации или задачи уравнения в форму решателя.

пример

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

пример

problem = prob2struct(prob,x0) также преобразует начальную структуру точек x0 и включает его в problem.

пример

problem = prob2struct(___,Name,Value)для любых входных аргументов задает дополнительные параметры, используя один или несколько аргументов пары имя-значение. Например, для задачи нелинейной оптимизации, problem = prob2struct(prob,'ObjectiveFunctionName','objfun1') указывает, что prob2struct создает файл целевой функции с именем objfun1.m в текущей папке.

Примеры

свернуть все

Преобразование объекта задачи оптимизации в структуру задачи.

Введите основную задачу MILP из Основы линейного программирования со смешанным целым: на основе проблем.

ingots = optimvar('ingots',4,1,'Type','integer','LowerBound',0,'UpperBound',1);
alloys = optimvar('alloys',4,1,'LowerBound',0);

weightIngots = [5,3,4,6];
costIngots = weightIngots.*[350,330,310,280];
costAlloys = [500,450,400,100];
cost = costIngots*ingots + costAlloys*alloys;

steelprob = optimproblem;
steelprob.Objective = cost;

totalweight = weightIngots*ingots + sum(alloys);

carbonIngots = [5,4,5,3]/100;
molybIngots = [3,3,4,4,]/100;
carbonAlloys = [8,7,6,3]/100;
molybAlloys = [6,7,8,9]/100;

totalCarbon = (weightIngots.*carbonIngots)*ingots + carbonAlloys*alloys;
totalMolyb = (weightIngots.*molybIngots)*ingots + molybAlloys*alloys;

steelprob.Constraints.conswt = totalweight == 25;
steelprob.Constraints.conscarb = totalCarbon == 1.25;
steelprob.Constraints.consmolyb = totalMolyb == 1.25;

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

problem = prob2struct(steelprob);

Проверьте результирующую матрицу ограничений линейного равенства и вектор.

Aeq = problem.Aeq
Aeq = 
   (1,1)       1.0000
   (2,1)       0.0800
   (3,1)       0.0600
   (1,2)       1.0000
   (2,2)       0.0700
   (3,2)       0.0700
   (1,3)       1.0000
   (2,3)       0.0600
   (3,3)       0.0800
   (1,4)       1.0000
   (2,4)       0.0300
   (3,4)       0.0900
   (1,5)       5.0000
   (2,5)       0.2500
   (3,5)       0.1500
   (1,6)       3.0000
   (2,6)       0.1200
   (3,6)       0.0900
   (1,7)       4.0000
   (2,7)       0.2000
   (3,7)       0.1600
   (1,8)       6.0000
   (2,8)       0.1800
   (3,8)       0.2400

beq = problem.beq
beq = 3×1

   25.0000
    1.2500
    1.2500

Осмотрите границы.

problem.lb
ans = 8×1

     0
     0
     0
     0
     0
     0
     0
     0

problem.ub
ans = 8×1

   Inf
   Inf
   Inf
   Inf
     1
     1
     1
     1

Решить проблему, позвонив intlinprog.

x = intlinprog(problem)
LP:                Optimal objective value is 8125.600000.                                          

Cut Generation:    Applied 3 mir cuts.                                                              
                   Lower bound is 8495.000000.                                                      
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
x = 8×1

    7.2500
         0
    0.2500
    3.5000
    1.0000
    1.0000
         0
    1.0000

Создайте нелинейную задачу в структуре, основанной на проблемах.

x = optimvar('x',2);
fun = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
prob = optimproblem('Objective',fun);
mycon = dot(x,x) <= 4;
prob.Constraints.mycon = mycon;
x0.x = [-1;1.5];

Новообращенный prob к структуре задачи оптимизации. Назовите созданный файл целевой функции 'rosenbrock' и файл функции ограничения 'circle2'.

problem = prob2struct(prob,x0,'ObjectiveFunctionName','rosenbrock',...
    'ConstraintFunctionName','circle2');

prob2struct создает нелинейные файлы функций целей и ограничений в текущей папке. Чтобы создать эти файлы в другой папке, используйте 'FileLocation' пара имя-значение.

Решите проблему.

[x,fval] = fmincon(problem)
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.
x = 2×1

    1.0000
    1.0000

fval = 4.6187e-11

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

свернуть все

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

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

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

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

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

Начальная точка, заданная как структура с именами полей, равными именам переменных в prob.

Для примера использования x0 с именованными индексными переменными см. раздел Создание начальной точки для оптимизации с именованными индексными переменными.

Пример: Если prob имеет переменные с именем x и y: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3].

Типы данных: struct

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: problem = prob2struct(prob,'FileLocation','C:\Documents\myproblem')

Указание на использование автоматического дифференцирования (AD) для нелинейных функций ограничения, указанных как разделенная запятыми пара, состоящая из 'ConstraintDerivative' и 'auto' (используйте AD, если возможно), 'auto-forward' (используйте прямой AD, если это возможно), 'auto-reverse' (используйте обратный AD, если возможно), или 'finite-differences' (не используйте AD). Выбор, включая auto заставить результирующий файл функции ограничения использовать информацию о градиенте при решении проблемы при условии, что функции ограничения поддерживаются, как описано в разделе Поддерживаемые операции с переменными оптимизации и выражениями. Пример см. в разделе Дериваты поставки в потоке операций на основе проблем.

Примечание

Использование автоматических производных в проблеме, преобразованной prob2struct, передайте параметры, определяющие эти производные.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

Пример: 'finite-differences'

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

Имя файла функции нелинейных ограничений, созданного prob2struct для задачи оптимизации, указанной как пара, разделенная запятыми, состоящая из 'ConstraintFunctionName' и имя файла. Этот аргумент применяется к fmincon или fminunc проблемы; посмотрите problem. Не включать расширение файла .m в имени файла. prob2struct добавляет расширение файла при его создании.

Если не указать ConstraintFunctionName, то prob2struct переписывает 'generatedConstraints.m'. Если не указать FileLocation, то prob2struct создает файл в текущей папке.

Возвращенный problem структура относится к этому файлу функции.

Пример: "mynlcons"

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

Имя файла функции нелинейных уравнений, созданного prob2struct для задачи уравнения, указанной как пара, разделенная запятыми, состоящая из 'EquationFunctionName' и имя файла. Этот аргумент применяется к fsolve, fzero, или lsqnonlin уравнения; посмотрите problem. Не включать расширение файла .m в имени файла. prob2struct добавляет расширение файла при его создании.

Если не указать EquationFunctionName, то prob2struct переписывает 'generatedEquation.m'. Если не указать FileLocation, то prob2struct создает файл в текущей папке.

Возвращенный problem структура относится к этому файлу функции.

Пример: "myequation"

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

Расположение созданных файлов (целевая функция, функция ограничения и другие файлы подфункций), указанное как разделенная запятыми пара, состоящая из 'FileLocation' и путь к папке, доступной для записи. Все созданные файлы хранятся в этой папке; несколько папок не поддерживаются.

Пример: 'C:Documents\MATLAB\myproject'

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

Указание на использование автоматического дифференцирования (AD) для нелинейной целевой функции, определяемой как разделенная запятыми пара, состоящая из 'ObjectiveDerivative' и 'auto' (используйте AD, если возможно), 'auto-forward' (используйте прямой AD, если это возможно), 'auto-reverse' (используйте обратный AD, если возможно), или 'finite-differences' (не используйте AD). Выбор, включая auto заставлять результирующий файл целевой функции включать производную информацию при решении задачи при условии, что целевая функция поддерживается, как описано в разделе Поддерживаемые операции с переменными и выражениями оптимизации. Пример см. в разделе Дериваты поставки в потоке операций на основе проблем.

Примечание

Использование автоматических производных в проблеме, преобразованной prob2struct, передайте параметры, определяющие эти производные.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

Пример: 'finite-differences'

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

Имя файла целевой функции, созданного prob2struct для задачи оптимизации, указанной как пара, разделенная запятыми, состоящая из 'ObjectiveFunctionName' и имя файла. Этот аргумент применяется к fmincon или fminunc проблемы; посмотрите problem. Не включать расширение файла .m в имени файла. prob2struct добавляет расширение файла при его создании.

Если не указать ObjectiveFunctionName, то prob2struct переписывает 'generatedObjective.m'. Если не указать FileLocation, то prob2struct создает файл в текущей папке.

Возвращенный problem структура относится к этому файлу функции.

Пример: "myobj"

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

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

свернуть все

Структура проблемы, возвращенная как fmincon problem структура, fminunc problem структура, fsolve problem структура, intlinprog problem структура, linprog problem структура, lsqlin problem структура, lsqnonlin структура илиproblem quadprog problem структура.

В следующей таблице приведен результирующий тип задачи для задач оптимизации.

Типы целей и ограничений оптимизации (линейные ограничения включают границы)

Тип результирующей проблемы

Линейная целевая функция и функция ограничения.

По крайней мере одна переменная проблемы имеет 'integer' тип.

intlinprog

Линейная целевая функция и функция ограничения.

Ни одна переменная проблемы не имеет 'integer' тип.

linprog

Функции линейных зависимостей.

Целевая функция является константой плюс сумма квадратов линейных выражений.

lsqlin

Связанные зависимости.

Целевая функция является константой плюс сумма квадратов общих нелинейных выражений.

lsqnonlin

Функции линейных зависимостей.

Общая квадратичная целевая функция.

quadprog

Общая нелинейная целевая функция.

Никаких ограничений.

fminunc

Общая нелинейная целевая функция, и существует по крайней мере одно ограничение любого типа.

Или существует, по крайней мере, одна общая нелинейная функция ограничения.

fmincon

В следующей таблице приведен результирующий тип задачи для решения задач уравнения.

Типы уравнений

Тип результирующей проблемы

Линейная система с границами или без них

lsqlin

Скалярное (одиночное) нелинейное уравнение

fzero

Нелинейная система без ограничений

fsolve

Нелинейная система с границами

lsqnonlin

Примечание

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

Для задач линейной и квадратичной оптимизации структура задачи включает дополнительное поле, f0, которая представляет собой аддитивную константу для целевой функции. При решении структуры задачи с помощью указанного решателя возвращаемое значение целевой функции не включает f0 значение. Если вы решите prob с использованием solve функция, возвращенное значение целевой функции включает в себя f0 значение.

Если ObjectiveSense prob является 'max' или 'maximize', то problem использует негатив целевой функции в prob потому что решатели минимизируют. Чтобы максимизировать, они минимизируют негатив исходной целевой функции. В этом случае сообщаемое оптимальное значение функции от решателя является отрицательным значением в исходной задаче. См. раздел Максимизация цели. Вы не можете использовать lsqlin для задачи максимизации.

Совет

  • При звонке prob2struct несколько раз в одной сессии MATLAB ® для нелинейных проблем, используйте ObjectiveFunctionName или EquationFunctionName аргумент и, при необходимости, ConstraintFunctionName аргумент. Указание уникальных имен гарантирует, что результирующие структуры проблем ссылаются на правильные функции цели и ограничения. В противном случае последующие вызовы prob2struct может привести к перезаписи существующих файлов сгенерированных нелинейных функций.

  • Чтобы избежать бесконечной рекурсии, не вызывайте prob2struct внутри целевой функции или функции ограничения.

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

Алгоритмы

свернуть все

Преобразование в форму решателя

Основой структуры задачи является неявное упорядочение всех переменных задачи в один вектор. Порядок переменных задачи совпадает с порядком переменных Variables свойство в prob. Посмотрите OptimizationProblem. Вы также можете найти заказ с помощью varindex.

Например, предположим, что переменные проблемы расположены в следующем порядке:

  • x - массив 3 на 2 на 4

  • y - массив 3 на 2

В этом случае неявный порядок переменных такой же, как если бы переменная проблемы была vars = [x(:);y(:)].

Первые 24 элемента vars эквивалентны x(:), и следующие шесть элементов эквивалентны y(:), в общей сложности 30 элементов. Нижняя и верхняя границы соответствуют этому порядку переменных, и каждая матрица линейных ограничений имеет 30 столбцов.

Для проблем с общими нелинейными целевыми функциями или функциями ограничения: prob2struct создает файлы функций в текущей папке или в папке, указанной в FileLocation. Возвращенный problem структура относится к этим файлам функций.

Автоматическое дифференцирование

Автоматическое дифференцирование (AD) применяется к solve и prob2struct функционирует при следующих условиях:

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

  • Решатель, вызываемый solve является fmincon, fminunc, fsolve, или lsqnonlin.

  • Для задач оптимизации, 'ObjectiveDerivative' и 'ConstraintDerivative' аргументы пары имя-значение для solve или prob2struct имеют значение 'auto', 'auto-forward', или 'auto-reverse'.

  • Для задач уравнений, 'EquationDerivative' параметр имеет значение 'auto', 'auto-forward', или 'auto-reverse'.

Когда применяется ADВсе поддерживаемые функции ограниченияОдно или несколько ограничений не поддерживаются
Целевая функция поддерживаетсяAD используется для целей и ограниченийAD используется только для цели
Целевая функция не поддерживаетсяAD используется только для ограниченийAD не используется

Когда эти условия не выполняются, solve оценивает градиенты по конечным разностям, и prob2struct не создает градиенты в созданных файлах функций.

Решатели по умолчанию выбирают следующий тип AD:

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

  • Для общей нелинейной целевой функции fminunc по умолчанию используется обратный AD.

  • Для целевой функции наименьших квадратов fmincon и fminunc по умолчанию пересылать AD для целевой функции. Определение целевой функции наименьших квадратов на основе задачи см. в разделе Запись целевой функции для наименьших квадратов на основе задачи.

  • lsqnonlin по умолчанию пересылается AD, если число элементов в целевом векторе больше или равно числу переменных. В противном случае lsqnonlin по умолчанию используется обратный AD.

  • fsolve по умолчанию пересылается AD, если число уравнений больше или равно числу переменных. В противном случае fsolve по умолчанию используется обратный AD.

Примечание

Использование автоматических производных в проблеме, преобразованной prob2struct, передайте параметры, определяющие эти производные.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

В настоящее время AD работает только для первых производных; он не относится ко вторым или более высоким производным. Так, например, если вы хотите использовать аналитический гессен для ускорения оптимизации, вы не можете использовать solve непосредственно и должен использовать подход, описанный в разделе Дериваты поставки в потоке операций на основе проблем.

Вопросы совместимости

развернуть все

Ошибки, начинающиеся с R2021a

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