簡體   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