主要内容

选择算法

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设置算法选项。

建议
  • 如果你的目标函数包含梯度,使用它“算法”=“信赖域”,并设置SpecifyObjectiveGradient选项真正的

  • 否则,使用“算法”=“拟牛顿的

如果最小化失败,请参见当求解器失败时求解器可能成功的时候

算法说明请参见无约束非线性优化算法

最小二乘算法

lsqlin

lsqlin有三种算法:

  • “内点”,默认的

  • “trust-region-reflective”

  • “激活集”

使用optimoptions设置算法选项。

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

    提示

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

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

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

如果最小化失败,请参见当求解器失败时求解器可能成功的时候

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

算法说明请参见最小二乘(模型拟合)算法

lsqcurvefit和lsqnonlin

lsqcurvefitlsqnonlin有两个算法:

  • “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[][]选项)
x = 2.0000 e-08

使用fminconsqp算法:

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

类似地,使用linproginterior-point-legacy算法:

选择= optimoptions (@linprog,“显示”“关闭”“算法”“interior-point-legacy”);x = linprog (1 ,[],[],[],[], 0, 1,选择[])
x = 2.0833 e-13

使用linprog对偶单纯形算法:

选择。算法=对偶单纯形的;x2 = linprog (1 ,[],[],[],[], 0, 1,选择[])
x2 = 0

在这些情况下,内点算法的精确度较低,但答案非常接近正确答案。