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

これにより、傾きが減少する曲線の最小値が見つかります...ただし、この曲線を考えると、3つの最小値を見つける必要があります。

3つの最小値を見つけて、配列または個々の変数として出力するにはどうすればよいですか?この曲線は単なる例であり、反転する可能性がありますが、複数の変数を見つける必要があります。したがって、最初の分が見つかったら、変曲点を乗り越えて次の分を見つける方法を知る必要があります...:/

*ラグランジュ関数はここにあります。**すべての実用的な目的で、x ...を視覚的に入力すると、ラグランジュ関数はf(x)を返します。これは、wolframalphaによって提供される曲線を意味します。

*この難問の数学的な側面はここにあります。**

考えられる解決策は? x [1,1.1,1.2,1.3,1.4 ...]などの入力の配列を生成し、ラグランジュ関数から配列を取得します。次に、この関数の3つの最低値を見つけますか?次に、値に対応するキーを取得しますか?どうすればいいですか?

4

2 に答える 2

2

数値メソッドのクラスを受講してからしばらく経ちましたので、ご容赦ください。要するに、関数のルートを検索する方法はいくつかあり、関数が何であるか(連続?微分可能?)に応じて、適切なものを選択する必要があります。

あなたの問題については、おそらくニュートン法を使用して、関数の2次ラグランジュ多項式の根を見つけようとすることから始めます。このライブラリはテストしていませんが、オープンソースのニュートン法を実装するC#ベースの数値メソッドパッケージがCodePlexにあります。コードを掘り下げたい場合は、可能です。

求根法の大部分には、「検索」というより広範なCSトピックにいとこがいます。非常に迅速で汚いアプローチが必要な場合、または検索スペースが非常に大きい場合は、シミュレーテッドアニーリングのようなものを検討してください。すべての最小値を見つけることは保証されていませんが、コーディングは高速で簡単です。

于 2012-05-23T15:49:26.200 に答える
1

これを特定のレベルの精度で「ブルートフォース」計算しようとしていると仮定すると、基本的に、両方のネイバーがループの現在の値よりも大きい値を見つけるためのアルゴリズムが必要です。

これを単純化するために、数値の配列があり、3つの極小値のインデックスを見つけたいとしましょう。これを行うための簡単なアルゴリズムは次のとおりです。

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 に答える