0

説明については、次のグラフを参照してください前 。2つの赤い曲線は、スプライン関数を2回使用して補間されます。次に、青い点を2つの赤い曲線に揃える水平シフトを見つける必要があります。結果は次のようになります後

スプラインの特定のy座標に属するx座標を見つけることは可能ですか?そうすれば、これは非常に簡単に解決できます。

編集:スプラインが2つの曲線のいずれかに適切な曲線を与えないため、x軸とy軸を変更するだけでは役に立ちません。

Edit2:時間が重要だと言うのを忘れました。私は非常に速い解決策を探しています。

4

1 に答える 1

1

xBlueとを青い点( nyBlue行1列のベクトル)の座標としyRedFun、をスプライン近似関数とするyRedFun(x)と、で補間された赤い線が返されxます。たとえばyRedFun、無名関数ハンドルの場合があります@(x) ppval(pp,x)。yRedFunがすべてのxBlueで定義されるように、赤い線を少し外挿する必要があるかもしれません。

ここで、最小化関数を定義できます。

cost = @(deltaX) norm( yBlue - arrayfun(yRedFun, xBlue + deltaX) )

deltaX = fminsearch(cost, 0)その最小値はまたはで見つけることができますdeltaX = fzero(cost, 0)

これはあまりにも一般的なアプローチかもしれませんが、高速なパフォーマンスが必要ない場合は問題ありません。また、青と赤の適合はおそらく正確ではないため、この方法は最小化しようとしている基準を形式化します。


パフォーマンスが必要な場合は、次のアルゴリズムを使用できます。

function deltaX = findDeltaX(xBlue, yBlue, yRedFun, precision)
    deltaX = 0;         % total delta
    deltaDeltaX = Inf;  % delta at each iteration
    yRedFunDer = fnder(yRedFun);

    while(abs(deltaDeltaX) > precision)
        xRed = xBlue + deltaX;
        yRed = fnval(yRedFun, xRed);
        yRedDer = fnval(yRedFunDer, xRed);

        deltaDeltaX = yRedDer \ (yRed - yBlue);

        deltaX = deltaX + deltaDeltaX;
    end
end

デリバティブが低いポイントは、精度を低下させる可能性があります。最初の反復では、導関数が最も高いポイントを選択Nし、他のすべてのポイントを削除できます。これにより、パフォーマンスも向上します。

[~, k] = sort(abs(yRedDer), 'descend');  
k = k(1:N);  
yRedDer = yRedDer(k);
xBlue = xBlue(k);  
yBlue = yBlue(k);  
于 2012-10-26T00:34:06.637 に答える