主要内容

选择算法

Fmincon算法

粉刺有五个算法选项:

  • “内点”(默认)

  • “trust-region-reflective”

  • “sqp”

  • 'SQP-Legacy'

  • “激活集”

使用优化选择设置算法选项。

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

    有关最小化失败的帮助,请参阅当解算器失败时当求解器可能成功时

  • 再次运行优化以获得更高的速度,请尝试“sqp”下一个,“激活集”持续。

  • 使用“trust-region-reflective”当适用。您的问题必须具有:目标函数包括渐变,仅限界限,或仅限线性平等约束(但不是两者)。

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

推理建议背后

  • “内点”处理大的、稀疏的问题,以及小的、密集的问题。该算法在所有迭代都满足边界,并能从结果。这是一个大规模的算法;看到大规模算法与中等规模算法。该算法可以使用特殊技术进行大规模问题。有关详细信息,请参阅内点算法粉刺选项

  • “sqp”满足所有迭代的范围。算法可以从中恢复结果。它不是一个大规模的算法;看到大规模算法与中等规模算法

  • 'SQP-Legacy'类似于“sqp”,但通常比较慢,并使用更多的内存。

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

  • “trust-region-reflective”要求您提供一个梯度,并且只允许边界或线性等式约束,但不同时允许两者。在这些限制下,算法可以有效地处理大的稀疏问题和小的稠密问题。这是一个大规模的算法;看到大规模算法与中等规模算法。该算法可以使用特殊的技术来节省内存使用,例如使用黑森乘法函数。有关详细信息,请参阅信任区域反光算法粉刺选项

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

fsolve算法

fsolve有三种算法:

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

  • “信赖域”

  • 'levenberg-marquardt'

使用优化选择设置算法选项。

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

    对于帮助,如果fsolve失败,看当解算器失败时当求解器可能成功时

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

  • 尝试定时所有算法,包括'levenberg-marquardt',找到最适合您的问题的算法。

推理建议背后

  • “trust-region-dogleg”是唯一专为求解非线性方程而设计的算法。另一些则试图使函数平方和最小。

  • “信赖域”算法对稀疏问题有效。它可以使用特殊的技术,例如雅孚倍数函数以进行大规模问题。

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

fminunc算法

Fminunc.有两个算法:

  • “拟牛顿”(默认)

  • “信赖域”

使用优化选择设置算法选项。

建议书
  • 如果您的客观函数包含梯度,请使用“算法”=“信赖域”,并设置specifyobjectivegradient.选项真正的

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

有关最小化失败的帮助,请参阅当解算器失败时当求解器可能成功时

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

最小二乘算法

Lsqlin.

Lsqlin.有三种算法:

  • “内点”,默认值

  • “trust-region-reflective”

  • “激活集”

使用优化选择设置算法选项。

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

    小费

    为更好的性能时,您的输入矩阵C有大量的非零条目,指定C作为普通双矩阵。同样,为了更好的性能C有相对较少的非零项,指定C稀疏。有关数据类型的详细信息,请参见稀疏矩阵。属性设置内部线性代数类型“LinearSolver”选择。

  • 如果你没有约束或者只有约束,并且想要更高的精度,更快的速度,或者想要使用Jacobian乘以线性最小二乘函数,试着“trust-region-reflective”

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

有关最小化失败的帮助,请参阅当解算器失败时当求解器可能成功时

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

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

lsqcurvefit和lsqnonlin

lsqcurvefit.lsqnonlin.有两个算法:

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

  • 'levenberg-marquardt'

使用优化选择设置算法选项。

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

  • 如果您的问题是未确定的(比尺寸的方程更少),请使用'levenberg-marquardt'

有关最小化失败的帮助,请参阅当解算器失败时当求解器可能成功时

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

线性规划算法

linprog有三种算法:

  • 对偶单纯形的,默认值

  • '内部点遗留'

  • “内点”

使用优化选择设置算法选项。

建议书

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

有关最小化失败的帮助,请参阅当解算器失败时当求解器可能成功时

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

推理建议背后

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

  • '内部点遗留'算法类似于“内点”,但是'内部点遗留'可能会更慢,不那么健壮,或使用更多的内存。

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

二次规划算法

quadprog有三种算法:

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

  • “trust-region-reflective”

  • “激活集”

使用优化选择设置算法选项。

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

  • 小费

    当您的Hessian矩阵时更好的性能H有大量的非零条目,指定H作为普通双矩阵。同样,为了更好的性能H有相对较少的非零项,指定H稀疏。有关数据类型的详细信息,请参见稀疏矩阵。属性设置内部线性代数类型“LinearSolver”选择。

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

  • 如果您有一个具有大量线性约束的正半纤维问题,而不是大量变量,请尝试“激活集”

有关最小化失败的帮助,请参阅当解算器失败时当求解器可能成功时

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

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

大规模算法与中等规模算法

优化算法是大规模当它使用不需要存储的线性代数时,也不是完整的矩阵。这可以通过存储稀疏矩阵,并通过使用稀疏线性代数进行稀疏线性代数,尽可能通过稀疏线性代数来完成。此外,内部算法保留稀疏性,例如稀疏尖孔的分解,或者不产生矩阵,例如共轭梯度方法。

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

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

与内部点算法的潜在不准确

内部点算法粉刺quadprogLsqlin.,linprog具有许多良好的特点,如低内存使用量和快速解决大问题的能力。但是,它们的解决方案可以比其他万博 尤文图斯算法的解决方案略微不精确。这种潜在不准确的原因是(内部计算的)屏障函数保持远离不等式约束边界。

对于大多数实用的目的,这种不准确性通常很小。

为了减少不准确,试着:

  • 重新运行较小的求解器StepTolerance.最优法,可能是约束特许公差(但保持公差明智。)看公差和停止标准)。

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

例如,试着最小化函数X当下面界限为0时。使用粉刺默认内点算法:

选项= Optimoptions(@Fmincon,“算法”“内点”“显示”“关闭”);x = fmincon (@ x (x), 1 ,[],[],[],[], 0[][]选项)
x = 2.0000E-08

使用粉刺sqp算法:

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

同样地,用linproginterior-point-legacy算法:

opts = Optimoptions(@Linprog,“显示”“关闭”“算法”'内部点遗留');x = linprog (1 ,[],[],[],[], 0, 1,选择[])
x = 2.0833e-13

使用linprog对偶单纯形算法:

opts.algorithm =对偶单纯形的;x2 = linprog (1 ,[],[],[],[], 0, 1,选择[])
x2 = 0

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