主要内容

算法选择

fmincon算法

fmincon有五个算法选项:

  • “内点”(默认)

  • “trust-region-reflective”

  • “sqp”

  • “sqp-legacy”

  • “激活集”

使用optimoptions设置算法选项。

建议
  • 使用“内点”算法首先。

    若最小化失败,请参阅当求解器失败时当解算器可能成功的时候

  • 若要再次运行优化以获得处理中小型问题的更快速度,请尝试“sqp”下一个,“激活集”最后的

  • 使用“trust-region-reflective”在适用的情况下)。你的问题必须有:目标函数包括梯度,只有边界,或只有线性等式约束(但不能两者都有)。

看到内点算法的潜在不准确性

建议背后的理由

  • “内点”处理大型稀疏问题,以及小型密集问题。该算法在所有迭代中都满足边界,并且可以从结果。这是一个大规模算法;看到大规模和中等规模算法.该算法可以使用特殊技术来解决大规模问题。详细信息请参见内点算法fmincon选项

  • “sqp”在所有迭代中满足边界。该算法可以从结果。它不是一个大规模的算法;看到大规模和中等规模算法

  • “sqp-legacy”类似于“sqp”,但通常速度较慢,占用更多内存。

  • “激活集”可以走大步子,这增加了速度。该算法对一些具有非光滑约束的问题是有效的。它不是一个大规模的算法;看到大规模和中等规模算法

  • “trust-region-reflective”要求你提供一个梯度,并且只允许边界或线性相等约束,但不允许两者都有。在这些限制下,该算法可以有效地处理大型稀疏问题和小型密集问题。这是一个大规模算法;看到大规模和中等规模算法.该算法可以使用特殊的技术来节省内存使用,例如Hessian乘函数。详细信息请参见Trust-Region-Reflective算法fmincon选项

有关算法的描述,请参见约束非线性优化算法

fsolve算法

fsolve有三个算法:

  • “trust-region-dogleg”(默认)

  • “信赖域”

  • “levenberg-marquardt”

使用optimoptions设置算法选项。

建议
  • 使用“trust-region-dogleg”算法首先。

    寻求帮助fsolve失败了,看到当求解器失败时当解算器可能成功的时候

  • 如果您有一个雅可比乘法函数,或者想要调整内部算法(请参阅信赖域算法fsolve选项),试一试“信赖域”

  • 试试所有算法的计时,包括“levenberg-marquardt”,以找到最适合你的问题的算法。

建议背后的理由

  • “trust-region-dogleg”是唯一专门为求解非线性方程而设计的算法。其他的尝试最小化函数的平方和。

  • “信赖域”算法对稀疏问题是有效的。它可以使用特殊的技术,如雅可比乘法函数来解决大规模问题。

有关算法的描述,请参见方程求解算法

fminunc算法

fminunc有两个算法:

  • “拟牛顿”(默认)

  • “信赖域”

使用optimoptions设置算法选项。

建议
  • 如果你的目标函数包含梯度,使用'Algorithm' = 'trust-region',并设置SpecifyObjectiveGradient选项真正的

  • 否则,使用'Algorithm' = '准牛顿'

若最小化失败,请参阅当求解器失败时当解算器可能成功的时候

有关算法的描述,请参见无约束非线性优化算法

最小二乘算法

lsqlin

lsqlin有三个算法:

  • “内点”,默认

  • “trust-region-reflective”

  • “激活集”

使用optimoptions设置算法选项。

建议
  • 试一试“内点”第一。

    提示

    更好的性能,当你的输入矩阵C有很大一部分非零项,指定C作为一个普通的二重矩阵。同样,为了更好的性能C具有相对较少的非零项,指定C稀疏。有关数据类型的详细信息,请参见稀疏矩阵.属性设置内部线性代数类型“LinearSolver”选择。

  • 如果你没有约束条件或只有约束条件,而想要更高的精度,更快的速度,或者想要使用线性最小二乘雅可比乘法函数,试着“trust-region-reflective”

  • 如果你有大量的线性约束,而不是大量的变量,尝试一下“激活集”

若最小化失败,请参阅当求解器失败时当解算器可能成功的时候

看到内点算法的潜在不准确性

有关算法的描述,请参见最小二乘(模型拟合)算法

Lsqcurvefit和lsqnonlin

lsqcurvefit而且lsqnonlin有两个算法:

  • “trust-region-reflective”(默认)

  • “levenberg-marquardt”

使用optimoptions设置算法选项。

建议
  • 一般来说,试一试“trust-region-reflective”第一。

  • 如果你的问题是不确定的(方程比维数少),使用“levenberg-marquardt”

若最小化失败,请参阅当求解器失败时当解算器可能成功的时候

有关算法的描述,请参见最小二乘(模型拟合)算法

线性规划算法

linprog有三个算法:

  • 对偶单纯形的,默认

  • “interior-point-legacy”

  • “内点”

使用optimoptions设置算法选项。

建议

使用对偶单纯形的算法或“内点”算法首先。

若最小化失败,请参阅当求解器失败时当解算器可能成功的时候

看到内点算法的潜在不准确性

建议背后的理由

  • 通常,对偶单纯形的而且“内点”算法是快速的,使用最少的内存。

  • “interior-point-legacy”算法类似于“内点”,但“interior-point-legacy”可能会更慢、更弱,或者使用更多内存。

有关算法的描述,请参见线性规划算法

二次规划算法

quadprog有三个算法:

  • “interior-point-convex”(默认)

  • “trust-region-reflective”

  • “激活集”

使用optimoptions设置算法选项。

建议
  • 如果你有一个凸的问题,或者如果你不知道你的问题是否是凸的,使用“interior-point-convex”

  • 提示

    为了更好的性能,当你的黑森矩阵H有很大一部分非零项,指定H作为一个普通的二重矩阵。同样,为了更好的性能H具有相对较少的非零项,指定H稀疏。有关数据类型的详细信息,请参见稀疏矩阵.属性设置内部线性代数类型“LinearSolver”选择。

  • 如果你有一个只有边界的非凸问题,或者只有线性等式,使用“trust-region-reflective”

  • 如果你有一个正的半定问题,有大量的线性约束,而不是大量的变量,尝试一下“激活集”

若最小化失败,请参阅当求解器失败时当解算器可能成功的时候

看到内点算法的潜在不准确性

有关算法的描述,请参见二次规划算法

大规模和中等规模算法

优化算法为大规模的当它使用不需要存储或操作完整矩阵的线性代数时。这可以在内部通过存储稀疏矩阵来完成,并尽可能使用稀疏线性代数进行计算。此外,内部算法要么保持稀疏性,如稀疏Cholesky分解,要么不生成矩阵,如共轭梯度方法。

相比之下,中等规模的方法在内部创建完整的矩阵并使用密集线性代数。如果问题足够大,完整的矩阵会占用大量的内存,而密集的线性代数可能需要很长时间来执行。

不要让“大规模”这个名字误导了你;你可以在一个小问题上使用大规模的算法。此外,您不需要指定任何稀疏矩阵来使用大规模算法。选择中等规模的算法来访问额外的功能,比如额外的约束类型,或者可能获得更好的性能。

内点算法的潜在不准确性

内点算法fminconquadproglsqlin,linprog具有许多良好的特性,例如低内存占用和快速解决大问题的能力。然而,他们的解决方案可能比其他金宝搏官方网站算法略不准确。造成这种潜在不准确的原因是(内部计算的)屏障函数使迭代远离不等式约束边界。

对于大多数实际目的,这种误差通常是相当小的。

为了减少误差,请尝试:

  • 重新运行较小的求解器StepToleranceOptimalityTolerance,而且可能ConstraintTolerance公差(但要保持合理的公差)。看到公差和停止标准).

  • 运行不同的算法,从内点解开始。这可能会失败,因为一些算法可能会使用过多的内存或时间linprog和一些quadprog算法不接受初始点。

例如,尝试最小化函数x当下界为0时。使用fmincon默认的内点算法:

选项= optimoptions(@fmincon,“算法”“内点”“显示”“关闭”);X = fmincon(@(X) X,1,[],[],[],[], [],0,[],[],options)
X = 2.0000 -08

使用fminconsqp算法:

选项。算法=“sqp”;X2 = fmincon(@(x)x,1,[],[],[],[], [],0,[],[],options)
X2 = 0

类似地,使用linproginterior-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

在这些情况下,内点算法不太准确,但答案非常接近正确答案。