只需使用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
希望這有助於!
謝謝,我同意這將是一個更好的方式來評估衍生物在大量的值,但這不是我想要做的。我想直接根據三次係數找到最大值。 –
爲了理解你想要做什麼:因爲樣條線是分段定義的,所以你需要取每個樣條線段的係數並計算其頂點,然後選擇這些頂點的最大值?我不確定它們是否以這種方式工作,因爲它們是參數('x,y = f(p)')而不是笛卡爾('x = f(y)') – heltonbiker
如果您不想創建巨大候選點陣列,但想要爲每個局部最大值找到ACTUAL峯值(而不是當實際峯值位於兩個插值點之間時的近似值),則可以採用兩種方法:1)插值一個常量值知道有一個最大值,或一些最大值。然後,使用二分法或類Newton-Raphson方法迭代地在所需點周圍細化此插值; 2)找到最大值附近的三個點,然後執行拋物線插值。 – heltonbiker