主要内容

选择算法

fmincon算法

fmincon算法有五个选项:

  • “内点”(默认)

  • “trust-region-reflective”

  • “sqp”

  • “sqp-legacy”

  • “激活集”

使用optimoptions设置算法在命令行选项。

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

    寻求帮助如果最小化失败,明白了在解算器失败时当解算器可能已经成功了

  • 再次优化,获得更多的速度运行在小到中等规模的问题,试一试“sqp”下一个,“激活集”最后一次。

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

看到潜在的错误和内点算法

建议背后的推理

  • “内点”处理大型、稀疏问题,以及小密度问题。迭代算法满足边界,并且可以恢复结果。这是一个大规模的算法;看到大型和中型的算法。该算法可以使用特殊的技术对大规模问题。有关详细信息,请参见内点算法fmincon选项

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

  • “sqp-legacy”类似于“sqp”,但通常是慢,使用更多的内存。

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

  • “trust-region-reflective”需要你提供一个梯度,并且只允许范围或线性等式约束,而不是两个。在这些限制,该算法处理两大稀疏问题和小密度问题有效。这是一个大规模的算法;看到大型和中型的算法。该算法可以使用特殊的技巧来节省内存使用,比如黑森乘法函数。有关详细信息,请参见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”

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

寻求帮助如果最小化失败,明白了在解算器失败时当解算器可能已经成功了

看到潜在的错误和内点算法

对算法的描述,请参阅二次规划算法

大型和中型的算法

一种优化算法大规模的当它使用线性代数不需要存储,也没有操作,完整的矩阵。这可能是做内部通过存储稀疏矩阵,并尽可能利用稀疏线性代数计算。此外,内部算法要么保持稀疏,如稀疏的柯列斯基分解,或不产生矩阵,如共轭梯度法。

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

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

潜在的错误和内点算法

内点算法fmincon,quadprog,lsqlin,linprog有很多良好的特性,如低内存使用和快速解决大型问题的能力。然而,他们的解决方案可以准确略金宝搏官方网站低于其他算法。这种潜在的不准确的原因是,(在内部计算)障碍函数不断迭代远离不等式约束边界。

最实用的目的,这个错误通常是非常小的。

减少错误,尝试:

  • 重新运行与较小的解算器StepTolerance,OptimalityTolerance,可能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

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