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

本文关键字:函数 最小值 查找 循环 | 更新日期: 2023-09-27 18:35:18

我目前有这个函数:

    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...从视觉上看,它意味着 Wolfram alpha 提供的曲线。

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

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

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

我已经有

一段时间没有上过数值方法课了,所以请耐心等待。 简而言之,有许多方法可以搜索函数的根,并且根据你的函数是什么(连续的?可微分的?),你需要选择一个合适的。

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

大多数根查找方法在更广泛的CS主题"搜索"中都有表亲。 如果你想要一个非常快速和肮脏的方法,或者你有一个非常大的搜索空间,请考虑模拟退火之类的东西。 不能保证找到所有最小值,但编码快速简便。

假设你只是想"蛮力"地计算到一定的精确水平,你需要你的算法基本上找到两个邻居都大于循环当前值的任何值。

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

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。