求解时间太长
求解者可能会因为各种原因而花费过多的时间。要诊断原因或快速解决问题,请使用以下一种或多种技术。
启用迭代显示
设置显示
选项“通路”
.此设置显示求解器迭代的结果。
在MATLAB中实现迭代显示®命令行,输入
Options = optimoptions('solvername”、“显示”、“iter”);
调用解算器选项
结构。
有关迭代显示的示例,请参见解释结果.有关更多信息,请参见在迭代显示中寻找什么.
使用适当的公差
特别是,如果公差太小,解算器可能无法收敛OptimalityTolerance
而且StepTolerance
.
若要在命令行更改容差,请使用optimoptions
如在设置和更改选项.
使用绘图函数
您可以使用绘图函数获得关于求解器迭代的更多可视化或详细信息。求解器的函数参考页的选项部分列出了绘图函数。
要在MATLAB命令行中使用绘图函数,请输入
Options = optimoptions('solvername”、“PlotFcn’,{@plotfcn1,@plotfcn2…});
调用解算器选项
结构。
有关使用绘图函数的示例,请参见使用绘图函数.
使用“lbfgs”HessianApproximation
选项
为fmincon
而且fminunc
求解器,如果您有许多变量(数百个或更多)的问题,那么通常您可以通过设置HessianApproximation
选项“lbfgs”
.这导致了fmincon
“内点”
算法和fminunc
“拟牛顿”
算法使用低内存黑森近似。看到求解多变量非线性问题.
使CheckGradients
如果你为你的求解器提供了导数(梯度或雅可比矩阵),如果导数不准确,求解器就不能收敛。的详细信息CheckGradients
选项,看到检验梯度或雅可比矩阵的有效性.
使用Inf而不是一个大的,任意的边界
如果你使用一个很大的任意边界(上或下),求解器可能会花费过多的时间,甚至无法收敛。然而,如果你设置正
或负
作为边界,求解器可以花费更少的时间,并且可能收敛得更好。
为什么?内点算法可以将初始点设置为有限界的中点。或者,内点算法可以尝试在有限边界之间找到一条“中心路径”。因此,一个较大的任意边界可以不恰当地调整这些组件的大小。相反,出于这些目的,无限边界被忽略了。
要点:有些解算器对每个约束都使用内存,主要是通过约束Hessian。设置绑定为正
或负
意味着没有约束,因此使用的内存更少,因为约束黑森具有更低的维数。
使用输出函数
您可以使用输出函数获得求解器迭代的详细信息。求解器在每次迭代中调用输出函数。中描述的语法编写输出函数输出函数和图函数语法.
有关使用输出函数的示例,请参见优化工具箱的输出函数.
尝试不同的算法选项
许多求解器都有可以改变求解时间的选项,但不是以容易预测的方式。通常,算法
选项对求解时间有显著影响。
影响解决方案时间的其他选项包括:
fmincon
“内点”
算法-尝试设置BarrierParamUpdate
选项预估的
.“SubproblemAlgorithm”
选项“信赖域”
或“trust-region-reflective”
算法-尝试设置“SubproblemAlgorithm”
来“分解”
而不是默认“重心”
.coneprog
-对于大的稀疏问题,尝试设置LinearSolver
选项“prodchol”
,“舒尔”
,或“正常”
.对于密集的问题,请尝试设置LinearSolver
选项“增强”
.quadprog
“interior-point-convex”
算法或lsqlin
“内点”
算法-尝试设置LinearSolver
选项“稀疏”
或“密集”
.
使用稀疏求解器或乘法函数
大的问题可能会导致MATLAB耗尽内存或时间。下面是一些减少内存使用的建议:
如果可能,使用大规模算法(参见大规模和中等规模算法).这些算法包括
trust-region-reflective
,内点
,fminunc
信赖域
算法,fsolve
trust-region-dogleg
算法,以及Levenberg-Marquardt
算法。相比之下,有效集
,拟牛顿
,sqp
算法不是大规模的。提示
如果你使用大规模算法,那么你的线性约束使用稀疏矩阵。
使用雅可比乘函数或黑森乘函数。有关示例,请参见线性最小二乘雅可比乘法函数,二次最小化与密集,结构化黑森,密结构黑森最小化,线性等式.
使用并行计算
如果您拥有并行计算工具箱™许可证,您的求解器使用并行计算可能运行得更快。有关更多信息,请参见并行计算.