решить

Решите задачу оптимизации

Синтаксис

sol = solve(prob)
sol = solve(prob,x0)
sol = solve(___,Name,Value)
[sol,fval] = solve(___)
[sol,fval,exitflag,output,lambda] = solve(___)

Описание

пример

sol = solve(prob) решает задачу оптимизации prob.

пример

sol = solve(prob,x0) решает prob, начинающий с точки x0.

пример

sol = solve(___,Name,Value) изменяет процесс решения с помощью одного или нескольких аргументов пары "имя-значение" в дополнение к входным параметрам в предыдущих синтаксисах.

[sol,fval] = solve(___) также возвращает значение целевой функции в решении с помощью любого из входных параметров в предыдущих синтаксисах.

пример

[sol,fval,exitflag,output,lambda] = solve(___) также возвращает выходной флаг, описывающий выходное условие, структура output, содержащая дополнительную информацию о процессе решения, и, для проблем нецелого числа, структуры множителя Лагранжа.

Примеры

свернуть все

Решите линейную проблему программирования, заданную задачей оптимизации.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob)
Optimal solution found.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

Найдите минимум функции peaks, которая включена в MATLAB® в области x2+y24. Для этого преобразуйте функцию peaks в выражение оптимизации.

prob = optimproblem;
x = optimvar('x');
y = optimvar('y');
fun = fcn2optimexpr(@peaks,x,y);
prob.Objective = fun;

Включайте ограничение как неравенство в переменных оптимизации.

prob.Constraints = x^2 + y^2 <= 4;

Установите начальную точку для x к 1 и y к –1, и решите проблему.

x0.x = 1;
x0.y = -1;
sol = solve(prob,x0)
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.
sol = struct with fields:
    x: 0.2283
    y: -1.6255

Сравните количество шагов, чтобы решить проблему целочисленного программирования и с и без начальной допустимой точки. Проблема имеет восемь целочисленных переменных и четыре линейных ограничения равенства, и все переменные ограничиваются, чтобы быть положительными.

prob = optimproblem;
x = optimvar('x',8,1,'LowerBound',0,'Type','integer');

Создайте четыре линейных ограничения равенства и включайте их в проблему.

Aeq = [22    13    26    33    21     3    14    26
    39    16    22    28    26    30    23    24
    18    14    29    27    30    38    26    26
    41    26    28    36    18    38    16    26];
beq = [ 7872
       10466
       11322
       12058];
cons = Aeq*x == beq;
prob.Constraints.cons = cons;

Создайте целевую функцию и включайте ее в проблему.

f = [2    10    13    17     7     5     7     3];
prob.Objective = f*x;

Решите проблему, не используя начальную точку и исследуйте отображение, чтобы видеть количество узлов метода ветвей и границ.

[x1,fval1,exitflag1,output1] = solve(prob);
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
   10000      0.62         0              -              -                                          
   18188      1.17         1   2.906000e+03   4.509804e+01                                          
   22039      1.46         2   2.073000e+03   2.270974e+01                                          
   24105      1.59         3   1.854000e+03   9.973046e+00                                          
   24531      1.62         3   1.854000e+03   1.347709e+00                                          
   24701      1.63         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped 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).

Для сравнения найдите решение с помощью начальной допустимой точки.

x0.x = [8 62 23 103 53 84 46 34]';
[x2,fval2,exitflag2,output2] = solve(prob,x0);
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      
                   Relative gap is 59.20%.                                                         

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
    3627      0.25         2   2.154000e+03   2.593968e+01                                          
    5844      0.39         3   1.854000e+03   1.180593e+01                                          
    6204      0.42         3   1.854000e+03   1.455526e+00                                          
    6400      0.43         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped 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).
fprintf('Without an initial point, solve took %d steps.\nWith an initial point, solve took %d steps.',output1.numnodes,output2.numnodes)
Without an initial point, solve took 24701 steps.
With an initial point, solve took 6400 steps.

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

Решите проблему

minx(-3x1-2x2-x3)subjectto{x3binaryx1,x20x1+x2+x374x1+2x2+x3=12

не показывая итеративное отображение.

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

options = optimoptions('intlinprog','Display','off');

sol = solve(prob,'Options',options)
sol = struct with fields:
     x: [2x1 double]
    x3: 1

Исследуйте решение.

sol.x
ans = 2×1

         0
    5.5000

sol.x3
ans = 1

Обеспечьте solve, чтобы использовать intlinprog в качестве решателя для линейной проблемы программирования.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob,'Solver', 'intlinprog')
LP:                Optimal objective value is -1.111111.                                            


Optimal solution found.

No integer variables specified. Intlinprog solved the linear problem.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

Решите смешано-целочисленную линейную проблему программирования, описанную в, Решают проблему Целочисленного программирования с Опциями Не по умолчанию и исследуют все выходные данные.

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

[sol,fval,exitflag,output] = solve(prob)
LP:                Optimal objective value is -12.000000.                                           


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).
sol = struct with fields:
     x: [2x1 double]
    x3: 1

fval = -12
exitflag = 
    OptimalSolution

output = struct with fields:
        relativegap: 0
        absolutegap: 0
      numfeaspoints: 1
           numnodes: 0
    constrviolation: 0
            message: 'Optimal solution found....'
             solver: 'intlinprog'

Для проблемы без любых целочисленных ограничений можно также получить непустую структуру множителя Лагранжа как пятый вывод.

Создайте и решите задачу оптимизации с помощью названный индексными переменными. Проблема состоит в том, чтобы максимизировать взвешенный прибылью поток фруктов в различные аэропорты согласно ограничениям на взвешенные потоки.

rng(0) % For reproducibility
p = optimproblem('ObjectiveSense', 'maximize');
flow = optimvar('flow', ...
    {'apples', 'oranges', 'bananas', 'berries'}, {'NYC', 'BOS', 'LAX'}, ...
    'LowerBound',0,'Type','integer');
p.Objective = sum(sum(rand(4,3).*flow));
p.Constraints.NYC = rand(1,4)*flow(:,'NYC') <= 10;
p.Constraints.BOS = rand(1,4)*flow(:,'BOS') <= 12;
p.Constraints.LAX = rand(1,4)*flow(:,'LAX') <= 35;
sol = solve(p);
LP:                Optimal objective value is -1027.472366.                                         

Heuristics:        Found 1 solution using rounding.                                                 
                   Upper bound is -1027.233133.                                                     
                   Relative gap is 0.00%.                                                          

Cut Generation:    Applied 1 mir cut, and 2 strong CG cuts.                                         
                   Lower bound is -1027.233133.                                                     
                   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).

Найдите оптимальный поток апельсинов и ягод в Нью-Йорк и Лос-Анджелес.

[idxFruit,idxAirports] = findindex(flow, {'oranges','berries'}, {'NYC', 'LAX'})
idxFruit = 1×2

     2     4

idxAirports = 1×2

     1     3

orangeBerries = sol.flow(idxFruit, idxAirports)
orangeBerries = 2×2

         0  980.0000
   70.0000         0

Это отображение означает, что никакие апельсины не идут в NYC, 70 ягод идут в NYC, 980 апельсинов идут в LAX, и никакие ягоды не идут в LAX.

Перечислите оптимальный поток следующего:

Fruit Airports

----- --------

Berries NYC

Apples BOS

Oranges LAX

idx = findindex(flow, {'berries', 'apples', 'oranges'}, {'NYC', 'BOS', 'LAX'})
idx = 1×3

     4     5    10

optimalFlow = sol.flow(idx)
optimalFlow = 1×3

   70.0000   28.0000  980.0000

Это отображение означает, что 70 ягод идут в NYC, 28 яблок идут в BOS, и 980 апельсинов идут в LAX.

Входные параметры

свернуть все

Задача оптимизации, заданная как объект OptimizationProblem. Создайте проблему при помощи optimproblem.

Пример: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

Начальная точка, заданная как структура с именами полей, равняется именам переменных в prob.

Для примера с помощью x0 с именованными индексными переменными смотрите, Создают Начальную Точку для Оптимизации с Именованными Индексными Переменными.

Пример: Если prob имеет переменные под названием x и y: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3].

Типы данных: struct

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: solve(prob,'options',opts)

Опции оптимизации, заданные как пара, разделенная запятой, состоящая из 'options' и объекта, созданного optimoptions или структурой опций такой, как создано optimset.

Внутренне, вызовы функции solve linprog, intlinprog, quadprog, lsqlin, lsqnonneg, fminunc или fmincon. Для решателя по умолчанию смотрите 'solver'.

Гарантируйте, что options совместим с решателем. Например, intlinprog не позволяет опциям быть структурой, и lsqnonneg не позволяет опциям быть объектом.

Для предложений на настройках опций, чтобы улучшить решение intlinprog или скорость решения, смотрите Настраивающееся Целочисленное Линейное Программирование. Для linprog алгоритм 'dual-simplex' по умолчанию обычно эффективен памятью и быстр. Иногда, linprog решает большую проблему быстрее, когда опцией Algorithm является 'interior-point'. Для предложений на настройках опций, чтобы улучшить решение нелинейной проблемы, см. широко использующиеся Опции: Настройка и Поиск и устранение проблем и Улучшает Результаты.

Пример: options = optimoptions('intlinprog','Display','none')

Решатель оптимизации, заданный как пара, разделенная запятой, состоящая из 'solver' и имя перечисленного решателя.

Проблемный типРешатель по умолчаниюДругие позволенные решатели
Линейные объективные, линейные ограниченияlinprogintlinprog, quadprog
Линейные объективные, линейные и целочисленные ограниченияintlinproglinprog, quadprog (целочисленные проигнорированные ограничения)
Квадратичные объективные, линейные ограниченияquadproglsqlin, lsqnonneg (если цель не может быть преобразована, чтобы минимизировать || C*x - d ||^2 затем solve, выдает ошибку для этих решателей),
Минимизируйте || C*x - d ||^2 подвергающийся линейным ограничениямlsqlin, когда цель является константой плюс сумма квадратов линейных выраженийquadprog, lsqnonneg (Ограничения кроме x> = 0 проигнорированы для lsqnonneg),
Минимизируйте || C*x - d ||^2 подвергающийся x> = 0lsqlinquadproglsqnonneg
Минимизируйте общий нелинейный функциональный f (x)fminuncfmincon
Минимизируйте общий нелинейный функциональный f (x), подвергающийся некоторым ограничениям, или минимизируйте любой функциональный предмет к нелинейным ограничениямfmincon'none'

Внимание

Для проблем максимизации не задавайте решатели lsqnonneg и lsqlin. Если вы делаете, solve выдает ошибку, потому что эти решатели не могут максимизировать.

Пример: 'intlinprog'

Типы данных: char | string

Выходные аргументы

свернуть все

Решение, возвращенное как структура. Поля структуры являются именами переменных оптимизации. Смотрите optimvar.

Значение целевой функции в решении, возвращенном как вещественное число.

Совет

Если вы забыли просить fval, можно вычислить его использование:

fval = evaluate(prob.Objective,sol)

Обоснуйте, что остановленный решатель, возвратился как категориальная переменная. Эта таблица описывает выходные флаги для решателя intlinprog.

Выйдите из флага для intlinprogЧисловой эквивалентЗначение
OptimalWithPoorFeasibility3

Решение выполнимо относительно относительного допуска ConstraintTolerance, но не выполнимо относительно абсолютного допуска.

IntegerFeasible2intlinprog, остановленный преждевременно и найденный целочисленной допустимой точкой.
OptimalSolution

1

Решатель сходился к решению x.

SolverLimitExceeded

0

intlinprog превышает один из следующих допусков:

  • LPMaxIterations

  • MaxNodes

  • MaxTime

  • RootLPMaxIterations

Смотрите Допуски и Критерий остановки. solve также возвращает этот выходной флаг, когда это исчерпывает память в корневом узле.

OutputFcnStop-1intlinprog зашел в выходную функцию или функцию построения графика.
NoFeasiblePointFound

-2

Никакая допустимая точка не найдена.

Unbounded

-3

Проблема неограниченна.

FeasibilityLost

-9

Решатель потерял выполнимость.

3 Exitflags и -9 относятся к решениям, которые имеют большой infeasibilities. Они обычно являются результатом линейных ограничительных матриц, которые имеют большой номер условия или проблемы, которые имеют большие компоненты решения. Чтобы исправить эти проблемы, попытайтесь масштабировать содействующие матрицы, устранить избыточные линейные ограничения или дать более трудные границы на переменных.

Эта таблица описывает выходные флаги для решателя linprog.

Выйдите из флага для linprogЧисловой эквивалентЗначение
OptimalWithPoorFeasibility3

Решение выполнимо относительно относительного допуска ConstraintTolerance, но не выполнимо относительно абсолютного допуска.

OptimalSolution1

Решатель сходился к решению x.

SolverLimitExceeded0

Количество итераций превышает options.MaxIterations.

NoFeasiblePointFound-2

Никакая допустимая точка не найдена.

Unbounded-3

Проблема неограниченна.

FoundNaN-4

Значение NaN, с которым сталкиваются во время осуществления алгоритма.

PrimalDualInfeasible-5

И основные и двойные проблемы неосуществимы.

DirectionTooSmall-7

Поисковое направление является слишком маленьким. Никакие дальнейшие успехи не могут быть сделаны.

FeasibilityLost-9

Решатель потерял выполнимость.

3 Exitflags и -9 относятся к решениям, которые имеют большой infeasibilities. Они обычно являются результатом линейных ограничительных матриц, которые имеют большой номер условия или проблемы, которые имеют большие компоненты решения. Чтобы исправить эти проблемы, попытайтесь масштабировать содействующие матрицы, устранить избыточные линейные ограничения или дать более трудные границы на переменных.

Эта таблица описывает выходные флаги для решателя lsqlin.

Выйдите из флага для lsqlinЧисловой эквивалентЗначение
FunctionChangeBelowTolerance3

Изменение в невязке меньше, чем заданный допуск options.FunctionTolerance. (алгоритм trust-region-reflective)

StepSizeBelowTolerance

2

Размер шага, меньший, чем options.StepTolerance, удовлетворенные ограничения. (алгоритм interior-point)

OptimalSolution1

Решатель сходился к решению x.

SolverLimitExceeded0

Количество итераций превышает options.MaxIterations.

NoFeasiblePointFound-2

Проблема неосуществима. Или для алгоритма interior-point не удовлетворен размер шага, меньший, чем options.StepTolerance, но ограничения.

IllConditioned-4

Плохо создание условий предотвращает дальнейшую оптимизацию.

NoDescentDirectionFound-8

Поисковое направление является слишком маленьким. Никакие дальнейшие успехи не могут быть сделаны. (алгоритм interior-point)

Эта таблица описывает выходные флаги для решателя quadprog.

Выйдите из флага для quadprogЧисловой эквивалентЗначение
LocalMinimumFound4

Локальный минимум найден; минимум не уникален.

FunctionChangeBelowTolerance3

Изменение в значении целевой функции меньше, чем заданный допуск options.FunctionTolerance. (алгоритм trust-region-reflective)

StepSizeBelowTolerance

2

Размер шага, меньший, чем options.StepTolerance, удовлетворенные ограничения. (алгоритм interior-point-convex)

OptimalSolution1

Решатель сходился к решению x.

SolverLimitExceeded0

Количество итераций превышает options.MaxIterations.

NoFeasiblePointFound-2

Проблема неосуществима. Или для алгоритма interior-point не удовлетворен размер шага, меньший, чем options.StepTolerance, но ограничения.

IllConditioned-4

Плохо создание условий предотвращает дальнейшую оптимизацию.

Nonconvex

-6

Невыпуклая проблема обнаруживается. (алгоритм interior-point-convex)

NoDescentDirectionFound-8

Не мог вычислить направление шага. (алгоритм interior-point-convex)

Эта таблица описывает выходные флаги для решателя fminunc.

Выйдите из флага для fminuncЧисловой эквивалентЗначение
NoDecreaseAlongSearchDirection5

Предсказанное уменьшение в целевой функции является меньше, чем допуск options.FunctionTolerance.

FunctionChangeBelowTolerance3

Изменение в значении целевой функции является меньше, чем допуск options.FunctionTolerance.

StepSizeBelowTolerance

2

Изменение в x меньше, чем допуск options.StepTolerance.

OptimalSolution1

Значение градиента меньше, чем допуск options.OptimalityTolerance.

SolverLimitExceeded0

Количество итераций превышает options.MaxIterations, или количество функциональных оценок превышает options.MaxFunctionEvaluations.

OutputFcnStop-1

Зашедший выходная функция или функция построения графика.

Unbounded-3

Целевая функция при текущей итерации ниже options.ObjectiveLimit.

Эта таблица описывает выходные флаги для решателя fmincon.

Выйдите из флага для fminconЧисловой эквивалентЗначение
NoDecreaseAlongSearchDirection5

Значение косой производной в поисковом направлении является меньше, чем 2*options.OptimalityTolerance, и максимальное ограничительное нарушение является меньше, чем options.ConstraintTolerance.

SearchDirectionTooSmall4

Значение поискового направления является меньше, чем 2*options.StepTolerance, и максимальное ограничительное нарушение является меньше, чем options.ConstraintTolerance.

FunctionChangeBelowTolerance3

Изменение в значении целевой функции является меньше, чем options.FunctionTolerance и максимальное ограничительное нарушение являются меньше, чем options.ConstraintTolerance.

StepSizeBelowTolerance

2

Изменение в x является меньше, чем options.StepTolerance и максимальное ограничительное нарушение являются меньше, чем options.ConstraintTolerance.

OptimalSolution1

Мерой по оптимальности первого порядка являются меньше, чем options.OptimalityTolerance, и максимальное ограничительное нарушение является меньше, чем options.ConstraintTolerance.

SolverLimitExceeded0

Количество итераций превышает options.MaxIterations, или количество функциональных оценок превышает options.MaxFunctionEvaluations.

OutputFcnStop-1

Зашедший выходная функция или функция построения графика.

NoFeasiblePointFound-2

Никакая допустимая точка не найдена.

Unbounded-3

Целевая функция при текущей итерации ниже options.ObjectiveLimit, и максимальное ограничительное нарушение является меньше, чем options.ConstraintTolerance.

Информация о процессе оптимизации, возвращенном как структура. Выходная структура содержит поля в соответствующем базовом решателе выходное поле, в зависимости от которого решателя solve вызвал:

solve включает дополнительное поле Solver в структуру output, чтобы идентифицировать используемый решатель, такой как 'intlinprog'.

Множители Лагранжа в решении, возвращенном как структура. Для решателя intlinprog lambda пуст, []. Для других решателей lambda имеет эти поля:

  • Поля Variables - Contains для каждой проблемной переменной. Каждое проблемное имя переменной является структурой с двумя полями:

    • Ниже Множители Лагранжа сопоставлены со свойством переменной LowerBound, возвращенным как массив, одного размера как переменная. Ненулевые записи означают, что решение в нижней границе. Эти множители находятся в структуре lambda.Variables.variablename.Lower.

    • Верхний Множители Лагранжа сопоставлены со свойством переменной UpperBound, возвращенным как массив, одного размера как переменная. Ненулевые записи означают, что решение в верхней границе. Эти множители находятся в структуре lambda.Variables.variablename.Upper.

  • Ограничения Содержит поле для каждого ограничения задач. Каждое ограничение задач находится в структуре, имя которой является ограничительным именем, и чье значение является числовым массивом, одного размера как ограничение. Ненулевые записи означают, что ограничение активно в решении. Эти множители находятся в структуре lambda.Constraints.constraintname.

    Примечание

    Элементы ограничительного массива все имеют то же сравнение (<=, == или >=) и все имеют тот же тип (линейны, квадратичны, или нелинейны).

Алгоритмы

Внутренне, функция solve решает задачи оптимизации путем вызова решателя:

  • linprog для линейных объективных и линейных ограничений

  • intlinprog для линейных объективных и линейных ограничений и целочисленных ограничений

  • quadprog для квадратичных объективных и линейных ограничений

  • lsqlin или lsqnonneg для линейного метода наименьших квадратов с линейными ограничениями

  • fminunc для проблем без любых ограничений (даже переменные границы) и с общей нелинейной целевой функцией

  • fmincon для проблем с нелинейным ограничением, или с общей нелинейной целью и по крайней мере одним ограничением

Прежде чем solve может вызвать эти функции, проблемы должны быть преобразованы в форму решателя, или solve или некоторыми другими присоединенными функциями или объектами. Это преобразование влечет за собой, например, линейные ограничения, имеющие матричное представление, а не переменное выражение оптимизации.

Первый шаг в алгоритме происходит, когда вы помещаете выражения оптимизации в проблему. Объект OptimizationProblem имеет внутренний список переменных, используемых в его выражениях. Каждая переменная имеет линейный индекс в выражении и размер. Поэтому проблемные переменные имеют подразумеваемую матричную форму. Функция prob2struct выполняет преобразование от проблемной формы до формы решателя. Для примера смотрите, Преобразовывают проблему в Структуру.

Для значения по умолчанию и позволенных решателей, что вызовы solve, в зависимости от проблемной цели и ограничений, смотрите 'solver'. Можно заменить значение по умолчанию при помощи аргумента пары "имя-значение" 'solver' при вызове solve.

Для алгоритма, что использование intlinprog, чтобы решить проблемы MILP, см. intlinprog Алгоритм. Для алгоритмов, что использование linprog, чтобы решить линейные проблемы программирования, см. Линейные Алгоритмы Программирования. Для алгоритмов, что использование quadprog, чтобы решить проблемы квадратичного программирования, см. Алгоритмы Квадратичного программирования. Для алгоритмов, что использование lsqlin, чтобы решить проблемы линейного метода наименьших квадратов, смотрите Наименьшие квадраты (Подбор кривой Модели) Алгоритмы. Для нелинейных алгоритмов решателя см. Неограниченные Нелинейные Алгоритмы Оптимизации и Ограниченные Нелинейные Алгоритмы Оптимизации.

Примечание

Если ваша целевая функция является суммой квадратов, и вы хотите, чтобы solve распознал его как таковой, записал его как sum(expr.^2), и не как expr'*expr. Внутренний синтаксический анализатор распознает только явные суммы квадратов. Для примера смотрите Неотрицательную задачу для метода наименьших квадратов, Основанную на проблеме.

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

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

Ошибки, запускающиеся в R2018b

Введенный в R2017b