7

scipy のinterpolate.splprep関数を使用してパラメータuでパラメトリック スプラインを取得しますが、のドメインはuスプラインの線積分ではなく、入力座標の区分的線形接続です。を試してみましintegrate.splintたが、それは個々の積分が を超えるだけuです。明らかに、デカルト微分距離の束を数値的に統合できますが、見落としていたスプラインまたはスプラインセグメントの長さを取得するための閉じた形式の方法があるかどうか疑問に思っていました (scipy または numpy を使用)。

編集:閉じた形式のソリューション、または機械精度の回答に収束する非常に高速な方法を探しています。私は数値的な根を見つける方法をほとんどあきらめており、現在は主に閉じた形式の回答を求めています。誰かが楕円関数を統合した経験があるか、(Wolfram 以外の) 良いリソースを教えてくれるなら、それは素晴らしいことです。

Maxima を試して、スプラインの 1 つのセグメントの関数であると私が信じているものの不定積分を取得しようとします: これをMathOverflowにクロス投稿しました

4

2 に答える 2

6

x と y の両方が 3 次パラメトリック関数であるため、単純な関数に関して閉じた解はありません。数値積分は進むべき道です。円弧の長さの表現を統合するか、単純に線分の長さを追加するかは、求めている精度とどれだけの努力をしたいかによって異なります。

正確で高速な「線分の長さを追加する」方法:

recurvise subdivision (de Casteljeau のアルゴリズムの一種) を使用してポイントを生成すると、最小限のポイント数で非常に正確な表現が得られます。基準を満たさない場合にのみ、サブディビジョンをサブディビジョンします。通常、基準はコントロール ポイント (船体またはケージ) を結合する長さに基づいています。キュービックの場合、通常、P0P1+P1P2+P2P3 の近さを P0P3 と比較します。ここで、P0、P1、P2、および P3 は、ベジェを定義するコントロール ポイントです。

ここでいくつかの Delphi コードを見つけることができます: リンク テキスト

Python への変換は比較的簡単です。それはポイントを生成します。基準をテストするために、コードはすでにセグメントの長さを計算しています。途中でこれらの長さの値を単純に累積できます。

于 2010-02-02T08:42:57.230 に答える
4

scipy.interpolate.splevで導関数と座標を計算する関数sqrt(x'(u)**2+y'(u)**2)を overに統合できます。統合は、scipy.integrateのルーチンの 1 つを使用して実行できます( [Clenshaw-Curtis] は正確であり、一般的に高速です)。これは、より正確であり、多くの小さな距離を合計するよりもおそらく高速です (これは、長方形ルールとの統合に相当します)。ux'y'quadromberg

于 2010-02-02T13:10:25.810 に答える