2016-09-05 45 views
2

我用interp1d适合三次样条,但遇到一些memmory问题,所以按照以下question我已切换到使用InterpolatedUnivariateSpline。但是,我注意到在结果函数之间存在一些(非常)小的差异。因此我的问题是;稍有不同的结果interp1d

答:根据这个answer,据我所知它与底层方法(使用FITPACK或不)有什么不同。但是,如果底层数学不一样?

B.是否有可能使用InterpolatedUnivariateSpline重新生成interp1d结果(更改平滑样条函数的程度或边界只会使两个图形更加不同)?

最小代码重现的细微差别:

from scipy.interpolate import interp1d 
from scipy.interpolate import InterpolatedUnivariateSpline 
import matplotlib.pyplot as plt 
import matplotlib 
import numpy 

x = [916.03189697265634, 916.0718969726563, 916.11189697265627, 916.15189697265623, 916.1918969726562, 916.23189697265627, 916.27189697265624, 916.31189697265631, 916.35189697265628, 916.39189697265624, 916.4318969726562, 916.47189697265628, 916.51189697265625, 916.55189697265632, 916.59189697265629, 916.63189697265625, 916.67189697265621, 916.71189697265618] 
y = [893483.0, 2185234.0, 3903053.0, 4264327.0, 3128900.0, 1374942.0, 554350.0, 442512.0, 414232.0, 403098.0, 413778.0, 264185.0, 363063.0, 473762.0, 452284.0, 526806.0, 461402.0, 424270.0] 
newX = numpy.linspace(x[0],x[-1],2500*(x[-1]-x[0])) 

f_interp1d = interp1d(x,y, kind='cubic') 
f_Univariate = InterpolatedUnivariateSpline(x,y) 
yINTER = f_interp1d(newX) 
yUNIVAR = f_Univariate(newX) 
fig = plt.figure() 
ax = fig.add_subplot(111) 
plt.plot(x,y,'b*') 
plt.plot(newX,yINTER,'r--') 
plt.plot(newX,yUNIVAR,'g--') 
plt.legend(['Raw Data','Interp1d','Univariate Spline'],loc='best') 
plt.show() 

产生下列图表(貌似精细):

enter image description here

然而,鉴于一个靠近显示是有区别的:

enter image description here

回答

0

我发现主要区别在于InterpolatedUnivariateSpline尝试执行连续拟合,而立方interp1d应用分段拟合。

我现在想出的唯一解决方案是确保两个函数只使用4个数据点(在最高数据点附近),因为这两个函数都会产生单个解决方案(而不是单个解决方案与使用5个数据点的两个部分解决方案相比)。

片段:

# Strip top point 
maxInt = 0 
for index,i in enumerate(y): 
    if i > maxInt: 
     maxInt = i 
x_sub = x[y.index(maxInt)-2:y.index(maxInt)+2] 
y_sub = y[y.index(maxInt)-2:y.index(maxInt)+2] 
newX = numpy.linspace(x_sub[0],x_sub[-1],2500*(x_sub[-1]-x_sub[0])) 

f_interp1d = interp1d(x_sub,y_sub, kind='cubic') 
f_Univariate = InterpolatedUnivariateSpline(x_sub,y_sub) 
yINTER = f_interp1d(newX) 
yUNIVAR = f_Univariate(newX) 
fig = plt.figure() 
ax = fig.add_subplot(111) 
plt.plot(x,y,'b*') 
plt.plot(newX,yINTER,'r--') 
plt.plot(newX,yUNIVAR,'g--') 
plt.legend(['Raw Data','Interp1d','Univariate Spline'],loc='best') 
plt.show() 

这产生下列图表(缩小):

enter image description here

特写示出了这两种功能真正是 '相同':

enter image description here

H不过,我仍然希望有一个更好的方法来强制这两个职能产生类似的行为。