Преобразовать задачу оптимизации или задачу уравнения в форму решателя
Использовать prob2struct преобразование задачи оптимизации или задачи уравнения в форму решателя.
Совет
Полный рабочий процесс см. в разделах Рабочий процесс оптимизации на основе задач или Рабочий процесс решения уравнений на основе проблем.
для любых входных аргументов задает дополнительные параметры, используя один или несколько аргументов пары имя-значение. Например, для задачи нелинейной оптимизации, 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
prob - Задача оптимизации или задача уравненияOptimizationProblem объект | EquationProblem объектЗадача оптимизации или задача уравнения, указанная как OptimizationProblem объект или EquationProblem объект. Создание проблемы оптимизации с помощью optimproblem; создать задачу уравнения с помощью eqnproblem.
Предупреждение
Проблемный подход не поддерживает комплексные значения в целевой функции, нелинейные равенства или нелинейные неравенства. Если вычисление функции имеет комплексное значение, даже в качестве промежуточного значения, конечный результат может быть неверным.
Пример: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;
Пример: prob = eqnproblem; prob.Equations = eqs;
x0 - Начальная точкаНачальная точка, заданная как структура с именами полей, равными именам переменных в 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')'ConstraintDerivative' - Указание на использование автоматического дифференцирования для функций ограничения'auto' (по умолчанию) | 'auto-forward' | 'auto-reverse' | 'finite-differences'Указание на использование автоматического дифференцирования (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
'ConstraintFunctionName' - Имя файла функции нелинейных ограничений'generatedConstraints' (по умолчанию) | имя файлаИмя файла функции нелинейных ограничений, созданного prob2struct для задачи оптимизации, указанной как пара, разделенная запятыми, состоящая из 'ConstraintFunctionName' и имя файла. Этот аргумент применяется к fmincon или fminunc проблемы; посмотрите problem. Не включать расширение файла .m в имени файла. prob2struct добавляет расширение файла при его создании.
Если не указать ConstraintFunctionName, то prob2struct переписывает 'generatedConstraints.m'. Если не указать FileLocation, то prob2struct создает файл в текущей папке.
Возвращенный problem структура относится к этому файлу функции.
Пример: "mynlcons"
Типы данных: char | string
'EquationFunctionName' - Имя файла функции уравнения'generatedEquation' (по умолчанию) | имя файлаИмя файла функции нелинейных уравнений, созданного prob2struct для задачи уравнения, указанной как пара, разделенная запятыми, состоящая из 'EquationFunctionName' и имя файла. Этот аргумент применяется к fsolve, fzero, или lsqnonlin уравнения; посмотрите problem. Не включать расширение файла .m в имени файла. prob2struct добавляет расширение файла при его создании.
Если не указать EquationFunctionName, то prob2struct переписывает 'generatedEquation.m'. Если не указать FileLocation, то prob2struct создает файл в текущей папке.
Возвращенный problem структура относится к этому файлу функции.
Пример: "myequation"
Типы данных: char | string
'FileLocation' - Расположение созданных файловРасположение созданных файлов (целевая функция, функция ограничения и другие файлы подфункций), указанное как разделенная запятыми пара, состоящая из 'FileLocation' и путь к папке, доступной для записи. Все созданные файлы хранятся в этой папке; несколько папок не поддерживаются.
Пример: 'C:Documents\MATLAB\myproject'
Типы данных: char | string
'ObjectiveDerivative' - Индикация использования автоматического дифференцирования для целевой функции'auto' (по умолчанию) | 'auto-forward' | 'auto-reverse' | 'finite-differences'Указание на использование автоматического дифференцирования (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
'ObjectiveFunctionName' - Наименование файла целевой функции'generatedObjective' (по умолчанию) | имя файлаИмя файла целевой функции, созданного prob2struct для задачи оптимизации, указанной как пара, разделенная запятыми, состоящая из 'ObjectiveFunctionName' и имя файла. Этот аргумент применяется к fmincon или fminunc проблемы; посмотрите problem. Не включать расширение файла .m в имени файла. prob2struct добавляет расширение файла при его создании.
Если не указать ObjectiveFunctionName, то prob2struct переписывает 'generatedObjective.m'. Если не указать FileLocation, то prob2struct создает файл в текущей папке.
Возвращенный problem структура относится к этому файлу функции.
Пример: "myobj"
Типы данных: char | string
problem - Структура проблемыfmincon структура проблемы | fminunc структура проблемы | fsolve структура проблемы | intlinprog структура проблемы | linprog структура проблемы | lsqlin структура проблемы | lsqnonlin структура проблемы | quadprog структура проблемыСтруктура проблемы, возвращенная как fmincon
problem структура, fminunc
problem структура, fsolve
problem структура, intlinprog
problem структура, linprog
problem структура, lsqlin
problem структура, lsqnonlin
структура илиproblem quadprog
problem структура.
В следующей таблице приведен результирующий тип задачи для задач оптимизации.
Типы целей и ограничений оптимизации (линейные ограничения включают границы) | Тип результирующей проблемы |
|---|---|
Линейная целевая функция и функция ограничения. По крайней мере одна переменная проблемы имеет | intlinprog |
Линейная целевая функция и функция ограничения. Ни одна переменная проблемы не имеет | 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 непосредственно и должен использовать подход, описанный в разделе Дериваты поставки в потоке операций на основе проблем.
Options Имя - значение удаленоОшибки, начинающиеся с R2021a
Options пара имя-значение удалена. Чтобы изменить параметры, отредактируйте результирующую problem структура. Например,
problem.options = optimoptions('fmincon',... 'Display','iter','MaxFunctionEvaluations',5e4); % Or, to set just one option: problem.options.MaxFunctionEvaluations = 5e4;
Options пара имя-значение была удалена, поскольку она может вызвать неоднозначность при наличии автоматического дифференцирования.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.