Внутренне, 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
использует для решения квадратичных задач программирования, см. «Алгоритмы квадратичного программирования». Для линейных или нелинейных алгоритмов решения методом наименьших квадратов см. Алгоритмы наименьших квадратов (Model Fitting). Для нелинейных алгоритмов решателя, см., Без ограничений, Алгоритмы нелинейной Оптимизации и Ограниченные Нелинейные Алгоритмы Оптимизации.
Для решения нелинейных уравнений, solve
внутренне представляет каждое уравнение как различие между левой и правой сторонами. Тогда solve
пытается минимизировать сумму квадратов компонентов уравнения. Для алгоритмов решения нелинейных систем уравнений, см. Алгоритмы решения уравнений. Когда задача также имеет границы, solve
вызовы lsqnonlin
для минимизации суммы квадратов компонентов уравнения. См. Алгоритмы нахождения наименьших квадратов (Model Fitting).
Примечание
Если ваша целевая функция является суммой квадратов, и вы хотите solve
чтобы распознать его как таковой, запишите его как sum(expr.^2)
, а не как expr'*expr
или любая другая форма. Внутренний анализатор распознает только явные суммы квадратов. Для получения дополнительной информации смотрите Запись целевой функции для основанных на проблеме наименьших квадратов. Для получения примера смотрите Неотрицательные линейные задачи для метода наименьших квадратов, Основанные на проблеме.
intlinprog
| linprog
| prob2struct