1

C# で B-Splines の再帰的な定義を実装しようとしていますが、うまくいきません。これが私がやったことです:

public static Double RecursiveBSpline(int i, Double[] t, int order, Double x)
{
    Double result = 0;

    if (order == 0)
    {
        if (t[i] <= x && x < t[i + 1])
        {
            result = 1;
        }
        else
        {
            result = 0;
        }
    }
    else
    {
        Double denom1, denom2, num1, num2;

        denom1 = t[i + order + 1] - t[i + 1];
        denom2 = t[i + order] - t[i];

        if (denom1 == 0)
        {
            num1 = 0;
        }
        else
        {
            num1 = t[i + order + 1] - x / denom1;
        }

        if (denom2 == 0)
        {
            num2 = 0;
        }
        else
        {
            num2 = x - t[i] / denom2;
        }

        result = num1 * RecursiveBSpline(i + 1, t, order - 1, x) 
            + num2 * RecursiveBSpline(i, t, order - 1, x);
    }

    return result;
}

そして、これが私が関数を呼び出す方法です:

Double[] vect = new Double[] { 0, 1, 2, 3 };

MessageBox.Show(BSpline.RecursiveBSpline(0,vect,2,0.5).ToString());

画面には 0,125 が表示されるはずですが、代わりに 0,25 が表示されます。2 つの分母変数は、それらが 0 に等しいかどうかをチェックするために使用されます。0 に等しい場合は、定義により数値を 0 に設定する必要があります。誰かが私がこれを間違っているところを指摘できますか?

4

1 に答える 1