[英]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.