Преобразуйте задачу оптимизации или задачу уравнения в форму решателя
Использовать 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'
(по возможности используйте 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'
(по возможности используйте 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
структура, или quadprogproblem
problem
структура.
В следующей таблице приведен тип задачи для задач оптимизации.
Цели оптимизации и типы ограничений (линейные ограничения включают ограничения) | Тип получившейся задачи |
---|---|
Линейные функции объектива и ограничения. По крайней мере одна переменная задача имеет | intlinprog |
Линейные функции объектива и ограничения. Ни одни переменные задачи не имеет | linprog |
Линейные функции ограничения. Целевой функцией является константа плюс сумма квадратов линейных выражений. | lsqlin |
Связанные ограничения. Целевой функцией является константа плюс сумма квадратов общих нелинейных выражений. | lsqnonlin |
Линейные функции ограничения. Общая квадратичная целевая функция. | quadprog |
Общая нелинейная целевая функция. Никаких ограничений. | fminunc |
Общая нелинейная целевая функция, и существует по крайней мере одно ограничение любого типа. Или существует, по меньшей мере, одна общая нелинейная функция ограничения. | fmincon |
Следующая таблица приводит тип задачи для задач решения уравнений.
Типы уравнений | Тип получившейся задачи |
---|---|
Линейная система с границами или без | lsqlin |
Скалярное (одинарное) нелинейное уравнение | fzero |
Нелинейная система без ограничений | fsolve |
Нелинейная система с границами | lsqnonlin |
Примечание
Для нелинейных задач, prob2struct
создает файлы функции для целевой и нелинейной функций ограничения. Для целевых и ограничительных функций, которые вызывают вспомогательные функции, prob2struct
также создает поддерживающие файлы функции и хранит их в FileLocation
папка. Для доступа к дополнительным параметрам в сгенерированных функциях смотрите Получить сведения о сгенерированной функции.
Для линейных и квадратичных задач оптимизации структура задачи включает дополнительное поле f0
, что представляет аддитивную константу для целевой функции. Если вы решаете структуру задачи с помощью заданного решателя, возвращенное значение целевой функции не включает в себя f0
значение. Если вы решаете prob
использование solve
function, возвращенное значение целевой функции включает в себя f0
значение.
Если ObjectiveSense of 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
значение по умолчанию - reverse AD.
Для целевой функции методом наименьших квадратов, fmincon
и fminunc
по умолчанию для пересылки AD для целевой функции. Для определения основанной на проблеме целевой функции методом наименьших квадратов смотрите Запись Целевой Функции для основанных на проблеме методом наименьших квадратов.
lsqnonlin
по умолчанию переадресует AD, когда количество элементов в целевом векторе больше или равно количеству переменных. В противном случае, lsqnonlin
значение по умолчанию - reverse AD.
fsolve
по умолчанию переадресовывает AD, когда количество уравнений больше или равно количеству переменных. В противном случае, fsolve
значение по умолчанию - reverse AD.
Примечание
Чтобы использовать автоматические производные в задаче, преобразованной prob2struct
, передайте опции, задающие эти производные.
options = optimoptions('fmincon','SpecifyObjectiveGradient',true,... 'SpecifyConstraintGradient',true); problem.options = options;
В настоящее время AD работает только для первых производных; он не применяется ко вторым или более высоким производным. Так, например, если вы хотите использовать аналитический Гессиан для ускорения оптимизации, вы не можете использовать solve
непосредственно, и вместо этого необходимо использовать подход, описанный в разделе Производные по поставкам в рабочем процессе, основанном на проблеме.
Options
Имя-значение было удаленоОшибки, начинающиеся в R2021a
The Options
Пара "имя-значение" был удаляема. Чтобы изменить опции, отредактируйте полученную problem
структура. Для примера,
problem.options = optimoptions('fmincon',... 'Display','iter','MaxFunctionEvaluations',5e4); % Or, to set just one option: problem.options.MaxFunctionEvaluations = 5e4;
The Options
пара "имя-значение" была удалена, потому что это может вызвать неоднозначность при наличии автоматической дифференциации.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.