我需要最小化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()的更多信息。用户选择或甚至提供这些功能。如果用户提供数据,我将函数作为一组点。我可以进行插值以在线上的任何点获得非常好的数值导数,但这就是它。以前的开发人员认为最小化是找到比特币的最常用方法。我还在试图弄清楚他是否正确。
答案 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科学图书馆具有我需要的最小化功能,所以我正在整合它。提供的答案非常好,但在我的案例中,它们并不是最好的解决方案。很大程度上是因为我没有说清楚问题。