求解器耗时过长
由于各种原因,求解器可能会花费过多的时间。为了诊断原因或找到更快的解,请使用以下一种或多种技术。
启用迭代输出
将 Display
选项设置为 'iter'
。此设置显示求解器迭代的结果。
要在 MATLAB® 命令行中启用迭代输出,请输入
options = optimoptions('solvername','Display','iter');
使用 options
结构体调用求解器。
有关迭代输出的示例,请参阅解释结果。有关详细信息,请参阅在迭代输出中查看的内容。
使用适当的公差
如果公差太小,求解器可能无法收敛,尤其是 OptimalityTolerance
和 StepTolerance
。
要在命令行中更改容差,请使用 optimoptions
,如设置和更改优化选项中所述。
使用绘图函数
您可以使用绘图函数获得有关求解器迭代的更多视觉或详细信息。求解器函数参考页的选项部分列出了绘图函数。
要在 MATLAB 命令行中使用绘图函数,请输入
options = optimoptions('solvername','PlotFcn',{@plotfcn1,@plotfcn2,...});
使用 options
结构体调用求解器。
有关使用绘图函数的示例,请参阅 使用预定义的绘图函数。
使用 'lbfgs' HessianApproximation
选项
对于 fmincon
和 fminunc
求解器,如果您遇到涉及许多变量(数百个或更多)的问题,那么通常可以通过将 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 耗尽内存或时间。以下是使用较少内存的一些建议:
如果可能的话,使用大规模算法(请参阅大规模算法与中等规模算法)。这些算法包括
trust-region-reflective
、interior-point
、fminunc
trust-region
算法、fsolve
trust-region-dogleg
算法和Levenberg-Marquardt
算法。相比之下,active-set
、quasi-newton
和sqp
算法规模不大。提示
如果您使用大规模算法,则请使用稀疏矩阵作为线性约束。
使用雅可比乘法函数或 Hessian 乘法函数。有关示例,请参阅雅可比乘法函数与线性最小二乘法、使用密集、结构化的 Hessian 矩阵进行二次最小化和使用密集结构 Hessian 和线性等式进行最小化。
使用并行计算
如果您有 Parallel Computing Toolbox™ 许可证,您的求解器可能会使用并行计算运行得更快。有关详细信息,请参阅并行计算。