【问题标题】:Algorithm for multidimensional optimization / root-finding / something多维优化算法/寻根/某事
【发布时间】:2025-12-05 18:35:01
【问题描述】:

我有五个值,A、B、C、D 和 E。

给定约束 A + B + C + D + E = 1,以及五个函数 F(A)、F(B)、F(C)、F(D)、F(E),我需要求解对于 A 到 E 使得 F(A) = F(B) = F(C) = F(D) = F(E)。

为此使用的最佳算法/方法是什么?我不在乎是否必须自己写,我只想知道在哪里看。

编辑:这些是非线性函数。除此之外,它们无法表征。其中一些最终可能是从数据表中插入的。

【问题讨论】:

  • 您需要指定它们的功能类型。线性、二次、指数、三角等。
  • 你应该给你的函数起不同的名字,以免混淆。
  • 您的值 A ... E 是否也被限制为非负数?在许多问题中,当值被限制为总和为 1 时,它们也被限制为不是负数。还有其他限制吗?
  • 函数是否至少已知具有相交范围?例如,如果 F_n(x) = atan(x) + 2n * pi,则问题无解。

标签: algorithm math mathematical-optimization numerical-methods numerical-analysis


【解决方案1】:

这个问题没有一般的答案。不存在求解任何方程的求解器。正如 Lance Roberts 已经说过的,你必须更多地了解函数。举几个例子

  • 如果函数是两次可微的,并且您可以计算一阶导数,您可以尝试Newton-Raphson 的变体
  • 查看Lagrange Multiplier Method 以实现约束。
  • 如果函数 F 是连续的(如果它是插值,它可能是连续的),您还可以尝试二分法,这很像二分搜索。

在你解决问题之前,你真的需要更多地了解你正在研究的函数。

【讨论】:

  • 连续函数,没有导数或者太复杂,应该用 brents 方法。它是抛物线插值和黄金二等分的组合,它可以适应最小和最大优化,并且代码非常简单,请查看 C 中的 NUMERICAL RECIPES 以了解进一步的使用和优化方法。
  • 感谢 nlucaroni 建议另一种方法(我不知道)。
  • @nlucaroni:布伦特方法仅是一维的。顺便说一句,C 中的 NR 是 15 岁。考虑升级到(很棒的)第 3 版。
【解决方案2】:

正如其他人已经发布的那样,我们确实需要有关这些功能的更多信息。但是,鉴于此,我们仍然可以尝试使用标准的非线性编程工具箱来解决以下松弛问题。

最小k

A + B + C + D + E = 1
F1(A) - k = 0
F2(B) - k = 0
F3(C) -k = 0
F4(D) - k = 0
F5(E) -k = 0

现在我们可以用任何我们希望的方式来解决这个问题,例如惩罚方法

min k + mu*sum(Fi(x_i) - k)^2 st
A+B+C+D+E = 1

或直接的 SQP 或内点法。

更多细节,我可以帮助建议一个好的方法。

【讨论】:

    【解决方案3】:

    函数都随参数单调递增。除此之外,它们无法表征。行之有效的方法是:

    1) 从 A = B = C = D = E = 1/5 开始
    2) 计算 F1(A) 到 F5(E),并重新计算 A 到 E,使每个函数等于总和除以 5(平均值)。
    3) 重新调整新的 A 到 E,使它们的总和为 1,然后重新计算 F1 到 F5。
    4) 重复直到满意为止。

    它的收敛速度惊人地快 - 只需几次迭代。当然,每次迭代都需要为步骤 2 找到 5 个根。

    【讨论】:

      【解决方案4】:

      方程的一个解

      A + B + C + D + E = 1
      F(A) = F(B) = F(C) = F(D) = F(E)
      

      就是取A、B、C、D、E都等于1/5。不知道这是否是你想要的......

      在 John 的评论之后添加(谢谢!)

      假设第二个等式应为 F1(A) = F2(B) = F3(C) = F4(D) = F5(E),我将使用 Newton-Raphson 方法(请参阅 Martijn 的答案)。您可以通过设置 E = 1 - A - B - C - D 来消除一个变量。在迭代的每一步,您都需要求解一个 4x4 系统。最大的问题可能是从哪里开始迭代。一种可能性是从一个随机点开始,进行一些迭代,如果你没有得到任何结果,请选择另一个随机点并重新开始。

      请记住,如果您真的对函数一无所知,那么就不需要解决方案。

      【讨论】:

      • 这解决了问题的问题,但不是它的意思。听起来问题应该是 F_1(A) + F_2(B) + ...
      【解决方案5】:

      ALGENCAN(TANGO 的一部分)真的很棒。还有 Python 绑定。

      http://www.ime.usp.br/~egbirgin/tango/codes.php - “一般非线性规划,根本不使用矩阵运算,因此能够以适中的计算机时间解决极大的问题。一般算法是增广拉格朗日类型...”

      http://pypi.python.org/pypi/TANGO%20Project%20-%20ALGENCAN/1.0

      【讨论】:

        【解决方案6】:

        Google OPTIF9 或 ALLUNC。我们将这些用于一般优化。

        【讨论】:

          【解决方案7】:

          您可以像其他人提到的那样使用标准搜索技术。在进行搜索时,您可以利用它进行一些优化。

          首先,你只需要解 A,B,C,D,因为 1-E = A+B+C+D。

          其次,你有F(A) = F(B) = F(C) = F(D),那么你可以搜索A。一旦你得到F(A),你就可以解决B,C,D如果可能的话。如果无法求解函数,则需要继续搜索每个变量,但现在搜索范围有限,因为 A+B+C+D

          如果您的搜索是离散且有限的,则上述优化应该可以很好地发挥作用。

          【讨论】:

            【解决方案8】:

            我会先尝试粒子群优化。它很容易实现和调整。请参阅 Wiki 页面。

            【讨论】: