我的数据总是在二次多项式(二次函数)上。我想尽可能准确地找到插值函数的峰值。
到目前为止,我一直在使用interp1d
,然后使用linspace
和简单的for
循环提取峰值。虽然您可以在linspace
中使用大量新生成的样本,但使用拟合多项式的导数仍然可以更精确。
我没有找到使用{{1}的方法}。
现在我发现唯一返回拟合多项式系数的函数是interp1d
,但这个拟合函数非常不准确(大多数情况下函数甚至不通过数据点)。 / p>
我尝试使用polyfit
并且拟合函数似乎非常准确,并且获得衍生样条及其根非常简单。
其他多项式拟合函数(UnivariateSpline
,BarycentricInterpolator
,...)表明它们不是出于数值稳定性而计算多项式系数。
KroghInterpolator
及其衍生物有多准确,或者有更好的选择?
答案 0 :(得分:1)
如果您只需要找到二次多项式的最小值/最大值,为什么不这样做:
import matplotlib.pyplot as plt
from scipy.interpolate import KroghInterpolator
import numpy as np
x=range(-20,20)
y=[]
for i in x:
y.append((i**2)+25)
x=x[1::5]
y=y[1::5]
f=KroghInterpolator(x,y)
xfine=np.arange(min(x),max(x),.5)
yfine=f(xfine)
val_interp=min(yfine)
print val_interp
plt.scatter(x,y)
plt.plot(xfine, yfine)
plt.show()
答案 1 :(得分:0)
最后我和polyfit
一起去了。虽然拟合函数没有完全通过数据点,但最终结果仍然很好。从返回的系数中,我得到了峰值所需的x和y坐标。