MATLAB样条:沿y轴评估

时间:2012-10-25 19:23:57

标签: matlab spline

请参阅此图表以获取说明:before http://s9.postimage.org/cnu6tg30v/before.png。通过使用样条函数两次插值两条红色曲线。现在我需要找到水平位移,使蓝点与两条红色曲线对齐。结果必须如下所示:after http://s9.postimage.org/n9e25g9cf/after.png

是否可以找到属于某个给定y坐标的x坐标?然后这可以很容易地解决。

编辑:只是更改x和y轴没有帮助,因为样条曲线不会为两条曲线之一提供漂亮的曲线。

Edit2:我忘了提到时间很重要。我正在寻找一个非常快速的解决方案。

1 个答案:

答案 0 :(得分:1)

xBlueyBlue为蓝点的坐标(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}}