4

我目前有这个功能:

    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;
    }

这将在斜率减小的曲线上找到最小值......但是,鉴于这条曲线,我需要找到三个最小值。

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

*拉格朗日函数可以在这里找到。** 出于所有实际目的,当我输入 x 时,拉格朗日函数会给我 f(x)...在视觉上,它表示由 wolfram alpha 提供的曲线。

*这个难题的数学方面可以在这里找到。**

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

4

2 回答 2

2

自从我上数值方法课程以来已经有一段时间了,所以请耐心等待。简而言之,有多种方法可以搜索函数的根,并且根据您的函数是什么(连续的?可微分的?),您需要选择一种合适的方法。

对于您的问题,我可能首先尝试使用牛顿法为您的函数找到二阶拉格朗日多项式的根。我还没有测试过这个库,但是 CodePlex 上有一个基于 C# 的数值方法包,它实现了开源的牛顿法。如果你想挖掘代码,你可以。

大多数根查找方法在更广泛的 CS 主题“搜索”中都有表亲。如果您想要一个非常快速和肮脏的方法,或者您有一个非常大的搜索空间,请考虑类似Simulated Annealing。无法保证找到所有最小值,但它可以快速且易于编码。

于 2012-05-23T15:49:26.200 回答
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。

于 2012-05-23T15:00:48.103 回答