Преобразуйте задачу оптимизации или проблему уравнения к форме решателя
Использование 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'
(значение по умолчанию) | 'finite-differences'
Индикация, чтобы использовать автоматическое дифференцирование (AD) для нелинейного ограничения функционирует в виде разделенной запятой пары, состоящей из 'ConstraintDerivative'
и любой 'auto'
(используйте AD если возможный), или 'finite-differences'
(не используйте AD). 'auto'
заставляет получившийся ограничительный файл функции включать производную информацию при условии, что ограничительные функции поддерживаются, как описано в Поддерживаемых Операциях на Переменных и выражениях Оптимизации. Для примера смотрите Производные Предоставления в Основанном на проблеме Рабочем процессе.
Примечание
Использовать автоматические производные в проблеме, преобразованной prob2struct
, передайте опции, задающие эти производные.
options = optimoptions('fmincon','SpecifyObjectiveGradient',true,... 'SpecifyConstraintGradient',true); problem.options = options;
Предупреждение
'ObjectiveDerivative'
и 'ConstraintDerivative'
аргументы пары "имя-значение" в настоящее время применяются только к задачам, решенным fmincon
или fminunc
. При попытке использовать эти аргументы при решении уравнения с solve
или преобразование уравнения с prob2struct
, MATLAB® выдает ошибку.
Пример: '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'
(значение по умолчанию) | 'finite-differences'
Индикация, чтобы использовать автоматическое дифференцирование (AD) для нелинейной целевой функции в виде разделенной запятой пары, состоящей из 'ObjectiveDerivative'
и любой 'auto'
(используйте AD если возможный), или 'finite-differences'
(не используйте AD). 'auto'
заставляет получившийся файл целевой функции включать производную информацию при условии, что целевая функция поддерживается, как описано в Поддерживаемых Операциях на Переменных и выражениях Оптимизации. Для примера смотрите Производные Предоставления в Основанном на проблеме Рабочем процессе.
Примечание
Использовать автоматические производные в проблеме, преобразованной prob2struct
, передайте опции, задающие эти производные.
options = optimoptions('fmincon','SpecifyObjectiveGradient',true,... 'SpecifyConstraintGradient',true); problem.options = options;
Предупреждение
'ObjectiveDerivative'
и 'ConstraintDerivative'
аргументы пары "имя-значение" в настоящее время применяются только к задачам, решенным fmincon
или fminunc
. При попытке использовать эти аргументы при решении уравнения с solve
или преобразование уравнения с prob2struct
, MATLAB выдает ошибку.
Пример: '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
функция.
'ObjectiveDerivative'
и 'ConstraintDerivative'
аргументы пары "имя-значение" для solve
или prob2struct
установлены в их значение по умолчанию, 'auto'
.
Когда AD применяется | Все ограничительные поддерживаемые функции | Одно или несколько ограничений, не поддержанных |
---|---|---|
Поддерживаемая целевая функция | AD используется для цели и ограничений | AD, используемый для цели только |
Целевая функция, не поддерживаемая | AD, используемый для ограничений только | AD, не используемый |
Когда этим условиям не удовлетворяют, solve
оценочные градиенты конечными разностями, и prob2struct
не создает градиенты в его сгенерированных файлах функции.
Примечание
Использовать автоматические производные в проблеме, преобразованной prob2struct
, передайте опции, задающие эти производные.
options = optimoptions('fmincon','SpecifyObjectiveGradient',true,... 'SpecifyConstraintGradient',true); problem.options = options;
В настоящее время AD работает только на первые производные; это не применяется к вторым или производным высшего порядка. Так, например, если вы хотите использовать аналитический Гессиан, чтобы ускорить вашу оптимизацию, вы не можете использовать solve
непосредственно, и должен вместо этого использовать подход, описанный в Производных Предоставления в Основанном на проблеме Рабочем процессе.
Options
Пара "имя-значение" будет удаленаНе рекомендуемый запуск в R2020b
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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.