C#:循环查找函数的最小值

时间:2012-05-23 14:50:58

标签: c# function math numerical-methods

我目前有这个功能:

    public double Max(double[] x, double[] y)
    {
        //Get min and max of x array as integer
        int xMin = Convert.ToInt32(x.Min());
        int xMax = Convert.ToInt32(x.Max());


        // Generate a list of x values for input to Lagrange

        double i = 2;
        double xOld = Lagrange(xMin,x,y);
        double xNew = xMax;
        do
        {
            xOld = xNew;
            xNew = Lagrange(i,x,y);
            i = i + 0.01;
        } while (xOld > xNew);

        return i;
    }

这将找到斜率减小的曲线上的最小值...但是,given this curve,我需要找到三个最小值。

如何找到三个最小值并将它们输出为数组或单个变量?这条曲线只是一个例子 - 它可以被反转 - 无论如何,我需要找到多个变量。因此,一旦找到第一分钟,它需要知道如何克服拐点并找到下一个......:/

* The Lagrange function can be found here。**出于所有实际目的,当我输入x时,拉格朗日函数将给出f(x)...在视觉上,它表示由wolfram alpha提供的曲线。

* The math-side of this conundrum can be found here。**

可能的解决方案? 生成一个输入数组,比如x [1,1.1,1.2,1.3,1.4 ...],从Lagrange函数中获取一个数组。然后找到这个函数的三个最低值?然后获取与值对应的键?我该怎么做?

2 个答案:

答案 0 :(得分:2)

自从我参加数学方法课以来已经有一段时间了,所以请耐心等待。简而言之,有a number of ways来搜索函数的根,并且根据你的函数是什么(连续?可微?),你需要选择一个合适的函数。

对于你的问题,我可能首先尝试使用Newton's Method来找到函​​数的二次拉格朗日多项式的根。我还没有测试过这个库,但CodePlex上有一个C# based numerical methods package,它实现了Newton的开源方法。如果你想挖掘代码,你可以。

大多数根发现方法在更广泛的CS搜索主题中都有表兄弟。如果您想要一个非常快速和肮脏的方法,或者您有一个非常大的搜索空间,请考虑Simulated Annealing之类的内容。找不到所有的最小值,但是编码速度快,容易。

答案 1 :(得分:1)

假设你只是试图“暴力”将其计算到一定程度的精确度,你需要你的算法基本上找到任何值,其中两个邻居都大于你的循环的当前值。

为了简化这一点,我们假设您有一组数字,并且您想要找到三个局部最小值的索引。这是一个简单的算法:

public void Test()
{
    var ys = new[] { 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 4, 5, 4 };
    var indices = GetMinIndices(ys);
}

public List<int> GetMinIndices(int[] ys)
{
    var minIndices = new List<int>();
    for (var index = 1; index < ys.Length; index++)
    {
        var currentY = ys[index];
        var previousY = ys[index - 1];
        if (index < ys.Length - 1)
        {
            var neytY = ys[index + 1];
            if (previousY > currentY && neytY > currentY) // neighbors are greater
                minIndices.Add(index); // add the index to the list
        }
        else // we're at the last index
        {
            if (previousY > currentY) // previous is greater
                minIndices.Add(index);
        }
    }
    return minIndices;
}

所以,基本上,你传入你为输入数组(xs)计算的函数结果数(ys)(未显示)。你从这个函数得到的是最小指数。因此,在此示例中,您将返回8,14和17。