3

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

对于感兴趣的,这里有一些更多的细节:

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

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

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

4

3 回答 3

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并检查它是否是最小值。即使梯度不是那么简单,您也可以手动解决问题并提供一个通用公式,如果f1f2遵循某种模式(例如,如果它们仅在参数方面有所不同)。

于 2014-02-05T07:55:49.173 回答
1

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

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

您知道曲线及其斜率,因此对于给定的曲线,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

于 2014-02-05T08:12:24.510 回答
1

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

于 2014-02-06T23:55:53.550 回答