[英]MATLAB spline: evaluate along y axis
让xBlue
和yBlue
是蓝点(n乘1向量)的坐标,并yRedFun
是样条近似的功能,所以yRedFun(x)
将在返回内插红色线x
。 例如yRedFun
可以是匿名函数句柄@(x) ppval(pp,x)
。 也许您需要稍微推断一下红线,以便在所有xBlue上定义yRedFun。
现在我们可以定义一个最小化函数:
cost = @(deltaX) norm( yBlue - arrayfun(yRedFun, xBlue + deltaX) )
可以通过deltaX = fminsearch(cost, 0)
或deltaX = fzero(cost, 0)
deltaX = fminsearch(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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.