选择算法
fmincon 算法
fmincon
有五个算法选项:
'interior-point'
(默认值)'trust-region-reflective'
'sqp'
'sqp-legacy'
'active-set'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
请参阅使用内点算法时的潜在不准确性。 |
建议算法的理论依据
'interior-point'
处理大型稀疏问题以及小型稠密问题。请参阅稀疏性在优化算法中的应用。该算法在所有迭代中都满足边界,并且可以从NaN
或Inf
结果中恢复。该算法可以对大规模问题使用特殊方法。有关详细信息,请参阅fmincon
options
中的内点算法。'sqp'
在所有迭代中都满足边界。该算法可以从NaN
或Inf
结果中恢复。该算法无法处理稀疏数据;请参阅 稀疏性在优化算法中的应用。'sqp-legacy'
类似于'sqp'
,但通常速度更慢且占用的内存更多。'active-set'
可以采用大步长,从而提高速度。该算法对一些具有非平滑约束的问题很有效。该算法无法处理稀疏数据;请参阅 稀疏性在优化算法中的应用。'trust-region-reflective'
要求您提供梯度,并且只允许边界或线性等式约束,但不能同时使用两者。在这些限制下,该算法可以高效处理大型稀疏问题和小型稠密问题。该算法可处理稀疏数据;参阅稀疏性在优化算法中的应用。该算法可以使用特殊方法来节省内存使用量,例如黑塞矩阵乘法函数。有关详细信息,请参阅fmincon
options
中的信赖域反射算法。
有关算法的说明,请参阅约束非线性优化算法。
fsolve 算法
fsolve
有三种算法:
'trust-region-dogleg'
(默认值)'trust-region'
'levenberg-marquardt'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
|
建议算法的理论依据
'trust-region-dogleg'
是唯一专门设计为用于求解非线性方程的算法。其他算法尝试最小化函数的平方和。'trust-region'
算法可以使用特殊技术,例如雅可比乘法函数来处理大型问题。所有算法均可使用稀疏数据;请参阅稀疏性在优化算法中的应用。
有关算法的说明,请参阅方程求解算法。
fminunc 算法
fminunc
有两种算法:
'quasi-newton'
(默认值)'trust-region'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
有关最小化失败时的帮助,请参阅当求解器失败时或当求解器可能成功求解时。 |
有关算法的说明,请参阅无约束非线性优化算法。
最小二乘算法
lsqlin
lsqlin
有三种算法:
'interior-point'
,默认值'trust-region-reflective'
'active-set'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
有关最小化失败时的帮助,请参阅当求解器失败时或当求解器可能成功求解时。 请参阅使用内点算法时的潜在不准确性。 |
有关算法的说明,请参阅最小二乘(模型拟合)算法。
lsqcurvefit 和 lsqnonlin
lsqcurvefit
和 lsqnonlin
有三种算法:
'trust-region-reflective'
(无约束或有边界约束问题的默认值)'levenberg-marquardt'
'interior-point'
(线性或非线性约束问题的默认值)
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
所有算法均可使用稀疏数据;请参阅稀疏性在优化算法中的应用。有关最小化失败时的帮助,请参阅当求解器失败时或当求解器可能成功求解时。 |
有关算法的说明,请参阅最小二乘(模型拟合)算法。
线性规划算法
linprog
有四种算法:
'dual-simplex-highs'
,默认值'interior-point'
'interior-point-legacy'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
首先使用 有关最小化失败时的帮助,请参阅当求解器失败时或当求解器可能成功求解时。 请参阅使用内点算法时的潜在不准确性。 |
建议算法的理论依据
通常,
'dual-simplex-highs'
和'interior-point'
算法运行速度快,且内存占用相对较少。'interior-point-legacy'
算法类似于'interior-point'
,但'interior-point-legacy'
可能速度较慢、稳健性较差或占用内存较多。所有算法均可使用稀疏数据;请参阅稀疏性在优化算法中的应用。
有关算法的说明,请参阅线性规划算法。
混合整数线性规划算法
intlinprog
有两种算法:
'highs'
,默认值'legacy'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
首先使用 有关最小化失败时的帮助,请参阅当求解器失败时或当求解器可能成功求解时。 |
建议算法的理论依据
通常,
'highs'
算法比'legacy'
算法速度更快或效果更好。'highs'
算法的调节选项要少得多。因此,在求解问题时,可用的选择项较少。在以后的版本中将会删除
'legacy'
算法。
有关算法的说明,请参阅混合整数线性规划 (MILP) 算法。
二次规划算法
quadprog
有三种算法:
'interior-point-convex'
(默认值)'trust-region-reflective'
'active-set'
在命令行中使用 optimoptions
设置 Algorithm
选项。
建议 |
---|
有关最小化失败时的帮助,请参阅当求解器失败时或当求解器可能成功求解时。 请参阅使用内点算法时的潜在不准确性。 |
有关算法的说明,请参阅二次规划算法。
稀疏性在优化算法中的应用
某些优化算法支持稀疏数据,无需存储或对完整矩阵进行运算。这些算法在计算过程中尽可能使用稀疏线性代数。此外,这些算法要么保留稀疏性,例如稀疏乔利斯基分解,要么不生成矩阵,例如共轭梯度法。当您有大型线性约束矩阵 A
或 Aeq
,或者问题变量数量较多时,这些算法是更佳的选择。
相比之下,某些算法会在内部创建完整的矩阵并使用密集线性代数。如果问题足够大,满矩阵会占用大量内存,稠密线性代数可能需要很长时间来执行。对于变量不多且线性约束矩阵不大的问题,这些算法有时比使用稀疏性的算法更快。
此表显示了哪些求解器和算法可以使用稀疏数据,哪些不能。
可以使用稀疏数据 | 无法使用稀疏数据 |
---|---|
|
|
| |
| |
| |
| |
| |
|
使用内点算法时的潜在不准确性
fmincon
、quadprog
、lsqlin
和 linprog
中的内点算法有许多好的特征,例如内存使用量少,能够快速求解大型问题。然而,其解的准确性可能比其他算法得出的解稍差一些。这种潜在的误差是因为(内部计算的)障碍函数会阻止迭代靠近不等式约束边界。
对于大多数实际目的来说,这种不准确性通常并不明显。
要减少不准确性,请尝试:
使用较小的
StepTolerance
、OptimalityTolerance
以及可能的ConstraintTolerance
容差重新运行求解器(但保持容差合理。)请参阅容差和停止条件。从内点解开始,运行不同算法。这可能会失败,因为有些算法会使用过多的内存或时间,所有
linprog
和一些quadprog
算法不接受初始点。
例如,当下界为 0 时,尝试最小化函数 x。使用 fmincon
的默认 interior-point
算法:
options = optimoptions(@fmincon,'Algorithm','interior-point','Display','off'); x = fmincon(@(x)x,1,[],[],[],[],0,[],[],options)
x = 2.0000e-08
使用 fmincon
sqp
算法:
options.Algorithm = 'sqp';
x2 = fmincon(@(x)x,1,[],[],[],[],0,[],[],options)
x2 = 0
同样,使用 linprog
interior-point-legacy
算法求解同一问题:
opts = optimoptions(@linprog,'Display','off','Algorithm','interior-point-legacy'); x = linprog(1,[],[],[],[],0,[],1,opts)
x = 2.0833e-13
使用 linprog
dual-simplex
算法:
opts.Algorithm = 'dual-simplex';
x2 = linprog(1,[],[],[],[],0,[],1,opts)
x2 = 0
在这些情况下,内点算法准确性稍差,但答案非常接近正确答案。