3

少し前に、プログラムしたゲームに多項式近似を実装しました。

ニュートンのピラミッド法を使用しています。それを理解するのにかなりの時間がかかりましたが、私の解決策では二項係数を計算する必要があり、各累乗の最終係数のすべての係数を合計する必要があります(この問題の解決は二乗、立方体に似ているためです。項と二項係数の計算)

例:n個の生体用語からkを選び、それらを1つ追加すると 、a *(x + b)(x + c)(x + d)==> a * x ^ 3 + a * x^2
が乗算されます。 *(b + c + d)+ a * x(bc + bd + cd)+ a * b * c * d なので、b * c*dはb*cとb*dの1つのピックになります

私の質問は次のとおりです。すべての生物学的係数を計算することなく、ニュートンスキームを使用して多項式補間を計算する方法はありますか?

私のコード: https ://github.com/superphil0/Polynominterpolation/blob/master/PolynomInterpolation.java

それはかなりうまく機能しますが、あまりにも多くのポイントを与えると、すべてが合計されている用語の選択のためにかなり遅くなります

(私はこれを英語で説明するのが本当に苦手ですが、誰かが私が知りたいことを理解してくれることを願っています)

乾杯

4

1 に答える 1

1

この説明から判断すると、あなたの「ねずみ講」は多項式px)がpx)= c 0 +(xx 0)( c 1 +xx 1)( c 2 +(xx 2)( c 3 +(xx 3)(…( c n -1
+(xx n ‒1c n)…))))

これで、正規係数を後ろから再帰的に計算できます。
p n = cnから始めます

すべてのステップで、現在の多項式は次のように記述できます
。p k = c k +(xx kp k +1 = c k +(xx k)(b 0 + b 1 x + b 2 x 2 + …)
次に小さい多項式がすでに正準係数に変換されていると仮定します。

これで、p k + 1の係数biを使用してpkの係数aiを計算できます。厳密に言えば、aとbの代わりにインデックスを使用する必要がありますがこの方法の方が明確だと思います。では、次の多項式の正準係数は何ですか?

  • a 0 = c kx k b 0
  • a 1 = b 0x k b 1
  • a 2 = b 1x k b 2
  • …</li>

a係数を保持するために単一の配列を使用および再利用して、これをループで記述することができます。

double[] a = new double[n + 1]; // initialized to zeros
for (int k = n; k >= 0; --k) {
    for (int i = n - k; i > 0; --i)
        a[i] = a[i - 1] - x[k]*a[i];
    a[0] = c[k] - x[k]*a[0];
}
于 2012-11-17T23:47:41.263 に答える