请参阅此图表以获取说明:before http://s9.postimage.org/cnu6tg30v/before.png。通过使用样条函数两次插值两条红色曲线。现在我需要找到水平位移,使蓝点与两条红色曲线对齐。结果必须如下所示:after http://s9.postimage.org/n9e25g9cf/after.png。
是否可以找到属于某个给定y坐标的x坐标?然后这可以很容易地解决。
编辑:只是更改x和y轴没有帮助,因为样条曲线不会为两条曲线之一提供漂亮的曲线。
Edit2:我忘了提到时间很重要。我正在寻找一个非常快速的解决方案。
答案 0 :(得分:1)
让xBlue
和yBlue
为蓝点的坐标(n-by-1向量),yRedFun
为样条近似函数,因此yRedFun(x)
将x
返回yRedFun
处的插值红线。例如。 @(x) ppval(pp,x)
可以是匿名函数句柄cost = @(deltaX) norm( yBlue - arrayfun(yRedFun, xBlue + deltaX) )
。也许您需要稍微外推红线,以便在所有xBlue上定义yRedFun。
我们现在可以定义最小化函数:
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);
点并丢弃所有其他点。这也将提高性能。
{{1}}