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 если возможный), или '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

Имя нелинейного ограничительного файла функции, созданного 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 если возможный), или '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

Имя файла целевой функции, созданного 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 функции при следующих условиях:

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

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

Примечание

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

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

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

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

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

Не рекомендуемый запуск в R2020b

Введенный в R2017b