solve

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

Описание

Использование 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)
Solving problem using linprog.

Optimal solution found.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

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

x = optimvar('x');
y = optimvar('y');

Создайте задачу оптимизации, имеющую peaks как целевая функция.

prob = optimproblem("Objective",peaks(x,y));

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

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

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

x0.x = 1;
x0.y = -1;
sol = solve(prob,x0)
Solving problem using fmincon.

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

Неподдерживаемые функции требуют fcn2optimexpr

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

Преобразовывать существующий пример:

convpeaks = fcn2optimexpr(@peaks,x,y);
prob.Objective = convpeaks;
sol2 = solve(prob,x0)
Solving problem using fmincon.

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.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

Copyright 2018–2020 The MathWorks, Inc.

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

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);
Solving problem using intlinprog.
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.83         0              -              -                                          
   18027      1.44         1   2.906000e+03   4.509804e+01                                          
   21859      1.85         2   2.073000e+03   2.270974e+01                                          
   23546      2.01         3   1.854000e+03   1.180593e+01                                          
   24121      2.07         3   1.854000e+03   1.563342e+00                                          
   24294      2.08         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);
Solving problem using intlinprog.
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.36         2   2.154000e+03   2.593968e+01                                          
    5844      0.57         3   1.854000e+03   1.180593e+01                                          
    6204      0.61         3   1.854000e+03   1.455526e+00                                          
    6400      0.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).
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 24294 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')
Solving problem using 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)
Solving problem using intlinprog.
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);
Solving problem using intlinprog.
LP:                Optimal objective value is -1027.472366.                                         

Heuristics:        Found 1 solution using ZI round.                                                 
                   Upper 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.

Решить нелинейную систему уравнений

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

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

x = optimvar('x',2);

Создайте первое уравнение как выражение равенства оптимизации.

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

Точно так же создайте второе уравнение как выражение равенства оптимизации.

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

Создайте проблему уравнения и поместите уравнения в проблему.

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

Рассмотрите проблему.

show(prob)
  EquationProblem : 

	Solve for:
       x


 eq1:
       exp((-exp((-(x(1) + x(2)))))) == (x(2) .* (1 + x(1).^2))

 eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

Решите задачу, начинающую с точки [0,0]. Для подхода, основанного на проблеме задайте начальную точку как структуру с именами переменных как поля структуры. Для этой проблемы существует только одна переменная, x.

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

Просмотрите точку решения.

disp(sol.x)
    0.3532
    0.6061

Неподдерживаемые функции требуют fcn2optimexpr

Если ваши функции уравнения не состоят из элементарных функций, необходимо преобразовать функции в выражения оптимизации с помощью fcn2optimexpr. Для существующего примера:

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

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

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

свернуть все

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

Предупреждение

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

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

Пример: prob = eqnproblem; prob.Equations = eqs;

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

Для некоторых решателей Global Optimization Toolbox, x0 может быть массив структур, представляющий несколько начальных точек. Эти решатели:

  • ga (Global Optimization Toolbox) и particleswarm (Global Optimization Toolbox). Эти решатели принимают несколько начальных точек как члены начальной генеральной совокупности.

  • surrogateopt (Global Optimization Toolbox). Этот решатель признает, что несколько начальных букв указывают, чтобы помочь создавать начальный суррогат.

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

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

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

Аргументы name-value

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

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

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

Внутренне, solve вызовы функции соответствующий решатель, как детализировано в 'solver' ссылка аргумента. Убедитесь, что options совместимо с решателем. Например, intlinprog не позволяет опциям быть структурой и lsqnonneg не позволяет опциям быть объектом.

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

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

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

Для преобразования нелинейных проблем с целочисленным ограничительным использованием prob2struct, получившаяся структура задачи может зависеть от выбранного решателя. Если у вас нет лицензии Global Optimization Toolbox, необходимо задать решатель. Смотрите Целочисленные Ограничения в Нелинейной Основанной на проблеме Оптимизации.

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

Проблемный типРешатель по умолчанию
Линейное программирование (LP)linprog
Смешано-целочисленное линейное программирование (MILP)intlinprog
Квадратичное программирование (QP)quadprog
Коническое программирование второго порядка (SOCP)coneprog
Линейный метод наименьших квадратовlsqlin
Нелинейный метод наименьших квадратовlsqnonlin
Нелинейное программирование (NLP)

fminunc для проблем без ограничений, в противном случае fmincon

Смешано-целочисленное нелинейное программирование (MINLP)ga (Global Optimization Toolbox)

В этой таблице,Yes означает, что решатель доступен для проблемного типа, x означает, что решатель не доступен.

Проблемный тип

LPMILPQP SOCPЛинейный метод наименьших квадратовНелинейный метод наименьших квадратовNLPMINLP
Решатель
linprog

Yes

xxxxxxx
intlinprog

Yes

Yes

xxxxxx
quadprog

Yes

x

Yes

Yes

Yes

xxx
coneprog

Yes

xx

Yes

xxxx
lsqlinxxxx

Yes

xxx
lsqnonnegxxxx

Yes

xxx
lsqnonlinxxxx

Yes

Yes

xx
fminunc

Yes

x

Yes

x

Yes

Yes

Yes

x
fmincon

Yes

x

Yes

Yes

Yes

Yes

Yes

x
patternsearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x
ga (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

particleswarm (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
simulannealbnd (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
surrogateopt (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Примечание

Если вы выбираете lsqcurvefit как решатель для задачи наименьших квадратов, solve использование lsqnonlin. lsqcurvefit и lsqnonlin решатели идентичны для solve.

Внимание

Для проблем максимизации (prob.ObjectiveSense "max" или "maximize"), не задавайте решатель наименьших квадратов (один с именем, начинающим lsq). Если вы делаете, solve выдает ошибку, потому что эти решатели не могут максимизировать.

Для решения уравнения эта таблица содержит доступные решатели для каждого проблемного типа. В таблице,

  • * указывает на решатель по умолчанию для проблемного типа.

  • Y указывает на доступный решатель.

  • N указывает на недоступный решатель.

Поддерживаемые решатели для уравнений

Тип уравненияlsqlinlsqnonnegfzerofsolvelsqnonlin
Линейный*NY (только скаляр)YY
Линейный плюс границы*YNNY
Нелинейный скалярNN*YY
Нелинейная системаNNN*Y
Нелинейная система плюс границыNNNN*

Пример: 'intlinprog'

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

Индикация, чтобы использовать автоматическое дифференцирование (AD) для нелинейной целевой функции в виде 'auto' (используйте AD если возможный), 'auto-forward' (используйте прямой AD если возможный), 'auto-reverse' (используйте противоположный AD если возможный), или 'finite-differences' (не используйте AD). Выбор включая auto заставьте базовый решатель использовать информацию о градиенте при решении задачи при условии, что целевая функция поддерживается, как описано в Поддерживаемых Операциях для Переменных и выражений Оптимизации. Для примера смотрите Эффект Автоматического Дифференцирования в Основанной на проблеме Оптимизации.

Решатели выбирают следующий тип AD по умолчанию:

  • Для общей нелинейной целевой функции, fmincon значения по умолчанию, чтобы инвертировать AD для целевой функции. fmincon значения по умолчанию, чтобы инвертировать AD для нелинейного ограничения функционируют, когда количество нелинейных ограничений меньше количества переменных. В противном случае, fmincon значения по умолчанию, чтобы передать AD для нелинейной ограничительной функции.

  • Для общей нелинейной целевой функции, fminunc значения по умолчанию, чтобы инвертировать AD.

  • Для целевой функции наименьших квадратов, fmincon и fminunc значение по умолчанию, чтобы передать AD для целевой функции. Для определения основанной на проблеме целевой функции наименьших квадратов смотрите Целевую функцию Записи для Основанных на проблеме Наименьших квадратов.

  • lsqnonlin значения по умолчанию, чтобы передать AD, когда число элементов в объективном векторе больше или равно количеству переменных. В противном случае, lsqnonlin значения по умолчанию, чтобы инвертировать AD.

  • fsolve значения по умолчанию, чтобы передать AD, когда количество уравнений больше или равно количеству переменных. В противном случае, fsolve значения по умолчанию, чтобы инвертировать AD.

Пример: 'finite-differences'

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

Индикация, чтобы использовать автоматическое дифференцирование (AD) для нелинейного ограничения функционирует в виде 'auto' (используйте AD если возможный), 'auto-forward' (используйте прямой AD если возможный), 'auto-reverse' (используйте противоположный AD если возможный), или 'finite-differences' (не используйте AD). Выбор включая auto заставьте базовый решатель использовать информацию о градиенте при решении задачи при условии, что ограничительные функции поддерживаются, как описано в Поддерживаемых Операциях для Переменных и выражений Оптимизации. Для примера смотрите Эффект Автоматического Дифференцирования в Основанной на проблеме Оптимизации.

Решатели выбирают следующий тип AD по умолчанию:

  • Для общей нелинейной целевой функции, fmincon значения по умолчанию, чтобы инвертировать AD для целевой функции. fmincon значения по умолчанию, чтобы инвертировать AD для нелинейного ограничения функционируют, когда количество нелинейных ограничений меньше количества переменных. В противном случае, fmincon значения по умолчанию, чтобы передать AD для нелинейной ограничительной функции.

  • Для общей нелинейной целевой функции, fminunc значения по умолчанию, чтобы инвертировать AD.

  • Для целевой функции наименьших квадратов, fmincon и fminunc значение по умолчанию, чтобы передать AD для целевой функции. Для определения основанной на проблеме целевой функции наименьших квадратов смотрите Целевую функцию Записи для Основанных на проблеме Наименьших квадратов.

  • lsqnonlin значения по умолчанию, чтобы передать AD, когда число элементов в объективном векторе больше или равно количеству переменных. В противном случае, lsqnonlin значения по умолчанию, чтобы инвертировать AD.

  • fsolve значения по умолчанию, чтобы передать AD, когда количество уравнений больше или равно количеству переменных. В противном случае, fsolve значения по умолчанию, чтобы инвертировать AD.

Пример: 'finite-differences'

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

Индикация, чтобы использовать автоматическое дифференцирование (AD) для нелинейного ограничения функционирует в виде 'auto' (используйте AD если возможный), 'auto-forward' (используйте прямой AD если возможный), 'auto-reverse' (используйте противоположный AD если возможный), или 'finite-differences' (не используйте AD). Выбор включая auto заставьте базовый решатель использовать информацию о градиенте при решении задачи при условии, что функции уравнения поддерживаются, как описано в Поддерживаемых Операциях для Переменных и выражений Оптимизации. Для примера смотрите Эффект Автоматического Дифференцирования в Основанной на проблеме Оптимизации.

Решатели выбирают следующий тип AD по умолчанию:

  • Для общей нелинейной целевой функции, fmincon значения по умолчанию, чтобы инвертировать AD для целевой функции. fmincon значения по умолчанию, чтобы инвертировать AD для нелинейного ограничения функционируют, когда количество нелинейных ограничений меньше количества переменных. В противном случае, fmincon значения по умолчанию, чтобы передать AD для нелинейной ограничительной функции.

  • Для общей нелинейной целевой функции, fminunc значения по умолчанию, чтобы инвертировать AD.

  • Для целевой функции наименьших квадратов, fmincon и fminunc значение по умолчанию, чтобы передать AD для целевой функции. Для определения основанной на проблеме целевой функции наименьших квадратов смотрите Целевую функцию Записи для Основанных на проблеме Наименьших квадратов.

  • lsqnonlin значения по умолчанию, чтобы передать AD, когда число элементов в объективном векторе больше или равно количеству переменных. В противном случае, lsqnonlin значения по умолчанию, чтобы инвертировать AD.

  • fsolve значения по умолчанию, чтобы передать AD, когда количество уравнений больше или равно количеству переменных. В противном случае, fsolve значения по умолчанию, чтобы инвертировать AD.

Пример: 'finite-differences'

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

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

свернуть все

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

Значение целевой функции в решении, возвращенном как одно из следующего:

Проблемный типВозвращенное значение
Оптимизируйте скалярную целевую функцию f (x)Вещественное число f (sol)
Метод наименьших квадратовВещественное число, сумма квадратов остаточных значений в решении
Уравнение SolveЕсли prob.Equations однократный въезд: Вектор действительных чисел значений функции в решении, означая левую сторону минус правая сторона уравнений
Если prob.Equations имеет несколько именованных полей: Структура с теми же именами как prob.Equations, где каждое значение поля является левой стороной минус правая сторона именованных уравнений

Совет

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

fval = evaluate(prob.Objective,sol)

Если цель задана как структура только с одним полем,

fval = evaluate(prob.Objective.ObjectiveName,sol)

Если цель является структурой с несколькими полями, запишите цикл.

fnames = fields(prob.Equations);
for i = 1:length(fnames)
    fval.(fnames{i}) = evaluate(prob.Equations.(fnames{i}),sol);
end

Обоснуйте, что остановленный решатель, возвратился как переменная перечисления. Можно преобразовать exitflag к его числовому эквивалентному использованию double(exitflag), и к его строке эквивалентное использование string(exitflag).

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

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

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

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

1

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

SolverLimitExceeded

0

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

  • LPMaxIterations

  • MaxNodes

  • MaxTime

  • RootLPMaxIterations

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

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

-2

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

Unbounded

-3

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

FeasibilityLost

-9

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

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

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

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

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

OptimalSolution1

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

SolverLimitExceeded0

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

NoFeasiblePointFound-2

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

Unbounded-3

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

FoundNaN-4

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

PrimalDualInfeasible-5

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

DirectionTooSmall-7

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

FeasibilityLost-9

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

Exitflags 3 и -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 алгоритм)

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

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

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

SolverLimitExceeded0

Количество итераций превышает options.MaxIterations, или время решения в секундах превысило options.MaxTime.

NoFeasiblePointFound-2

Проблема неосуществима.

Unbounded-3

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

DirectionTooSmall

-7

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

Unstable-10

Проблема численно неустойчива.

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

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

Величина поискового направления была меньшей, чем options.StepTolerance.

FunctionChangeBelowTolerance3

Изменение в невязке было меньше options.FunctionTolerance.

StepSizeBelowTolerance

2

Размер шага, меньший, чем options.StepTolerance.

OptimalSolution1

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

SolverLimitExceeded0

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

OutputFcnStop-1

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

NoFeasiblePointFound-2

Для задач оптимизации проблема неосуществима: границы lb и ub противоречивы.

Для проблем уравнения не найдено никакое решение.

Эта таблица описывает выходные флаги для 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.

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

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

Величина поискового направления меньше options.StepTolerance, уравнение решено.

FunctionChangeBelowTolerance3

Изменение в значении целевой функции меньше options.FunctionTolerance, уравнение решено.

StepSizeBelowTolerance

2

Изменитесь в x меньше options.StepTolerance, уравнение решено.

OptimalSolution1

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

SolverLimitExceeded0

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

OutputFcnStop-1

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

NoFeasiblePointFound-2

Сходившийся к точке, которая не является корнем.

TrustRegionRadiusTooSmall-3

Уравнение, не решенное. Доверительный радиус области стал слишком маленьким (trust-region-dogleg алгоритм).

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

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

Уравнение решено.

OutputFcnStop-1

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

FoundNaNInfOrComplex-4

NaNInf, или комплексное число, с которым сталкиваются во время поиска интервала, содержащего изменение знака.

SingularPoint-5

Может сходиться к особой точке.

CannotDetectSignChange-6Не нашел две точки с противоположными знаками значения функции.

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

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

Величина шага меньше, чем точность машины, и нарушение ограничений меньше ConstraintTolerance.

FunctionChangeBelowTolerance3

Изменение в fval и размер mesh является и меньше, чем заданный допуск, и нарушение ограничений меньше ConstraintTolerance.

StepSizeBelowTolerance

2

Изменитесь в x и размер mesh оба меньше, чем StepTolerance, и нарушение ограничений меньше ConstraintTolerance.

SolverConvergedSuccessfully1

Без нелинейных ограничений — величина размера mesh меньше заданного допуска, и нарушение ограничений меньше ConstraintTolerance.

С нелинейными ограничениями — величина complementarity measure (заданный после этой таблицы) меньше sqrt(ConstraintTolerance), подпроблема решена с помощью mesh, более прекрасной, чем MeshTolerance, и нарушение ограничений меньше ConstraintTolerance.

SolverLimitExceeded0

Максимальное количество вычислений функции или итераций достигнуто.

OutputFcnStop-1

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

NoFeasiblePointFound-2

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

В нелинейном ограничительном решателе complementarity measure является нормой вектора, элементами которого является ciλi, где ci является нелинейным нарушением ограничения неравенства, и λi является соответствующим множителем Лагранжа.

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

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

Минимальный предел фитнеса FitnessLimit достигнутый и нарушение ограничений меньше ConstraintTolerance.

SearchDirectionTooSmall4

Величина шага меньше, чем точность машины, и нарушение ограничений меньше ConstraintTolerance.

FunctionChangeBelowTolerance3

Значение функции фитнеса не изменилось в MaxStallGenerations поколения и нарушение ограничений меньше ConstraintTolerance.

SolverConvergedSuccessfully1

Без нелинейных ограничений — Среднее совокупное изменение в значении фитнеса функционируют по MaxStallGenerations поколения меньше FunctionTolerance, и нарушение ограничений меньше ConstraintTolerance.

С нелинейными ограничениями — Величина меры по взаимозависимости (см. Меру по Взаимозависимости (Global Optimization Toolbox)) меньше sqrt(ConstraintTolerance), подпроблема решена с помощью допуска меньше, чем FunctionTolerance, и нарушение ограничений меньше ConstraintTolerance.

SolverLimitExceeded0

Максимальное количество поколений MaxGenerations превышенный.

OutputFcnStop-1

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

NoFeasiblePointFound-2

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

StallTimeLimitExceeded-4

Остановите ограничение по времени MaxStallTime превышенный.

TimeLimitExceeded-5

Ограничение по времени MaxTime превышенный.

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

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

Относительное изменение в объективном значении по последнему options.MaxStallIterations итерации меньше options.FunctionTolerance.

SolverLimitExceeded0

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

OutputFcnStop-1

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

NoFeasiblePointFound-2

Границы противоречивы: для некоторого i, lb(i) > ub(i).

Unbounded-3

Лучшее значение целевой функции ниже options.ObjectiveLimit.

StallTimeLimitExceeded-4

Лучшее значение целевой функции не изменилось в options.MaxStallTime секунды.

TimeLimitExceeded-5

Время выполнения превысило options.MaxTime секунды.

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

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

Значение целевой функции меньше options.ObjectiveLimit.

SolverConvergedSuccessfully1

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

SolverLimitExceeded0

Максимальное количество поколений MaxGenerations превышенный.

OutputFcnStop-1

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

NoFeasiblePointFound-2

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

TimeLimitExceeded-5

Ограничение по времени превышено.

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

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

Проблема имеет уникальное возможное решение из-за одного из следующего:

  • Все верхние границы ub (Global Optimization Toolbox) равен нижним границам lb (Global Optimization Toolbox).

  • Линейные ограничения равенства Aeq*x = beq и границы имеют точку уникального решения.

surrogateopt возвращает допустимую точку и значение функции, не выполняя оптимизации.

FeasiblePointFound3Допустимая точка найдена. Решатель остановился, потому что слишком мало новых допустимых точек, как находили, продолжалось.
ObjectiveLimitAttained1

Значение целевой функции меньше options.ObjectiveLimit. Этот выходной флаг более приоритетен по сравнению с выходным флагом 10 когда оба применяются.

SolverLimitExceeded0

Количество вычислений функции превышает options.MaxFunctionEvaluations или прошедшее время превышает options.MaxTime. Если проблема имеет нелинейные неравенства, решение выполнимо.

OutputFcnStop-1

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

NoFeasiblePointFound-2

Никакая допустимая точка не найдена из-за одного из следующего:

  • Нижняя граница lb(i) превышает соответствующую верхнюю границу ub(i). Или один или несколько ceil(lb(i)) превышает соответствующий floor(ub(i)) поскольку i в intcon (Global Optimization Toolbox). В этом случае, solve возвращает x = [] и fval = [].

  • lb = ub и точка lb неосуществимо. В этом случае, x = lb, и fval = objconstr(x).Fval.

  • Линейное и если есть целочисленные ограничения неосуществимы вместе с границами. В этом случае, solve возвращает x = [] и fval = [].

  • Границы, целое число и линейные ограничения выполнимы, но никакое возможное решение не найдено с нелинейными ограничениями. В этом случае, x точка наименьшего количества максимальной недопустимости нелинейных ограничений и fval = objconstr(x).Fval.

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

  • 'ga' output (Global Optimization Toolbox)

  • 'particleswarm' output (Global Optimization Toolbox)

  • 'patternsearch' output (Global Optimization Toolbox)

  • 'simulannealbnd' output (Global Optimization Toolbox)

  • 'surrogateopt' output (Global Optimization Toolbox)

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

Когда Solver нелинейный решатель Optimization Toolbox™, solve включает одно или два дополнительных поля, описывающие производный тип оценки. objectivederivative и, при необходимости constraintderivative поля могут принять следующие значения:

  • "reverse-AD" для противоположного автоматического дифференцирования

  • "forward-AD" для прямого автоматического дифференцирования

  • "finite-differences" для оценки конечной разности

  • "closed-form" для линейных или квадратичных функций

Множители Лагранжа в решении, возвращенном как структура.

Примечание

solve не возвращает lambda для решающих уравнение проблем.

Для intlinprog и fminunc решатели, lambda isempty. Для других решателей, lambda имеет эти поля:

  • Variables – Содержит поля для каждой переменной задачи. Каждое имя переменной задачи является структурой с двумя полями:

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

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

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

    Примечание

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

Алгоритмы

свернуть все

Преобразование в форму решателя

Внутренне, solve функция решает задачи оптимизации путем вызова решателя. Для решателя по умолчанию для проблемы и поддерживаемых решателей для проблемы, смотрите 'solver' аргумент.

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

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

Для нелинейных задач оптимизации, solve использование automatic differentiation, чтобы вычислить градиенты целевой функции и нелинейных ограничительных функций. Эти производные применяются, когда цель и ограничительные функции состоят из Поддерживаемых Операций для Переменных и выражений Оптимизации и не используют fcn2optimexpr функция. Когда автоматическое дифференцирование не применяется, решатели оценивают производные с помощью конечных разностей. Для получения дополнительной информации автоматического дифференцирования, смотрите Автоматический Фон Дифференцирования.

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

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

Для нелинейного решения уравнения, solve внутренне представляет каждое уравнение как различие между левыми и правыми сторонами. То solve попытки минимизировать сумму квадратов компонентов уравнения. Для алгоритмов для решения нелинейных систем уравнений смотрите, что уравнение Решает Алгоритмы. Когда проблема также имеет границы, solve вызовы lsqnonlin минимизировать сумму квадратов компонентов уравнения. Смотрите Наименьшие квадраты (Подбор кривой Модели) Алгоритмы.

Примечание

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

Автоматическое дифференцирование

Автоматическое дифференцирование (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 значения по умолчанию, чтобы инвертировать AD.

  • Для целевой функции наименьших квадратов, fmincon и fminunc значение по умолчанию, чтобы передать AD для целевой функции. Для определения основанной на проблеме целевой функции наименьших квадратов смотрите Целевую функцию Записи для Основанных на проблеме Наименьших квадратов.

  • lsqnonlin значения по умолчанию, чтобы передать AD, когда число элементов в объективном векторе больше или равно количеству переменных. В противном случае, lsqnonlin значения по умолчанию, чтобы инвертировать AD.

  • fsolve значения по умолчанию, чтобы передать AD, когда количество уравнений больше или равно количеству переменных. В противном случае, fsolve значения по умолчанию, чтобы инвертировать AD.

Примечание

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

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

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

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

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

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

Расширенные возможности

Введенный в R2017b