3

scipyを使用してフィッティングされたスプラインのピーク曲率を見つけるにはどうすればよいですか? (実際には、ピーク秒微分で十分です)

tck1dxsysベクトルを使用して、次のように値を計算しました。

tck = splrep(xs, ys, s=0)

x選択した任意の場所で 2 階微分を評価できることはわかっています。

ddy = splev([x], tck, 2)

したがって、 の多くの値をループしてx、曲率を計算し、最大値を取ることができます。tckしかし、個々の 3 次関数の係数を取得するためにの値を解釈して、ピーク曲率を直接計算したいと思います。しかし、tckかなり不透明に見えます - どうすれば3次関数係数を抽出できますか?

4

1 に答える 1

0

関数でderキーワード引数を使用するだけです。splev

ddy = splev(X, tck, der=2)

の多くの値をループしないでください。代わりに、評価したいすべての値を含むxNx1 配列を作成して、シーケンスに入れなければならない個々の値の代わりに値の配列を取得するようにしてください。X

また、結果をデバッグする方法として、結果をプロットすることを強くお勧めします。プロットが理にかなっている場合、期待どおりに機能している可能性が高くなります (そうでない場合は、確実に機能していません)。

編集: X を使用した補間で近似値が得られ、TRUE の最大値が必要な場合は、スプラインが局所的に滑らかであることを考慮して、最大値 (局所補間された最大値とその近傍) を定義する 3 つの点の放物線補間を使用できます。

def parabolic_interpolation(p1, p2, p3):
    x1, y1 = p1
    x2, y2 = p2
    x3, y3 = p3

    denom = (x1-x2)*(x1-x3)*(x2-x3);
    a = (x3*(y2-y1)+x2*(y1-y3)+x1*(y3-y2))/denom
    b = (x3*x3*(y1-y2)+x2*x2*(y3-y1)+x1*x1*(y2-y3))/denom
    c = (x2*x3*(x2-x3)*y1+x3*x1*(x3-x1)*y2+x1*x2*(x1-x2)*y3)/denom

    xv = -b/(2*a)
    yv = c-b**2/(4*a)

    return (xv, yv)  # coordinates of the vertex

お役に立てれば!

于 2012-11-27T18:58:55.653 に答える