2D函数最小化算法或C / C ++库

时间:2014-02-05 05:37:52

标签: c++ c optimization minimization

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

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

我实际上试图找到一条线来最小化两个1D函数之间的点,AKA是比特。一维功能通常看起来像抛物线,它们在某些时候交叉。交叉点使得点的X最小化,并且我想找到一条与抛物线相切的线,该线在该X处使Y最小化。

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

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

3 个答案:

答案 0 :(得分:1)

我知道你想要minimize g(f1(x),f2(y)) = h(x,y)。 Downhill Simplex可能是您问题的一个很好的解决方案,因为如果您有NR,它可以直接实施。另一种可能的方法可能是Broyden的方法。但是,既然你有衍生品,你也可以使用算法来展示这些信息。对于例如共轭梯度法在NR(或至少NR3)中有一个实现。

如果你能提供 grad(h) 非常简单,那就是 grad(h)[1] ,具体取决于一个和 {{1}在其他变量上, grad(h)[2] 可能最容易解决,并检查它是否是最小值。即使渐变不是那么简单,您也可以手动解决问题 并提供一个通用公式,如果 grad(h) = 0 和< em> f1 遵循某种模式(例如,如果他们只是参数不同)。

答案 1 :(得分: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

答案 2 :(得分:1)

Gnu科学图书馆具有我需要的最小化功能,所以我正在整合它。提供的答案非常好,但在我的案例中,它们并不是最好的解决方案。很大程度上是因为我没有说清楚问题。