繁体   English   中英

MATLAB样条线:沿y轴求值

[英]MATLAB spline: evaluate along y axis

请参见此图以获取插图: 之前 使用样条函数两次对两条红色曲线进行插值。 现在,我需要找到将蓝点与两条红色曲线对齐的水平移位。 结果必须如下所示: 后

是否可以找到属于某个样条曲线的y坐标的x坐标? 这样就可以很容易地解决。

编辑:简单地更改x和y轴无济于事,因为比样条曲线不能为两条曲线之一给出漂亮的曲线。

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

xBlueyBlue是蓝点(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM