Внутренне, solve
функция решает задачи оптимизации путем вызова решателя:
linprog
для линейных объективных и линейных ограничений
intlinprog
для линейных объективных и линейных ограничений и целочисленных ограничений
quadprog
для квадратичных объективных и линейных ограничений
lsqlin
или lsqnonneg
для линейного метода наименьших квадратов с линейными ограничениями
lsqcurvefit
или lsqnonlin
для нелинейного метода наименьших квадратов со связанными ограничениями
fminunc
для проблем без любых ограничений (даже переменные границы) и с общей нелинейной целевой функцией
fmincon
для проблем с нелинейным ограничением, или с общей нелинейной целью и по крайней мере одним ограничением
fzero
для скалярного нелинейного уравнения
lsqlin
для систем линейных уравнений, с или без границ
fsolve
для систем нелинейных уравнений без ограничений
lsqnonlin
для систем нелинейных уравнений с границами
Перед solve
может вызвать эти функции, проблемы должны быть преобразованы в форму решателя, любого solve
или некоторые другие присоединенные функции или объекты. Это преобразование влечет за собой, например, линейные ограничения, имеющие матричное представление, а не переменное выражение оптимизации.
Первый шаг в алгоритме происходит, когда вы помещаете выражения оптимизации в проблему. OptimizationProblem
объект имеет внутренний список переменных, используемых в его выражениях. Каждая переменная имеет линейный индекс в выражении и размер. Поэтому переменные задачи имеют подразумеваемую матричную форму. prob2struct
функция выполняет преобразование от проблемной формы до формы решателя. Для примера смотрите, Преобразуют проблему в Структуру.
Для нелинейных задач оптимизации, solve
использование automatic differentiation, чтобы вычислить градиенты целевой функции и нелинейных ограничительных функций. Эти производные применяются, когда цель и ограничительные функции состоят из Поддерживаемых Операций на Переменных и выражениях Оптимизации и не используют fcn2optimexpr
функция. Когда автоматическое дифференцирование не применяется, решатели оценивают производные с помощью конечных разностей. Для получения дополнительной информации автоматического дифференцирования, смотрите Автоматический Фон Дифференцирования.
Для значения по умолчанию и позволенных решателей, что solve
вызовы, в зависимости от проблемной цели и ограничений, смотрите 'solver'
. Можно заменить значение по умолчанию при помощи 'solver'
аргумент пары "имя-значение" при вызове solve
.
Для алгоритма, что intlinprog
использование, чтобы решить задачи MILP, см. intlinprog Алгоритм. Для алгоритмов, что linprog
использование, чтобы решить задачи линейного программирования, см. Линейные Алгоритмы Программирования. Для алгоритмов, что quadprog
использование, чтобы решить задачи квадратичного программирования, см. Алгоритмы Квадратичного программирования. Для линейного или алгоритмов решателя нелинейного метода наименьших квадратов, смотрите Наименьшие квадраты (Подбор кривой Модели) Алгоритмы. Для нелинейных алгоритмов решателя см. Неограниченные Нелинейные Алгоритмы Оптимизации и Ограниченные Нелинейные Алгоритмы Оптимизации.
Для нелинейного решения уравнения, solve
внутренне представляет каждое уравнение как различие между левыми и правыми сторонами. То solve
попытки минимизировать сумму квадратов компонентов уравнения. Для алгоритмов для решения нелинейных систем уравнений смотрите, что уравнение Решает Алгоритмы. Когда проблема также имеет границы, solve
вызовы lsqnonlin
минимизировать сумму квадратов компонентов уравнения. Смотрите Наименьшие квадраты (Подбор кривой Модели) Алгоритмы.
Примечание
Если ваша целевая функция является суммой квадратов, и вы хотите solve
чтобы распознать его как таковой, запишите его как sum(expr.^2)
, и не как expr'*expr
или любая другая форма. Внутренний синтаксический анализатор распознает только явные суммы квадратов. Для получения дополнительной информации смотрите Целевую функцию Записи для Основанных на проблеме Наименьших квадратов. Для примера смотрите Неотрицательную линейную задачу для метода наименьших квадратов, Основанную на проблеме.
intlinprog
| linprog
| prob2struct