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);