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

我目前有这个function:

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 …],从Lagrange函数中获取一个数组。 然后找到这个函数的三个最低值? 然后获取与值对应的键? 我该怎么办?

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

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

 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 GetMinIndices(int[] ys) { var minIndices = new List(); 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。

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

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

大多数根发现方法都在更广泛的CS搜索主题中有堂兄弟。 如果您想要一个非常快速和肮脏的方法,或者您有一个非常大的搜索空间,请考虑像模拟退火这样的东西。 找不到所有的最小值,但是编码速度快,容易。