Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

基于问题的优化算法

在内部,solve 函数通过调用以下求解器求解优化问题:

  • linprog - 线性目标和线性约束问题

  • intlinprog - 线性目标和线性约束以及整数约束问题

  • quadprog - 二次目标和线性约束问题

  • lsqlinlsqnonneg - 具有线性约束的线性最小二乘问题

  • lsqcurvefitlsqnonlin - 具有边界约束的非线性最小二乘问题

  • fminunc - 没有任何约束(甚至没有变量边界)但具有一般非线性目标函数的问题

  • fmincon - 具有非线性约束的问题,或具有一般非线性目标和至少一个约束的问题

  • fzero - 标量非线性方程

  • lsqlin - 有边界或无边界的线性方程组

  • fsolve - 无约束非线性方程组

  • lsqnonlin - 有边界的非线性方程组

问题必须由 solve 或者由其他一些相关联的函数或对象转换为求解器形式,solve 才能调用这些函数。这种转换需要一些条件,例如具有矩阵表示而不是优化变量表达式的线性约束。

算法的第一步是将优化表达式放入问题中。OptimizationProblem 对象有一个在其表达式中使用的变量的内部列表。每个变量在表达式中都有一个线性索引,并具有大小。因此,问题变量具有隐含的矩阵形式。prob2struct 函数执行从问题形式到求解器形式的转换。有关示例,请参阅将问题转换为结构体

对于非线性优化问题,solve 使用自动微分计算目标函数和非线性约束函数的梯度。当目标函数和约束函数由 Supported Operations for Optimization Variables and Expressions 组成并且不使用 fcn2optimexpr 函数时,这些导数适用。当自动微分不适用时,求解器使用有限差分来估计导数。有关自动微分的详细信息,请参阅Automatic Differentiation Background

对于 solve 调用的默认和允许的求解器,根据问题目标和约束,请参阅 'solver'。调用 solve 时,您可以使用 'solver' 名称-值对组参数来覆盖默认值。

有关 intlinprog 用于求解 MILP 问题的算法,请参阅intlinprog 算法。有关 linprog 用于求解线性规划问题的算法,请参阅线性规划算法。有关 quadprog 用于求解二次规划问题的算法,请参阅二次规划算法。有关线性或非线性最小二乘求解器算法,请参阅最小二乘(模型拟合)算法。有关非线性求解器算法,请参阅无约束非线性优化算法约束非线性优化算法

对于非线性方程求解,solve 在内部将每个方程表示为左右两侧之差。然后 solve 会尝试最小化方程分量的平方和。有关求解非线性方程组的算法,请参阅方程求解算法。当问题还有边界时,solve 调用 lsqnonlin 以最小化方程分量的平方和。请参阅最小二乘(模型拟合)算法

注意

如果您的目标函数是一个平方和,并且您需要 solve 将其识别为平方和,请将其写为 sum(expr.^2),而不是 expr'*expr 或任何其他形式。内部解析器只能识别显式的平方和。有关详细信息,请参阅Write Objective Function for Problem-Based Least Squares。有关示例,请参阅Nonnegative Linear Least Squares, Problem-Based

另请参阅

| |

相关主题