6

私は素敵な 3 次スプライン コードを持っていますが、それは補間専用です。少しだけ将来を推定する必要があります。これを行うためのライブラリではなく、優れたコードソースを知っている人はいますか?

これは、基本 (現在の ASM) で補間用に記述したコードです。

4

5 に答える 5

6

そのための新しいコードは必要ありません。

スプラインを外挿するには、最初と最後のスプラインのパラメーターを外挿できます。

既存のコード/ライブラリによっては、コードを変更しないと不可能な場合があります。その場合、ポイントのリストの先頭/末尾に他の 2 つのポイントを先頭/末尾に追加するだけです。最初/最後の 2 点間を線形補間することで、これらの 2 点を取得できます。

注意:ポイントの本来の意味によっては、特に統計データに関しては、外挿が完全に不適切な場合があります。その場合、回帰分析の使用を検討する必要があります。

于 2009-05-19T06:19:22.130 に答える
3

簡単にするために、3次ベジェ曲線を4つの点(A、B、C、D)として表します。ここで、AとDは曲線の端点であり、BとCは「制御ハンドル点」です。(実際の曲線は通常、コントロールハンドルポイントに接触しません)。

キュービックベジェ曲線のこの表現を他の一般的な表現に変換する方法については、 「ドンランカスターの達人の隠れ家キュービックスプラインライブラリ」を参照してください。

補間

1つの立方ベジェ曲線(P0、P1、P2、P3)が与えられた場合、De Casteljauのアルゴリズムを使用 して、ベジェ曲線を左半分と右半分に切り刻みます。これは、「乗算」命令がないマイクロコントローラーでも非常に簡単です。これは、中間点が得られるまで、いくつかの平均を計算するだけでよいためです。

P0
   F0 := average(P0, P1)
P1                       S0 := average(F0, F1)
   F1 := average(P1, P2)         Midpoint := average(S0, S1)
P2                       S1 := average(F1, F2)
   F2 := average(P2, P3)
P3

ベジェ曲線全体は(P0、P1、P2、P3)です。

そのベジェ曲線全体の左半分はベジェ曲線(P0、F0、S0、M)です。

そのベジェ曲線全体の右半分はベジェ曲線(M、S1、F2、P3)です。

多くのマイクロコントローラーは、各曲線が直線で近似できるほど小さくなるまで、各曲線をますます小さな小さな曲線に分割し続けます。

しかし、私たちは逆の方向に進みたいと考えています。より大きな曲線に外挿します。

外挿

左半分または右半分のいずれかが与えられた場合、これを逆に実行して元の曲線を復元できます。

元のポイントP1、P2、P3を忘れたと想像してみましょう。

ベジェ曲線の左半分(P0、F0、S0、M)が与えられると、次のように右に外挿できます。

S1 := M + (M - S0)
F1 := S0 + (S0 - F0)
P1 := F0 + (F0 - P0)

次に、それらの値を使用して計算します

F2 := S1 + (S1 - F1)
P2 := F1 + (F1 - P1)

そして最後に

P3 := F2 + (F2 - P2)

外挿されたバジエ曲線(P0、P1、P2、P3)を外挿して復元します。

詳細

外挿された曲線(P0、P1、P2、P3)は、元の曲線(P0、F0、S0、M)のすべての点を通過します。特に、P0から始まり、中点Mを通過します。 P3に到達します。

これらの4点が元々、より大きなベジェスプラインの左半分(または右半分)として計算されたかどうかに関係なく、任意の4点(P0、F0、S0、M)からいつでも外挿できます。

あなたはすでにこれを知っていると確信していますが、明確にするために:

Midpoint = average(F0, F1)

「点F0とF1のちょうど中間点を見つける」という意味です。つまり、

Midpoint.x = (F0.x + F1.x)/2
Midpoint.y = (F0.y + F1.y)/2
Midpoint.z = (F0.z + F1.z)/2

表現

S1 := M + (M - S0)

「一方の端がS0にあり、中点がMにある線分が与えられた場合、S0から開始し、S1でもう一方の端に到達するまで、Mを過ぎて直線で走ります。つまり、適切な場合を除きます。ベクトルライブラリ)3行のコード

S1.x := M.x + (M.x - S0.x)
S1.y := M.y + (M.y - S0.y)
S1.z := M.z + (M.z - S0.z)

。(2Dを実行している場合は、すべての「z」をスキップします。常にゼロです)。

于 2011-06-22T03:32:34.223 に答える
2

その質問を少し拡張する必要があります。また、「3 次スプライン」は非常に広い用語です。

スプラインに興味がある場合は、Carl de Boors の「A Practical Guide to Splines」を心からお勧めします。ただし、少し数学指向ですが、コード例が含まれています (著者のホームページからダウンロードできます)。「3次スプライン」のグーグルとウィキは、おそらく特定の言語でさえ、いくつかの例をもたらすことができます-質問に追加するもう1つのこと(コードを探している場合)。

外挿とカーブ フィッティングに興味がある場合は、それらをグーグルで検索すると役立ちます。Matlab パッケージには、非常に優れたカーブ フィッティング ツールボックスがあります。ウィキペディアには、役立つ参考文献へのリンクがいくつかあります

本当に、それは広すぎる質問で、答えを推測することさえできません.

また、正確に何をしようとしているのか説明できますか? どのようなデータですか?なんでも ?


Edit1:ここで、これを試してください:ここで何か役に立つものを見つけることができます-リンク

于 2009-05-19T06:17:27.280 に答える
1

一般に、スプライン補間では、変数 t を使用して線を補間します。0 <= t <= 1 である限り、補間しています。ただし、t < 0 または t > 1 の場合は、単にスプラインを外挿しています。

于 2009-05-19T06:18:31.193 に答える
1

要求されたコードの要件をより適切に記述する必要があります。スプラインは通常、固定データセットを使用して未知の関数または複雑な関数を補間するために使用されます。このデータセットの境界外で関数の値を推定したい場合は、スプラインを使用しないでください。

スプラインが、実際に値を評価したい場所で定義された関数である場合 (キュービックであり、ピースワイズ キュービックではない)、既にその値を評価できます。

補間範囲外でスプラインを評価する機能を持ちたいが、補間範囲内で同じ値を持つ区分的 3 次関数のままにしておく場合は、いくつかのノードでスプライン範囲を拡張し、評価値のロジックをいくつかのノードに追加する必要があります。新しいノード(たとえば、スプラインを連続関数にするだけでなく、いくつかの一次導関数も連続関数にする必要があります)

本当に必要なものが元のデータセットのポイントからそれほど遠くない単一の値である場合は、ラグランジュ多項式の使用など、外挿に適したアルゴリズムを使用することをお勧めします。

于 2009-05-19T06:33:23.497 に答える