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'(по возможности используйте 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'(по возможности используйте 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 структура, или quadprogproblem problem структура.

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

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

Тип получившейся задачи

Линейные функции объектива и ограничения.

По крайней мере одна переменная задача имеет 'integer' тип.

intlinprog

Линейные функции объектива и ограничения.

Ни одни переменные задачи не имеет 'integer' тип.

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 функционирует при следующих условиях:

Когда 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 непосредственно, и вместо этого необходимо использовать подход, описанный в разделе Производные по поставкам в рабочем процессе, основанном на проблеме.

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

расширить все

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

Введенный в R2017b