2012-11-27 154 views
3

如何找到使用scipy擬合的樣條曲線的峯值曲率? (實際上,峯值第二差就足夠了)Scipy樣條曲線的峯值曲率

我計算了tck值如下,用我的1D xsys載體:

tck = splrep(xs, ys, s=0) 

我知道我可以在任何x評估第二差我的選擇:

ddy = splev([x], tck, 2) 

所以,我可以遍歷的x多值,計算曲率和取最大值。但我傾向於解釋tck中的值以獲得各個三次函數的係數,從而直接計算峯值曲率。然而,tck顯得相當不透明 - 我如何從中提取三次函數係數?

回答

0

只需使用der關鍵字參數上splev功能:

ddy = splev(X, tck, der=2) 

和preferrably不遍歷的x很多值,而不是讓包含要評估每個值NX1陣列X,以取回一組數值而不是個人值,無論如何你必須把它放在一個序列中。

此外,將您的結果作爲調試方式極其值得推薦。如果情節是有意義的,那麼事情就很有可能發揮作用(如果不是,他們肯定不會如你所期望的那樣工作)。

編輯:如果使用X的插值只給出近似值並且您希望TRUE最大值,則可以使用定義最大值(局部插值最大值及其鄰居)的三個點的拋物線插值,考慮樣條線本地平滑:

def parabolic_interpolation(p1, p2, p3): 
    x1, y1 = p1 
    x2, y2 = p2 
    x3, y3 = p3 

    denom = (x1-x2)*(x1-x3)*(x2-x3); 
    a = (x3*(y2-y1)+x2*(y1-y3)+x1*(y3-y2))/denom 
    b = (x3*x3*(y1-y2)+x2*x2*(y3-y1)+x1*x1*(y2-y3))/denom 
    c = (x2*x3*(x2-x3)*y1+x3*x1*(x3-x1)*y2+x1*x2*(x1-x2)*y3)/denom 

    xv = -b/(2*a) 
    yv = c-b**2/(4*a) 

    return (xv, yv) # coordinates of the vertex 

希望這有助於!

+0

謝謝,我同意這將是一個更好的方式來評估衍生物在大量的值,但這不是我想要做的。我想直接根據三次係數找到最大值。 –

+0

爲了理解你想要做什麼:因爲樣條線是分段定義的,所以你需要取每個樣條線段的係數並計算其頂點,然後選擇這些頂點的最大值?我不確定它們是否以這種方式工作,因爲它們是參數('x,y = f(p)')而不是笛卡爾('x = f(y)') – heltonbiker

+0

如果您不想創建巨大候選點陣列,但想要爲每個局部最大值找到ACTUAL峯值(而不是當實際峯值位於兩個插值點之間時的近似值),則可以採用兩種方法:1)插值一個常量值知道有一個最大值,或一些最大值。然後,使用二分法或類Newton-Raphson方法迭代地在所需點周圍細化此插值; 2)找到最大值附近的三個點,然後執行拋物線插值。 – heltonbiker