算法选择
fmincon算法
fmincon
有五个算法选项:
“内点”
(默认)“trust-region-reflective”
“sqp”
“sqp-legacy”
“激活集”
使用optimoptions
设置算法
选项。
建议 |
---|
看到内点算法的潜在不准确性. |
建议背后的理由
“内点”
处理大型稀疏问题,以及小型密集问题。该算法在所有迭代中都满足边界,并且可以从南
或正
结果。这是一个大规模算法;看到大规模和中等规模算法.该算法可以使用特殊技术来解决大规模问题。详细信息请参见内点算法在fmincon
选项
.“sqp”
在所有迭代中满足边界。该算法可以从南
或正
结果。它不是一个大规模的算法;看到大规模和中等规模算法.“sqp-legacy”
类似于“sqp”
,但通常速度较慢,占用更多内存。“激活集”
可以走大步子,这增加了速度。该算法对一些具有非光滑约束的问题是有效的。它不是一个大规模的算法;看到大规模和中等规模算法.“trust-region-reflective”
要求你提供一个梯度,并且只允许边界或线性相等约束,但不允许两者都有。在这些限制下,该算法可以有效地处理大型稀疏问题和小型密集问题。这是一个大规模算法;看到大规模和中等规模算法.该算法可以使用特殊的技术来节省内存使用,例如Hessian乘函数。详细信息请参见Trust-Region-Reflective算法在fmincon
选项
.
有关算法的描述,请参见约束非线性优化算法.
fsolve算法
fsolve
有三个算法:
“trust-region-dogleg”
(默认)“信赖域”
“levenberg-marquardt”
使用optimoptions
设置算法
选项。
建议 |
---|
|
建议背后的理由
“trust-region-dogleg”
是唯一专门为求解非线性方程而设计的算法。其他的尝试最小化函数的平方和。的
“信赖域”
算法对稀疏问题是有效的。它可以使用特殊的技术,如雅可比乘法函数来解决大规模问题。
有关算法的描述,请参见方程求解算法.
fminunc算法
fminunc
有两个算法:
“拟牛顿”
(默认)“信赖域”
使用optimoptions
设置算法
选项。
建议 |
---|
若最小化失败,请参阅当求解器失败时或当解算器可能成功的时候. |
有关算法的描述,请参见无约束非线性优化算法.
最小二乘算法
lsqlin
lsqlin
有三个算法:
“内点”
,默认“trust-region-reflective”
“激活集”
使用optimoptions
设置算法
选项。
建议 |
---|
若最小化失败,请参阅当求解器失败时或当解算器可能成功的时候. 看到内点算法的潜在不准确性. |
有关算法的描述,请参见最小二乘(模型拟合)算法.
Lsqcurvefit和lsqnonlin
lsqcurvefit
而且lsqnonlin
有两个算法:
“trust-region-reflective”
(默认)“levenberg-marquardt”
使用optimoptions
设置算法
选项。
建议 |
---|
若最小化失败,请参阅当求解器失败时或当解算器可能成功的时候. |
有关算法的描述,请参见最小二乘(模型拟合)算法.
线性规划算法
linprog
有三个算法:
对偶单纯形的
,默认“interior-point-legacy”
“内点”
使用optimoptions
设置算法
选项。
建议 |
---|
使用 若最小化失败,请参阅当求解器失败时或当解算器可能成功的时候. 看到内点算法的潜在不准确性. |
建议背后的理由
通常,
对偶单纯形的
而且“内点”
算法是快速的,使用最少的内存。的
“interior-point-legacy”
算法类似于“内点”
,但“interior-point-legacy”
可能会更慢、更弱,或者使用更多内存。
有关算法的描述,请参见线性规划算法.
二次规划算法
quadprog
有三个算法:
“interior-point-convex”
(默认)“trust-region-reflective”
“激活集”
使用optimoptions
设置算法
选项。
建议 |
---|
若最小化失败,请参阅当求解器失败时或当解算器可能成功的时候. 看到内点算法的潜在不准确性. |
有关算法的描述,请参见二次规划算法.
大规模和中等规模算法
优化算法为大规模的当它使用不需要存储或操作完整矩阵的线性代数时。这可以在内部通过存储稀疏矩阵来完成,并尽可能使用稀疏线性代数进行计算。此外,内部算法要么保持稀疏性,如稀疏Cholesky分解,要么不生成矩阵,如共轭梯度方法。
相比之下,中等规模的方法在内部创建完整的矩阵并使用密集线性代数。如果问题足够大,完整的矩阵会占用大量的内存,而密集的线性代数可能需要很长时间来执行。
不要让“大规模”这个名字误导了你;你可以在一个小问题上使用大规模的算法。此外,您不需要指定任何稀疏矩阵来使用大规模算法。选择中等规模的算法来访问额外的功能,比如额外的约束类型,或者可能获得更好的性能。
内点算法的潜在不准确性
内点算法fmincon
,quadprog
,lsqlin
,linprog
具有许多良好的特性,例如低内存占用和快速解决大问题的能力。然而,他们的解决方案可能比其他金宝搏官方网站算法略不准确。造成这种潜在不准确的原因是(内部计算的)屏障函数使迭代远离不等式约束边界。
对于大多数实际目的,这种误差通常是相当小的。
为了减少误差,请尝试:
重新运行较小的求解器
StepTolerance
,OptimalityTolerance
,而且可能ConstraintTolerance
公差(但要保持合理的公差)。看到公差和停止标准).运行不同的算法,从内点解开始。这可能会失败,因为一些算法可能会使用过多的内存或时间
linprog
和一些quadprog
算法不接受初始点。
例如,尝试最小化函数x当下界为0时。使用fmincon
默认的内点
算法:
选项= optimoptions(@fmincon,“算法”,“内点”,“显示”,“关闭”);X = fmincon(@(X) X,1,[],[],[],[], [],0,[],[],options)
X = 2.0000 -08
使用fmincon
sqp
算法:
选项。算法=“sqp”;X2 = fmincon(@(x)x,1,[],[],[],[], [],0,[],[],options)
X2 = 0
类似地,使用linprog
interior-point-legacy
算法:
Opts = optimoptions(@linprog,“显示”,“关闭”,“算法”,“interior-point-legacy”);X = linprog(1,[],[],[],[],0,[],1,opts)
X = 2.0833e-13
使用linprog
对偶单纯形
算法:
选择。算法=对偶单纯形的;X2 = linprog(1,[],[],[],[], [],0,[],1,opts)
X2 = 0
在这些情况下,内点算法不太准确,但答案非常接近正确答案。