Main Content

求解器耗时过长

由于各种原因,求解器可能会花费过多的时间。为了诊断原因或找到更快的解,请使用以下一种或多种技术。

启用迭代输出

Display 选项设置为 'iter'。此设置显示求解器迭代的结果。

要在 MATLAB® 命令行中启用迭代输出,请输入

options = optimoptions('solvername','Display','iter');

使用 options 结构体调用求解器。

有关迭代输出的示例,请参阅解释结果。有关详细信息,请参阅在迭代输出中查看的内容

使用适当的公差

如果公差太小,求解器可能无法收敛,尤其是 OptimalityToleranceStepTolerance

要在命令行中更改容差,请使用 optimoptions,如设置和更改优化选项中所述。

使用绘图函数

您可以使用绘图函数获得有关求解器迭代的更多视觉或详细信息。求解器函数参考页的选项部分列出了绘图函数。

要在 MATLAB 命令行中使用绘图函数,请输入

options = optimoptions('solvername','PlotFcn',{@plotfcn1,@plotfcn2,...});

使用 options 结构体调用求解器。

有关使用绘图函数的示例,请参阅 使用预定义的绘图函数

使用 'lbfgs' HessianApproximation 选项

对于 fminconfminunc 求解器,如果您遇到涉及许多变量(数百个或更多)的问题,那么通常可以通过将 HessianApproximation 选项设置为 'lbfgs' 来节省时间和内存。这导致 fmincon 'interior-point' 算法和 fminunc 'quasi-newton' 算法使用低内存的 Hessian 近似值。请参阅求解多变量非线性问题

使用 checkGradients 验证导数

如果您向求解器提供导数(梯度或雅可比矩阵),如果导数不准确,求解器可能无法收敛。有关使用 checkGradients 函数的信息,请参阅 检查梯度或雅可比矩阵的有效性

使用 Inf 而不是较大的任意边界

如果使用较大的任意边界(上界或下界),求解器可能会花费过多的时间,甚至无法收敛。但是,如果将 Inf-Inf 设置为边界,求解器将花费更少的时间,并且可能会更好地收敛。

为什么?内点算法可以将初始点设置为有限边界的中点。或者内点算法可以尝试在有限边界中间找到一条“中心路径”。因此,较大的任意边界可能会不适当地调整这些分量。相反,为了达到这些目的,无限边界被忽略了。

次要点:一些求解器主要通过 Hessian 约束来对每个约束使用内存。将边界设置为 Inf-Inf 意味着没有约束,因此使用的内存更少,因为约束 Hessian 具有较低的维度。

使用输出函数

您可以使用输出函数获取有关求解器迭代的详细信息。求解器在每次迭代时调用输出函数。您可以使用 输出函数和绘图函数语法 中描述的语法编写输出函数。

有关使用输出函数的示例,请参阅 Optimization Toolbox 的输出函数

尝试不同的算法选项

许多求解器都有可以改变解时间的选项,但改变的方式并不容易预测。通常,Algorithm 选项对解时间有显著的影响。

影响解时间的其他选项包括:

  • fmincon 'interior-point' 算法 - 尝试将 BarrierParamUpdate 选项设置为 'predictor-corrector'

  • 'trust-region''trust-region-reflective' 算法的 'SubproblemAlgorithm' 选项 - 尝试将 'SubproblemAlgorithm' 设置为 'factorization' 而不是默认的 'cg'

  • coneprog - 对于大型稀疏问题,尝试将 LinearSolver 选项设置为 'prodchol''schur''normal'。对于密集问题,尝试将 LinearSolver 选项设置为 'augmented'

  • quadprog 'interior-point-convex' 算法或 lsqlin 'interior-point' 算法 - 尝试将 LinearSolver 选项设置为 'sparse''dense'

使用稀疏求解器或乘法函数

较大的问题可能会导致 MATLAB 耗尽内存或时间。以下是使用较少内存的一些建议:

使用并行计算

如果您有 Parallel Computing Toolbox™ 许可证,您的求解器可能会使用并行计算运行得更快。有关详细信息,请参阅并行计算