Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:寻找函数极小值的循环_C#_Function_Math_Numerical Methods - Fatal编程技术网

C#:寻找函数极小值的循环

C#:寻找函数极小值的循环,c#,function,math,numerical-methods,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 inpu

我目前拥有以下功能:

    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;
    }
这将找到斜率递减曲线上的最小值…然而,我需要找到三个最小值

如何找到三个最小值并将其作为数组或单个变量输出?这条曲线只是一个例子——它可能是倒转的——不管怎样,我需要找到多个变量。因此,一旦找到第一个min,就需要知道如何越过拐点并找到下一个…:/

**出于所有实际目的,当我输入x时,拉格朗日函数将给出f(x)。直观地说,它表示wolfram alpha提供的曲线

***

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

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

为了简化这个过程,假设你有一个数字数组,你想找到三个局部极小值的指数。下面是一个简单的算法:

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;
}
公共无效测试()
{
var ys=新[]{1,2,3,4,5,4,3,2,1,2,3,4,5,4,3,4,5,4};
var指数=获取最小值(ys);
}
公共列表获取索引(int[]ys)
{
var minIndices=新列表();
对于(var index=1;indexcurrentY&&neytY>currentY)//邻居更大
minIndices.Add(index);//将索引添加到列表中
}
否则//我们将进入最后一个索引
{
if(previousY>currentY)//previous大于
添加(索引);
}
}
返回最小值;
}

因此,基本上,您传入为输入数组(xs)(未显示)计算的函数结果数组(ys)。从这个函数得到的是最小索引。所以,在这个例子中,你得到了8、14和17。我已经有一段时间没有上数值方法课了,请耐心听我说。简而言之,要搜索函数的根,需要根据函数的性质(连续?可微?)选择一个合适的根

对于你的问题,我可能会首先尝试用它来找到函数的二次拉格朗日多项式的根。我还没有测试过这个库,但是有一个开放源码的CodePlex上实现了Newton方法。如果你想深入研究代码,你可以


大多数根查找方法在更广泛的CS主题“搜索”中都有相似之处。如果你想要一个非常快速和肮脏的方法,或者你有很大的搜索空间,考虑一些类似的东西。不能保证找到所有的最小值,但它可以快速且容易地编写代码。

我不确定这是否是一个编程问题。不管怎样,拉格朗日是什么?注释行是怎么回事?那么您已经找到了全局最小值,现在正在寻找?您需要首先回答如何从数学上确定答案的问题(在编程领域之外)在您确定如何编程计算机来计算它之前。每个最小值都有两个具有较大Y值的邻居。@MarkoJuvančič您还需要检查端点dnm,我感谢您的回答。我是编程新手,所以我会从更多的信息和/或示例中受益匪浅。太好了!还有一件事…我需要忽略回路中的负y值(因为返回的电压都是正的,但插值函数可能会呈现一些负值)…我该怎么做?我现在正在玩弄你的代码!换言之:如果y值为零,它仍然需要作为最小值进行索引,但它需要忽略小于零的值。棘手?如果您只需要过滤
ys
以在找到最小值之前删除负数,那么您所需要做的就是使用System.Linq位于代码文件的顶部,然后执行
var nonNegativeYs=ys。其中(y=>y>=0)