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