【问题标题】:2D Function Minimization Algorithm or C/C++ library2D 函数最小化算法或 C/C++ 库
【发布时间】:2014-02-05 05:37:52
【问题描述】:

我需要最小化 2D function f(x,y)。我已经使用Brent's Method 进行了1-D 最小化(类似于寻找根的二分搜索。)我认为2D 版本将是一个非常简单、常见的问题,它会有很多好的算法和库,但我没有没有找到。我正在考虑只使用Downhill Simplex from Numerical Recipes,但我认为可能有一个更简单的2D,或者一个方便的库。

有兴趣的可以看一下详情:

我实际上是在尝试找到一条最小化两个 1D 函数之间的点的线,也就是双切线。一维函数通常看起来像抛物线,它们在某个点交叉。交叉点给出了要最小化的点的 X,我想找到一条与抛物线相切的线,使 Y 在该 X 处最小化。

所以,我真的是minimizing g( f1(x1), f2(x2) )

很遗憾,我没有关于 f1() 和 f2() 的更多信息。功能由用户选择,甚至由用户提供。如果用户提供数据,我将函数作为一组点。我可以进行插值以在线上的任何点获得一个非常好的数值导数,但仅此而已。之前的开发人员认为最小化是找到双切线的最通用方法。我仍在试图弄清楚他是否正确。

【问题讨论】:

  • 您需要提供有关 f1() 和 f2() 的更多信息。 “一般看起来像抛物线”不是很精确。 Simplex 对其适用的功能非常严格。
  • 这个问题陈述有问题:两条曲线的切线是唯一的,没有什么可以最小化的! (我的猜测:双切线是最小化纵坐标的线 - 对于任何 X。)
  • 我编辑了一些细节。希望现在更清楚了。

标签: c++ c optimization minimization


【解决方案1】:

我知道你想minimize g(f1(x),f2(y)) = h(x,y)。 Downhill Simplex 可能是解决您问题的好方法,因为如果您有 NR,它很容易实现。另一种可能的方法可能是 Broyden 的方法。但是,由于您有导数,因此您也可以使用利用该信息的算法。例如共轭梯度法在NR(或至少NR3)中有一个实现。

如果您可以提供 grad(h) 非常简单,即 grad(h)[1] 取决于一个和 grad(h)[2]另一个变量,可能最容易解决 grad(h) = 0 并检查它是否是最小值。即使渐变不是那么简单,您也可以手动解决问题,并提供一个通用公式,如果 f1 f2 遵循特定模式(例如,如果它们仅在参数方面有所不同)。

【讨论】:

    【解决方案2】:

    共轭梯度最小化可能会做到。

    但您的问题也可以表述为两个未知数的两个方程组。

    您知道曲线及其斜率,因此对于给定的 X1,您可以找到纵坐标 Z1(X1),其中曲线 1 的切线与通过 X 的垂直线相交。同样Z2(X2)。同时考虑垂线与通过两个切点的直线的交点纵坐标Z(X1, X2)

    Z1(X1) = Y1(X1) + Y1'(X1).(X1 - X)
    
    Z2(X2) = Y2(X2) + Y2'(X2).(X2 - X)
    
    Z(X1, X2) = ((X1 - X).Y2(X2) - (X2 - X).Y1(X1)) / (X1 - X2)
    

    您现在必须解决Z1(X1) = Z2(X2) = Z(X1, X2),可能使用与您用于查找X 值相同的方法。

    【讨论】:

    • 这将找到双切线解决方案(请参阅我对问题的评论)。
    【解决方案3】:

    Gnu 科学图书馆有我需要的最小化功能,所以我正在集成它。提供的答案非常好,但在我的情况下,它们并不是最好的解决方案。很大程度上是因为我没有足够清楚地说明问题。

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多